我目前正尝试使用着色器构建测试场景。这是我的代码。
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;
}
当我运行它时,我得到了三角形,但它是黑色的。我想要颜色,就像我在Colors数组中一样。
当我将片段着色器中的vColor更改为vec4(1,0,0,1)
时,我得到一个红色的triange。所以它必须是两个着色器之间的问题,也许顶点着色器不会将颜色传递给片段着色器...
我做错了什么?我怎样才能正确传递颜色?
答案 0 :(得分:2)
我看到两个问题。首先,您永远不会为颜色启用属性。添加一个启用属性1的调用,相当于您对属性0所做的操作:
GL.EnableVertexAttribArray(1);
您的颜色有4个组件,但在设置colors属性时,您将3作为第二个参数传递给VertexAttribPointer
。将其更改为:
GL.VertexAttribPointer(1, 4, VertexAttribPointerType.Float, false, 0, 0);