2013-07-20 1 views
1

나는 얼굴 법선을 계산할 때 사용하는 간단한 기하 구조 셰이더를 가지고 있습니다. 그러나,기하 구조 쉐이더 밖의 손상된 프리미티브들 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); 

} 

: 나는 문제가 사라질 조각 쉐이더에서 지오메트리 셰이더에서 일반 데이터 출력을 사용하지 않는 경우 , 내 조각 쉐이더 지금처럼 보인다

이 계산 결과가 사용되지 않더라도 문제는 반환됩니다.

저는 이것이 지오메트리 셰이더의 정보를 각 버텍스의 프래그먼트 셰이더에 전달하는 것과 관련이 있다고 생각합니다.

모든 아이디어 ??

+0

'LightDir'이 절대 참조되지 않은 상태에서 참조 될 때, 그것은 연결된 GLSL 프로그램의 다른 유니폼의 균일 한 위치를 변경합니다. 실제로 위치를 쿼리하지 않고 다른 유니폼의 위치를 ​​가정하거나 지오메트리 셰이더를 연결하기 전에 수행하는 경우 이는 비난받을 수 있습니다. –

답변

3

이것은 형상 셰이더 드라이버 버그입니다. Mac OSX 10.8에서 AMD Radeon HD HD6750M을 사용하여 동일한 결과를 얻었습니다. 내부 인텔 HD 그래픽 3000 (gfxCardStatus 사용)으로 전환하면 문제가 해결되지만 물론 훨씬 느려지고 멀티 모니터를 지원하지 않습니다. 마지막으로 Mac OSX 10.9 Developer Preview 4로 업그레이드했는데 버그가 잘 해결 된 것으로 보입니다.

+0

건배, 나는 리눅스에서 이걸 가지고 다시 놀았으니 괜찮은 것 같습니다. 다른 곳에서도 유사한 게시물을 보았고 osx 드라이버에 관해서도 보았습니다. 나는 이것이 새로운 mavericks 드라이버에서 수정되었는지 아직 확인하지 못하고 있지만 그렇다면 버그라고 부를 수 있다고 생각한다. –