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);
}
我发现问题出在
那一行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,则不执行任何操作。
我只是删除了行,现在一切都正常了。