OpenTK三角形总是白色的

时间:2014-07-09 09:06:29

标签: c# opengl rendering opentk

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

这是init和渲染代码:

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);
}

1 个答案:

答案 0 :(得分:0)

所以我发现问题就在于行

GL.UseProgram(0);

我使用的着色器程序类(在某个论坛中找到)实现了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着色器程序通过调用GL.UseProgram(0)手动设置为0,则不执行任何操作。

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