2012-10-31 4 views
1

현재 저는 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 잘못 계산 추측되지만 다음

정규 행렬 계산 나는 무엇이 잘못되었는지 알 수 없다.

답변

3

나는 결국 무엇이 잘못되었는지 알아 냈습니다.

PointToLight = ((viewMatrix * vec4(lightPosition,1.0)) - (viewMatrix * modelMatrix * Position)).xyz; 

이 지금은 잘 작동 :

대신 modelViewMatrix으로 lightPosition을 곱하여의, 난 그냥 단지 상자 카메라의 변환이 아닌 변환을 포함 viewMatrix, 그것을 곱해야 .