OpenGL 셰이더 프로그램의 속성 위치를 설정할 때 다음 두 가지 옵션이 있습니다.
속성 위치를 명시 적으로 정의하기 위해 링크하기 전에 glBindAttribLocation () .
또는
링크 후 glGetAttribLocation () 을 사용하여 자동으로 할당 된 속성 위치를 얻습니다.
다른 하나를 사용하는 유틸리티는 무엇입니까?
그리고 실제로 어떤 것이 선호됩니까?
답변:
명시적인 위치 정의 를 선호하는 한 가지 좋은 이유를 알고 있습니다.
Vertex Array Objects 에 지오메트리 데이터를 보유하고 있다고 생각하십시오 . 주어진 객체에 대해 인덱스가 다음과 같은 방식으로 VAO를 만듭니다.
이제 두 개의 다른 셰이더를 사용 하여 하나의 개체를 그리려고한다고 가정합니다 . 한 셰이더에는 위치 및 일반 데이터 가 입력으로 필요하고 다른 셰이더는 위치 및 텍스처 좌표가 필요 합니다.
이러한 셰이더를 컴파일하면 첫 번째 셰이더는 속성 인덱스 0과 법선 1에 위치를 예상 할 것입니다. 다른 셰이더는 0에 위치를 예상하지만 텍스처 좌표는 1에 있어야합니다.
https://www.opengl.org/wiki/Vertex_Shader 인용 :
자동 할당
앞의 두 방법 중 어느 것도 속성 색인에 입력을 할당하지 않으면 프로그램이 링크 될 때 OpenGL에 의해 색인이 자동으로 할당됩니다. 할당 된 인덱스는 완전히 임의적이며 똑같은 버텍스 셰이더 코드를 사용하더라도 연결된 프로그램마다 다를 수 있습니다.
즉 , 두 셰이더에서 VAO를 사용할 수 없습니다. 예를 들어 개체 당 하나의 VAO를 갖는 대신 최악의 경우 셰이더 당 개체 당 별도의 VAO가 필요합니다 .
셰이더가를 통해 고유 한 속성 번호 지정 규칙을 사용하도록 강제하면 glBindAttribLocation
이 문제를 쉽게 해결할 수 있습니다. 필요한 것은 속성과 해당 ID 간의 일관된 관계를 유지하고 링크 할 때 셰이더가 해당 규칙을 사용하도록하는 것입니다.
(별도의 VAO를 사용하지 않는 경우 큰 문제는 아니지만 코드를 더 명확하게 만들 수 있습니다.)
BTW :
OpenGL 셰이더 프로그램의 속성 위치를 설정할 때 두 가지 옵션이 있습니다.
OpenGL / GLSL 3.3에는 세 번째 옵션이 있습니다 . 셰이더 코드 에서 직접 위치를 지정합니다 . 다음과 같이 보입니다.
layout(location=0) in vec4 position;
그러나 이것은 GLSL ES 셰이더 언어에는 없습니다.
여기서 또 다른 대답은 glGetAttribLocation이 호출자에게 데이터를 반환한다는 것입니다. 이는 암시 적으로 파이프 라인 플러시가 필요함을 의미합니다. 프로그램을 컴파일 한 직후에 호출하면 본질적으로 비동기 컴파일이 동 기적으로 발생하도록 강제하는 것입니다.
glGetUniformLocation
어쨌든 전화를해야한다는 것이 제 이해입니다 . 이 특별한 고려 사항이 여전히 관련이 있습니까?
glBindAttribLocation
리눅스에서 잘 작동하는 그래픽 엔진에서 사용 하는 것을 귀찮게하지 않았습니다 . 나는 창에 이식하면 정점으로 내 법선을 사용했다 - 내가 명시 적으로 통해 내 쉐이더에서 그것을 변수의 순서를 이야기했다glBindAttribLocation
... 작업에 그걸 얻기 위해