我已经按照这个教程来尝试学习OpenTK(https://www.youtube.com/watch?v=elEyLoQQ67o&t=1182s)我的代码与他的代码几乎完全相同,但是当程序运行时,碎片着色器和像素着色器都无法编译,并出现模糊错误“ERROR:0:8:'f':语法错误语法错误”。并且当程序被链接时,它会随机给出错误“附加的片段着色器未编译。”或“附加的顶点着色器未编译。”每次程序运行时。我完全被难住了,不知道是什么导致了错误,因为我找不到代码的错误,着色器尽可能简单。
这段代码的作用是在屏幕上绘制一个三角形。
string vertexShaderCode =
@"
#version 460 core
layout (location = 0) in vec3 aPosition;
void main()
{
gl_Position = vec4(aPosition, 1f);
}
";
string fragmentShaderCode =
@"
#version 460 core
out vec4 fragColor;
void main()
{
fragColor = vec4(0f, 0f, 0.5f, 1f);
}
";
int vertexShader = GL.CreateShader(ShaderType.VertexShader);
GL.ShaderSource(vertexShader, vertexShaderCode);
GL.CompileShader(vertexShader);
GL.GetShader(vertexShader, ShaderParameter.CompileStatus, out int d);
if (d == 0)
{
string infoLog = GL.GetShaderInfoLog(vertexShader);
System.Console.WriteLine(infoLog);
}
int fragmentShader = GL.CreateShader(ShaderType.FragmentShader);
GL.ShaderSource(fragmentShader, fragmentShaderCode);
GL.CompileShader(fragmentShader);
GL.GetShader(fragmentShader, ShaderParameter.CompileStatus, out int a);
if (a == 0)
{
string infoLog = GL.GetShaderInfoLog(fragmentShader);
System.Console.WriteLine(infoLog);
}
this.shaderProgram = GL.CreateProgram();
GL.AttachShader(this.shaderProgram, vertexShader);
GL.AttachShader(this.shaderProgram, fragmentShader);
GL.LinkProgram(this.shaderProgram);
int linkStatus = 0;
GL.GetProgram(this.shaderProgram, GetProgramParameterName.LinkStatus, out linkStatus);
string infolog = GL.GetProgramInfoLog(this.shaderProgram);
Console.WriteLine(infolog);
GL.DetachShader(this.shaderProgram, vertexShader);
GL.DetachShader(this.shaderProgram, fragmentShader);
GL.DeleteShader(vertexShader);
GL.DeleteShader(fragmentShader);
另一件事,虽然着色器无法编译,但仍然会在屏幕上绘制一个三角形,这应该是不可能的,对吗?我能想到的唯一解释是,硬件有某种基础顶点着色器,如果没有提供自定义顶点着色器,它会求助于这种着色器。
1条答案
按热度按时间dwbf0jvd1#
1f
不是有效的GLSL语法(这不是C或C++)。可以是1.0f
、1.0
或1
。在GLSL中,1.0
是单精度浮点文字,如果是双精度,则必须使用后缀lf
(例如1.0lf
)。请参阅OpenGL®着色语言,版本4.60.7 - 4.1.4。浮点数。gl_Position = vec4(aPosition, 1f);
fragColor = vec4(0f, 0f, 0.5f, 1f);