나는 얼굴 법선을 계산할 때 사용하는 간단한 기하 구조 셰이더를 가지고 있습니다. 그러나,기하 구조 쉐이더 밖의 손상된 프리미티브들 OpenGL 3.2 GLSL 150
VertexShader
#version 150
in vec3 in_Position;
uniform mat4 modelMat;
uniform vec3 scale;
void main(void)
{
// scale the verts
vec3 scaledPosition = vec3(in_Position.x * scale.x,
in_Position.y * scale.y,
in_Position.z * scale.z);
gl_Position = modelMat * vec4(scaledPosition, 1.0f);
}
지오메트리 쉐이더
#version 150 core
layout(triangles) in;
layout (triangle_strip) out;
layout (max_vertices=3) out;
uniform mat4 ProjectionMat;
uniform mat4 ViewMat;
out vec3 ex_Normal;
void main()
{
// calculate the normal
vec3 d1 = gl_in[1].gl_Position.xyz - gl_in[0].gl_Position.xyz;
vec3 d2 = gl_in[2].gl_Position.xyz - gl_in[0].gl_Position.xyz;
vec3 normal = normalize(cross(d1,d2));
for(int i = 0; i < gl_in.length(); i++)
{
gl_Position = ProjectionMat * ViewMat * gl_in[i].gl_Position;
ex_Normal = normal;
EmitVertex();
}
EndPrimitive();
}
조각 쉐이더
#version 150
in vec3 ex_Normal;
out vec4 v_FragColour;
uniform vec3 colour;
uniform vec3 lightDir;
void main(void)
{
vec3 diffuse = vec3(0.2, 0.2, 0.2);
vec3 lightColor = vec3(1.0, 1.0, 1.0);
const vec3 AMBIENT = vec3(0.1, 0.1, 0.1);
// normalize the fragment normal and camera direction
vec3 diffuseC = clamp(diffuse * (dot(lightDir,ex_Normal) + 1.0f)/2.0f , 0.0, 1.0) ;
v_FragColour = vec4(clamp(colour.rgb * (diffuseC + AMBIENT), 0.0, 1.0), 1.0f);
}
모두 잘 통과 나타납니다, 나는 예상대로 기하 출력의 대부분은 정확하게 나는이 무작위 원형들이 내 메쉬를 통해 뻗어 나오고 나올 때까지 언젠가는 심지어 다른 그리기 호출에서 한 메쉬에서 다음 메쉬로 조인 할 수도 있습니다.
나는 지오메트리 셰이더에서 삼각형 스트립을 출력하는 것과 관련이 있다고 생각하지만, EndPrimitve()를 사용하여 한 번에 하나의 프리미티브를 지오메트리 셰이더 밖으로 보내고있다. 왜 누군가가이 아이디어가 무엇인지 또는 어떤 이유로 디버깅을 할 수 있는지에 대한 아이디어 나 단서가 있다면 알려 주시기 바랍니다.
그리기는 glDrawElements()를 사용하여 수행됩니다.
편집 PROGRESS :
오른쪽 그래서 약간의 진전이되었습니다.//vec3 diffuseC = clamp(diffuse * (dot(lightDir,ex_Normal) + 1.0f)/2.0f , 0.0, 1.0);
: 나는 행의 주석을 해제하는 경우에는
void main(void)
{
vec3 diffuse = vec3(0.2, 0.2, 0.2);
vec3 lightColor = vec3(1.0, 1.0, 1.0);
const vec3 AMBIENT = vec3(0.1, 0.1, 0.1);
// normalize the fragment normal and camera direction
//vec3 diffuseC = clamp(diffuse * (dot(lightDir,ex_Normal) + 1.0f)/2.0f , 0.0, 1.0) ;
//v_FragColour = vec4(clamp(colour.rgb * (diffuseC + AMBIENT), 0.0, 1.0), 1.0f);
v_FragColour = vec4(0.0f,0.5f,1.0f,0.5f);
}
: 나는 문제가 사라질 조각 쉐이더에서 지오메트리 셰이더에서 일반 데이터 출력을 사용하지 않는 경우 , 내 조각 쉐이더 지금처럼 보인다
이 계산 결과가 사용되지 않더라도 문제는 반환됩니다.
저는 이것이 지오메트리 셰이더의 정보를 각 버텍스의 프래그먼트 셰이더에 전달하는 것과 관련이 있다고 생각합니다.
모든 아이디어 ??
'LightDir'이 절대 참조되지 않은 상태에서 참조 될 때, 그것은 연결된 GLSL 프로그램의 다른 유니폼의 균일 한 위치를 변경합니다. 실제로 위치를 쿼리하지 않고 다른 유니폼의 위치를 가정하거나 지오메트리 셰이더를 연결하기 전에 수행하는 경우 이는 비난받을 수 있습니다. –