【问题标题】:OpenTK triangle is always whiteOpenTK 三角形总是白色的
【发布时间】:2014-07-09 09:06:28
【问题描述】:

我想使用具有固定输出颜色的简单片段着色器在 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);
}

【问题讨论】:

  • 您是否确认您的着色器已成功加载和构建?我不熟悉这些绑定,但在标准的 OpenGL API 中,您可以在链接着色器程序以验证它是否成功后使用 glGetProgramiv(prog, GL_LINK_STATUS, ...)。着色器代码本身看起来不错,但路径名可能有问题。

标签: c# opengl rendering opentk


【解决方案1】:

所以我发现问题出在这条线上

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.UseProgram(0) 手动将 GL 着色器程序设置为 0,则它不会执行任何操作。

我只是删除了这条线,现在一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多