GLSL에서 작동하는 간단한 확산 조명을 얻으려고합니다. 점의 배열로 전달되는 큐브를 가지고 있고 기하 도형 쉐이더 내부에서면 법선을 계산하고 있습니다 (실행시 메쉬를 변형하려고하므로 새면 법선이 필요합니다)조각 카메라 위치/회전에 따라 달라지는 확산 값
제 문제는 카메라를 전세계로 이동시킬 때 확산 값이 변하는 것입니다. 그래서 카메라가 움직이면서 제 큐브 얼굴의 음영이 바뀝니다. 나는 이것이 무엇을 놓치고 있는지 알아낼 수 없었다.
정점을 : 다음과 같이 내 쉐이더은
#version 330 core
layout(location = 0) in vec3 vertexPosition_modelspace;
uniform mat4 MVP;
void main(){
gl_Position = MVP * vec4(vertexPosition_modelspace,1);
}
기하학 :
#version 330
precision highp float;
layout (triangles) in;
layout (triangle_strip) out;
layout (max_vertices = 3) out;
out vec3 normal;
uniform mat4 MVP;
uniform mat4 MV;
void main(void)
{
for (int i = 0; i < gl_in.length(); i++) {
gl_Position = gl_in[i].gl_Position;
vec3 U = gl_in[1].gl_Position.xyz - gl_in[0].gl_Position.xyz;
vec3 V = gl_in[2].gl_Position.xyz - gl_in[0].gl_Position.xyz;
normal.x = (U.y * V.z) - (U.z * V.y);
normal.y = (U.z * V.x) - (U.x * V.z);
normal.z = (U.x * V.y) - (U.y * V.x);
normal = normalize(transpose(inverse(MV)) * vec4(normal,1)).xyz;
EmitVertex();
}
EndPrimitive();
}
조각 :
#version 330 core
in vec3 normal;
out vec4 out_color;
const vec3 lightDir = vec3(-1,-1,1);
uniform mat4 MV;
void main()
{
vec3 nlightDir = normalize(vec4(lightDir,1)).xyz;
float diffuse = clamp(dot(nlightDir,normal),0,1);
out_color = vec4(diffuse*vec3(0,1,0),1.0);
}
감사