2012-07-20 3 views
1

버퍼를 쉐이더의 속성에 바인드 할 때 쉐이더의 속성이 뒤집혀 진 것 같습니다.꼭지점 속성 버퍼가 잘못된 속성에 바인딩되고 있습니다.

precision highp float; 

uniform mat4 projection_matrix; 
uniform mat4 modelview_matrix; 

in vec3 in_position; 
in vec3 in_color; 

out vec3 ex_Color; 

void main(void) 
{ 
    gl_Position = projection_matrix * modelview_matrix * vec4(in_position, 1); 
    ex_Color = in_color; 
} 

및 픽셀 쉐이더 너무 복잡

precision highp float; 

in vec3 ex_Color; 

out vec4 out_frag_color; 

void main(void) 
{ 
    out_frag_color = vec4(ex_Color, 1.0); 
} 

아무것도 :

그래서 저는 버텍스 쉐이더를 가지고있다. 두 개의 입력이 있습니다. 하나는 정점 위치 용이고 다른 하나는 색상 용입니다. (newb로는 질감이나 빛을 다루고 싶지 않습니다.)

이제 클라이언트 코드에서 positionVboData와 colorVboData라는 두 개의 벡터 배열에 데이터를 저장하고 VBO를 만듭니다. .

GL.GenBuffers(1, out positionVboHandle); 
GL.BindBuffer(BufferTarget.ArrayBuffer, positionVboHandle); 
GL.BufferData<Vector3>(BufferTarget.ArrayBuffer, 
         new IntPtr(positionVboData.Length * Vector3.SizeInBytes), 
         positionVboData, BufferUsageHint.StaticDraw); 

GL.GenBuffers(1, out colorVboHandle); 
GL.BindBuffer(BufferTarget.ArrayBuffer, colorVboHandle); 
GL.BufferData<Vector3>(BufferTarget.ArrayBuffer, 
       new IntPtr(colorVboData.Length * Vector3.SizeInBytes), 
       colorVboData, BufferUsageHint.StaticDraw); 

후, 나는 쉐이더의 속성에 vbos을 결합하는 작업을 다음 코드를 기대 :

GL.EnableVertexAttribArray(0); 
    GL.BindBuffer(BufferTarget.ArrayBuffer, positionVboHandle); 
    GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, true, Vector3.SizeInBytes, 0); 
    GL.BindAttribLocation(shaderProgramHandle, 0, "in_position"); 

    GL.EnableVertexAttribArray(1); 
    GL.BindBuffer(BufferTarget.ArrayBuffer, colorVboHandle); 
    GL.VertexAttribPointer(1, 3, VertexAttribPointerType.Float, true, Vector3.SizeInBytes, 0); 
    GL.BindAttribLocation(shaderProgramHandle, 1, "in_color"); 

사실, 마지막 코드 샘플에서는 positionVboHandle과 colorVboHandle을 바꿔야하고 완벽하게 작동합니다. 그러나 그것은 나에게 거꾸로 보인다. 내가 뭘 놓치고 있니? 뭔가 이상한 일이 벌어지고


업데이트. 나는이에 버텍스 쉐이더 변경하는 경우 :

precision highp float; 

uniform mat4 projection_matrix; 
uniform mat4 modelview_matrix; 

in vec3 in_position; 
in vec3 in_color; 

out vec3 ex_Color; 

void main(void) 
{ 
    gl_Position = projection_matrix * modelview_matrix * vec4(in_position, 1); 
    //ex_Color = in_color; 
    ex_Color = vec3(1.0, 1.0, 1.0); 
}" 

을 그리고 수 있도록 수정 이외의 다른 변경 (설정은, 정점 올바른 속성을로드하는 모든 후 프로그램 링크를 이동하는 제안하지 ..을 In_Position에보다는 in_color에 위치,

답변

0

그래서 Mārtiņš Možeiko의 도움으로이 사실을 알 수있었습니다. LinkProgram 전에 BindAttribLocation을 올바르게 호출했습니다. 그러나, GL.CreateProgram() 호출하기 전에 속성 위치 중 하나를 바인딩 할 때.

+0

모든 OpenGL 호출을 glGetError 함수로 확인해야합니다. 잘못된 함수 호출을 즉시 나타냅니다. –

4

GL.BindAttribLocation이 GL.LinkProgram하기 전에 수행해야합니다 당신은이 코드 조각 후 GL.LinkProgram를 호출

편집 :? 당신의 업데이트에 응답 - in_color를 사용하지 않기 때문에 OpenGL은 단순히이 입력을 무시합니다. 그리고 버텍스 쉐이더는 in_position 만 입력으로 처리합니다. 대부분의 경우 위치 0에 바인딩됩니다. 따라서 코드가 작동합니다. 위의 링크에서 설명한대로 프로그램을 연결하기 전에 위치를 바인딩해야합니다.

+0

원래, 나는 (나도 잘하고있는 예제 중 하나가 잘못되었다고 생각한다.) 그러나 나는 그것을 고쳤고 같은 문제가 발생했다. – jwrush

+0

BindAttribLocation에 대한 검색을 수행하고 각각 앞에 디버깅 출력을 넣고 LinkProgram을 검색하고 디버깅 출력을 앞에 둡니다. 나는 얻는다 : 바인딩 속성 ... 바인딩 특성 ... 연결 중 ... – jwrush

+0

올바른 방향으로 나를 가리키는 데 도움이됩니다. 감사! – jwrush

관련 문제