현재 저는 OpenGL ES 2.0에서 간단한 포인트 라이트를 포함해야하는 쉐이더를 작성하려고하고 있습니다 만, 그다지 효과적이지 않습니다.OpenGL ES 2.0 포인트 라이트 쉐이더
내 자신의 작은 SceneGraph를 만들었으며 각 개체 (현재 상자 만 해당)는 자체 번역/회전/비율 및 렌더링이 잘 작동 할 수 있습니다. 각 상자는 자체 modelView 및 법선 행렬을 할당하며 모두 동일한 투영 행렬을 사용합니다.
각 객체에 대해 매트릭스와 조명 위치를 쉐이더에 유니폼으로 전달합니다.
개체가 회전하지 않으면 조명이 제대로 작동하지만 개체가 회전하자마자 빛이 같은 위치에 머무르지 않고 개체와 함께 회전하는 것처럼 보입니다.
다음은 몇 가지 코드입니다. 먼저 생성 행렬 :
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f);
GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, 0.0f);
각 노드는 변환/회전/스케일을 포함하는 자신의 변환 행렬을 계산하고 modelViewMatrix 함께 승산 :
가modelViewMatrix = GLKMatrix4Multiply(modelViewMatrix, transformation);
이 행렬이에 전달 셰이더에 저장되고 개체가 렌더링 된 후에는 이전 행렬이 복구됩니다.
GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(modelViewMatrix), NULL);
버텍스 셰이더 :
attribute vec4 Position;
attribute vec2 TexCoordIn;
attribute vec3 Normal;
uniform mat4 modelViewProjectionMatrix;
uniform mat4 modelViewMatrix;
uniform mat3 normalMatrix;
uniform vec3 lightPosition;
varying vec2 TexCoordOut;
varying vec3 n, PointToLight;
void main(void) {
gl_Position = modelViewProjectionMatrix * Position;
n = normalMatrix * Normal;
PointToLight = ((modelViewMatrix * vec4(lightPosition,1.0)) - (modelViewMatrix * Position)).xyz;
// Pass texCoord
TexCoordOut = TexCoordIn;
}
단편 쉐이더 :
varying lowp vec2 TexCoordOut;
varying highp vec3 n, PointToLight;
uniform sampler2D Texture;
void main(void) {
gl_FragColor = texture2D(Texture, TexCoordOut);
highp vec3 nn = normalize(n);
highp vec3 L = normalize(PointToLight);
lowp float NdotL = clamp(dot(n, L), -0.8, 1.0);
gl_FragColor *= (NdotL+1.)/2.;
}
를 I는 PointToLight 잘못 계산 추측되지만 다음
정규 행렬 계산 나는 무엇이 잘못되었는지 알 수 없다.