2014-05-09 5 views
0

현재 쉐이더가있는 테스트 장면을 만들려고합니다. 이것은 내 코드입니다.OpenGL이 조각 쉐이더로 색상을 전달합니다.

vertexArray = GL.GenVertexArray(); 
GL.BindVertexArray(vertexArray); 

float[] Vertices = new float[] { 
    -1.0f, -1.0f, 0.0f, 
    1.0f, -1.0f, 0.0f, 
    0.0f, 1.0f, 0.0f, 
}; 

float[] Colors = new float[] { 
    1.0f, 1.0f, 0.0f, 1.0f, 
    1.0f, 1.0f, 0.0f, 1.0f, 
    0.0f, 1.0f, 0.0f, 1.0f 
}; 

vertexBuffer = GL.GenBuffer(); 
colorBuffer = GL.GenBuffer(); 
GL.BindBuffer(BufferTarget.ArrayBuffer, vertexBuffer); 
GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(sizeof(float) * Vertices.Length), Vertices, BufferUsageHint.StaticDraw); 

GL.BindBuffer(BufferTarget.ArrayBuffer, colorBuffer); 
GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(sizeof(float) * Colors.Length), Colors, BufferUsageHint.StaticDraw); 

//Loading shaders... 

렌더링 내 루프 :이 정점 셰이더 사용

GL.UseProgram(shaderProgram); 

GL.EnableVertexAttribArray(0); 
GL.BindBuffer(BufferTarget.ArrayBuffer, vertexBuffer); 
GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 0, 0); 
GL.BindBuffer(BufferTarget.ArrayBuffer, colorBuffer); 
GL.VertexAttribPointer(1, 3, VertexAttribPointerType.Float, false, 0, 0); 

GL.DrawArrays(PrimitiveType.Triangles, 0, 3); 

GL.DisableVertexAttribArray(0); 

GL.UseProgram(0); 

:

#version 330 core 
layout(location = 0) in vec3 position; 
layout(location = 1) in vec4 color; 

out vec4 vColor; 

void main() 
{ 
    gl_Position = vec4(position, 1.0); 
    vColor = color; 
} 

을 그리고이 단편 쉐이더 : 나는 그것을 실행하면

#version 330 core 
in vec4 vColor; 
out vec4 fColor; 

void main(void) 
{ 
    fColor = vColor; 
} 

, 난 얻을 삼각형이지만 검은 색입니다. 내 색상 배열에있는 것처럼 색을 원합니다. 프래그먼트 셰이더의 vColor를 vec4(1,0,0,1)으로 변경하면 붉은 삼각형이 생깁니다. 그래서 두 쉐이더 사이에 문제가있을 것입니다. 아마도 버텍스 쉐이더가 프래그먼트 쉐이더에 색상을 전달하지 않을 수도 있습니다 ...

무엇이 잘못 되었나요? 색상을 올바르게 전달하려면 어떻게해야합니까?

답변

2

두 가지 문제점이 있습니다. 먼저 색상의 속성을 활성화하지 않습니다. 당신이 속성 0 한 일에 해당하는 속성 1을 활성화하기 위해 호출을 추가 :

GL.EnableVertexAttribArray(1); 

귀하의 색상을 4 개 구성 요소를 가지고 있지만, 색상 속성을 설정할 때 VertexAttribPointer에 두 번째 인수로 삼을 통과하고 있습니다. 변경 대상 :

GL.VertexAttribPointer(1, 4, VertexAttribPointerType.Float, false, 0, 0);