2011-06-14 8 views
3

포인트에 간단한 패스 스루 기하 구조 셰이더를 쓰는 데 문제가 있습니다. 나는 이런 식으로 뭔가해야한다 생각 :포인트 용 패스 스루 지오메트리 셰이더

#version 330 
precision highp float; 

layout (points) in; 
layout (points) out; 

void main(void) 
{ 
    gl_Position = gl_in[0].gl_Position; 
    EmitVertex(); 
    EndPrimitive(); 
} 

내가 지오메트리 셰이더를 지정하지 않을 때 화면에 표시되는 점의 무리를 가지고,하지만 난 내 쉐이더 프로그램이 쉐이더를 연결하려고 할 때, 어떤 점 없다 표시되고 오류가보고되지 않습니다.

저는 C#과 OpenTK를 사용하고 있지만 문제는 아닌 것 같습니다.

편집 : 사람들이 다른 셰이더를 요청했습니다. 셰이더를 사용하지 않고이 셰이더를 테스트했지만 기하학 셰이더 없이는 정상적으로 작동했습니다.

버텍스 쉐이더 :

void main() 
{ 
    gl_FrontColor = gl_Color; 
    gl_Position = ftransform(); 
} 

조각 쉐이더 :

void main() 
{ 
    gl_FragColor = gl_Color; 
} 
+1

이 질문은 [this] (http://stackoverflow.com/questions/3936368/geometry-shader-doesnt-do-anything-when-fed-gl-points) 질문과 관련 될 수 있습니다. ATI 그래픽 카드에. –

+1

이 프로그램에 다른 쉐이더를 게시 할 수 있습니까? – kvark

+0

@Nocturne 새로운 구문 (예 :'layout (points)')과''ftransform' 또는 고정 함수 변수 변경과 같은 오래된 구문을 혼합하는 것은 좋은 생각이 아닙니다. 하지만 방금 다른 것을 발견하고 내 대답을 업데이트 할 것입니다. –

답변

4

아니에요 있는지 확인 (지오메트리 쉐이더와 실제 경험이없는),하지만 당신은 지정할 필요가 없습니다 출력 정점의 최대 수. 귀하의 경우에는 그냥 하나를, 그래서 당신은 여전히 ​​API에 의해 정점의 수를 지정할 수 있기 때문에

layout (points, max_vertices=1) out; 

는 아마도 쉐이더가 성공적으로 컴파일 시도 (적어도 호환성에, 나는 생각한다).

편집 : 당신은 gl_FrontColor 다양한 내장을 사용 (그리고 프래그먼트 쉐이더에서 gl_Color를 읽기), 그러나 지오메트리 쉐이더에서 당신이 (자동으로 전파되지 않습니다) 프래그먼트 쉐이더로 전파되지 않습니다.

이렇게하면 또 다른 문제가 발생합니다. 새 구문 (예 : gl_in)과 이전에 사용되지 않는 구문 (예 : ftransform 및 기본 색상 변경)을 혼합합니다. 아마도 그것은 좋은 생각이 아니며이 경우 정확하게 기억한다면 gl_in에는 gl_Color 또는 gl_FrontColor 회원이 없으므로 문제가 발생했을 것입니다. 따라서 가장 좋은 방법은 자신의 색상 변수를 out의 정점 및 지오메트리 셰이더 변수와 in 지오메트리 및 프래그먼트 셰이더 변수 (그러나 in은 지오메트리 셰이더의 배열이어야 함)로 사용하는 것입니다.

+0

네 말이 맞아, 나는 그걸 잊어 버렸지 만, 불행히도 그 점들은 여전히 ​​나타나지 않는다. –

+0

고마워, 나는 그걸 작동시킬 수 있었다. 지금은 색상이 필요하지 않으므로 조각 쉐이더를 'gl_FragColor = vec4 (1.0, 1.0, 1.0, 1.0);로 대체했습니다. ' 그래도 사용되지 않는 모든 구문을 정리해야합니다. –

관련 문제