【问题标题】:OpenGL pass color to fragment shaderOpenGL将颜色传递给片段着色器
【发布时间】:2014-06-27 08:17:21
【问题描述】:

我目前正在尝试使用着色器构建测试场景。这是我的代码。

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) 时,我得到一个红色三角形。所以肯定是两个shader之间的问题,可能是vertex shader没有把颜色传给fragment shader...

我做错了什么?如何正确传递颜色?

【问题讨论】:

    标签: c# glsl shader opentk


    【解决方案1】:

    我看到了两个问题。首先,您永远不会启用颜色的属性。添加调用以启用属性 1,相当于您为属性 0 所做的:

    GL.EnableVertexAttribArray(1);
    

    您的颜色有 4 个组件,但在设置颜色属性时,您将 3 作为第二个参数传递给 VertexAttribPointer。将其更改为:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多