2014-01-29 4 views
0

OpenGL에서 일반 버텍스 특성이 사용되지 않으므로 사용자 지정 특성 만 사용하여 버텍스 셰이더를 다시 작성하려고했습니다. 그리고 나는 나를 위해 일하지 않았다. 버텍스 쉐이더는 다음과 같습니다.OpenGL 및 OpenGL ES에서 사용자 정의 및 일반 버텍스 셰이더 특성 사용

attribute vec3 aPosition; 
attribute vec3 aNormal; 

varying vec4 vColor; 

vec4 calculateLight(vec4 normal) { 
    // ... 
} 

void main(void) { 
    gl_Position = uProjectionMatrix * uWorldViewMatrix * vec4(aPosition, 1); 
    vec4 rotatedNormal = normalize(uWorldViewMatrix * vec4(aNormal, 0)); 
    vColor = calculateLight(rotatedNormal); 
} 

이것은 OpenGL ES 2.0에서 완벽하게 작동합니다. 그러나 OpenGL과 함께 사용하려고하면 검은 색 화면이 나타납니다. 내가 aNormal을 일반 gl_Normal으로 변경하면 모든 것이 잘 작동합니다 (aPosition은 두 가지 컨텍스트에서 모두 잘 작동하므로 gl_Vertex을 사용할 필요가 없습니다).

내가 뭘 잘못하고 있니?

저는 RenderMonkey를 사용하여 쉐이더를 테스트했으며 적절한 속성 이름 (aPosition 및 aNormal)을 사용하여 스트림 매핑을 설정했습니다. 어쩌면 그것은 모두가 0으로 설정 되었기 때문에 속성 색인과 관련이있을 것입니다. 또한, 여기 렌더 문서는 "흐름지도"에 이름을 사용자 정의 속성 설정에 대한 말씀입니다 :

"이름을 속성"필드에 해당 스트림을 참조 쉐이더 편집기에 사용 을 할 수있는 기본 이름을 표시합니다. OpenGL ES 효과에서 변경된 이름을 사용하여 스트림을 참조해야합니다. 그러나, 다이렉트 X 나 OpenGL을 적용, 새 이름이 더 궁금

가 렌더 또는 OpenGL을 자체에 대한 특정이 문제 쉐이더 편집기에 영향을주지 않습니다? 그리고 왜 aPosition이 여전히 작동합니까?

답변

1

속성 색인은 고유해야합니다. 프로그램을 연결하는 전에 glBindAttribLocation을 통해 특정 색인을 사용하도록 OpenGL에 알릴 수 있습니다. 어느 쪽이든 정상적인 방법은 glGetAttribLocation으로 색인을 쿼리하는 것입니다. RenderMonkey에서 선택할 수있는 것처럼 들리는데, 어떤 경우에는 별도로 만들었습니까?

고정 된 함수 렌더링이 버텍스 애트리뷰트로 크로스 오버되는 것을 보았습니다. glVertexPointer은 언 바운드 (더 이상 재현 할 수 있을지 모르겠다) 인 경우 첫 번째 애트리뷰트에 바인딩을 취소 할 수 있습니다.

속성 및 고정 함수 이름을 실험 할 때도 이상한 점이 있습니다.

attribute vec4 a; 
attribute vec4 b; 
void main() 
{ 
    gl_Position = gl_Vertex + vec4(gl_Normal, 0) + a + b; 
} 

나는 (glGetActiveAttrib를 통해) 다음 위치를 얻을 : glBindAttribLocation를 호출하지 않고, 나는 다음과 같은 쉐이더를 컴파일

a: 1 
b: 3 
gl_Vertex: -1 
gl_Normal: -1 

실험, gl_Vertex의 사용이 인덱스 0gl_Normal을 차지 보인다 인덱스 2 (보고되지 않은 경우에도)이 필요합니다. 만약 당신이 aPositionaNormal 사이의 패딩 애트리뷰트를 던지면 (아웃풋에서 사용하는 것을 잊지 마라. 그렇지 않으면 컴파일 될 것이다) 작동하게 만든다.

이 경우 위치 데이터는 단순히 마지막으로 위치 0에 바인딩 될 수 있습니다. 그러나 aNormal의 검은 색 화면은 아무 것도 바인딩하지 않습니다 (이 경우 항상 {0, 0, 0}).이것은 약간의 일관성이 없습니다. 즉, 법선이 위치 데이터와 동일한 데이터에 바인딩 된 경우, 색상이 올바르지 않으면 정상 데이터가 위치 데이터를 갖게됩니다.

응용 프로그램은 두 개 이상의 사용자 정의 속성 변수를 동일한 일반 정점 속성 색인에 바인드 할 수 있습니다. 이것은 앨리어싱이라 부르며 앨리어싱 된 속성 중 하나 인 이 실행 가능 프로그램에서 활성화되어 있거나 셰이더 을 통한 경로가 같은 위치에 앨리어스 된 속성 집합의 둘 이상의 속성을 사용하지 않는 경우에만 허용됩니다 .

내 느낌은 렌더가 사용하고있는 다음입니다 대신 당신이 모두 지수가 제로 말할 이후 정상 또는 위치 데이터 중 하나에 모두가 정상 위치에 결합 할 생각했을 속성, 단지 glVertexPointer/glNormalPointer.

다이렉트 X 나 OpenGL을 효과

이 새 이름이 더

어쩌면 이것은 의미 "라는 스트림"비 ES는 OpenGL 버전에서 간단히 사용할 수없는 쉐이더 편집기에 영향을주지 않습니다?

이것은 관련이 없지만 최신 OpenGL-GLSL 버전에서는 #version 숫자가 필요하며 속성은 키워드 in을 사용합니다.

+0

유익한 답변에 감사드립니다. 예, 저는 별도의 색인과 더미 속성을 사용하려고했지만이 모든 것이 도움이되지 않습니다. RenderMonkey 대신 glBindAttribLocation을 실험 해보고 나중에 결과를 게시 할 것입니다. –