OpenTK三角形总是白色的

本文关键字:白色 三角形 OpenTK | 更新日期: 2023-09-27 18:12:10

我想在OpenTK中使用一个固定输出颜色的简单片段着色器绘制一个彩色三角形。然而,三角形总是保持白色。是什么导致了这个问题?

下面是初始化和渲染代码:
game.Load += (sender, e) =>
{
    game.VSync = VSyncMode.On;
    float[] vertexPositions = {
        0.75f, 0.75f, 0.0f, 1.0f,
        0.75f, -0.75f, 0.0f, 1.0f,
        -0.75f, -0.75f, 0.0f, 1.0f,
    };
    GL.GenBuffers(1, out vbo);
    GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);
    GL.BufferData(BufferTarget.ArrayBuffer, new IntPtr(
        vertexPositions.Length * sizeof(float)), vertexPositions, BufferUsageHint.StaticDraw);
    GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
    // load shaders, create and link shader program
    string shaderPath = @"K:'VisualProjects'ArcSynthesis'Tut2'Tut2'shaders'";
    shVertex = new VertexShader(new System.IO.FileInfo(shaderPath + "vertex.glsl"));
    shFragment = new FragShader(new System.IO.FileInfo(shaderPath + "fragment.glsl"));
    spMain = new ShaderProgram(shVertex, shFragment);
    spMain.Link();
};

game.RenderFrame += (sender, e) =>
{
    GL.ClearColor(0f, 0f, 0f, 0f);
    GL.Clear(ClearBufferMask.ColorBufferBit);
    spMain.Use();
    GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);
    GL.EnableVertexAttribArray(0);
    GL.VertexAttribPointer(0, 4, VertexAttribPointerType.Float, false, 0, 0);
    GL.DrawArrays(PrimitiveType.Triangles, 0, 3);
    GL.DisableVertexAttribArray(0);
    GL.UseProgram(0);
    game.SwapBuffers();
};

顶点着色器:

#version 130
in vec4 position;
void main() 
{
    gl_Position = position;
}

片段着色器:

#version 130
out vec4 outputColor;
void main()
{
    outputColor = vec4(0.2f, 0.5f, 0.8f, 1.0f);
}

OpenTK三角形总是白色的

我发现问题出在

那一行
GL.UseProgram(0);

我使用的shader程序类(在一些论坛中找到)实现了glUseProgram()函数,如下所示:

  public IDisposable Use()
  {
     IDisposable r = new ShaderProgram.Handle(curr_program);
     if (curr_program != ID)
     {
        GL.UseProgram(ID);
        curr_program = ID;
     }
     return r;
  }

它只在另一个ShaderProgram之前将静态int curr_program设置为自己的ID时才调用glUseProgram()。如果通过调用GL. useprogram(0)将GL着色器程序手动设置为0,则不执行任何操作。

我只是删除了行,现在一切都正常了。