OpenTK 始终获得统一位置 -1
OpenTK get uniform location always -1
我一直在努力学习 OpenTk,以便我可以在 c# 中轻松使用 OpenGl。我现在的问题是,当我尝试获取我的两件制服的位置时,两者都是 returns -1。
顶点着色器:
#version 440 core
uniform vec3 position
void main(void)
{
gl_Position = position;
}
片段着色器:
#version 440 core
uniform vec4 frag_Color;
out vec4 color;
void main(void)
{
color = frag_Color;
}
代码:
GL.BindVertexArray(pointVertexArray);
GL.UseProgram(program);
int a = GL.GetUniformLocation(program, "position");
int b = GL.GetUniformLocation(program, "frag_Color");
Debug.WriteLine(a + ", " + b);
GL.DrawArrays(PrimitiveType.Points, 0, 1);
GL.PointSize(size);
编辑:
这是我创建程序的地方:
public int CreateShader(string path) {
var vertexShader = GL.CreateShader(ShaderType.VertexShader);
GL.ShaderSource(vertexShader, File.ReadAllText(".\shaders\" + path + ".vert"));
GL.CompileShader(vertexShader);
var fragmentShader = GL.CreateShader(ShaderType.FragmentShader);
GL.ShaderSource(fragmentShader, File.ReadAllText(".\shaders\" + path + ".frag"));
GL.CompileShader(fragmentShader);
var program = GL.CreateProgram();
GL.AttachShader(program, vertexShader);
GL.AttachShader(program, fragmentShader);
GL.LinkProgram(program);
GL.DetachShader(program, vertexShader);
GL.DetachShader(program, fragmentShader);
GL.DeleteShader(vertexShader);
GL.DeleteShader(fragmentShader);
programs.Add(program);
return program;
}
记得检查着色器的编译状态。
int status;
GL.GetShader(shader, ShaderParameter.CompileStatus, out status);
if (status == 0)
throw new Exception(
String.Format("Error compiling {0} shader: {1}",
type.ToString(), GL.GetShaderInfoLog(shader)));
因为你的顶点着色器只有两个拼写错误,编译状态会告诉你。
0(5) : error C0000: syntax error, unexpected reserved word "void", expecting ',' or ';' at token "void"
0(7) : error C1035: assignment of incompatible types
你少了一个分号,gl_Position
是 vec4
而不是 vec3
,编译状态会告诉你这一点。
uniform vec3 position;
^ Missing
[...]
gl_Position = vec4(position, 1.0);
我一直在努力学习 OpenTk,以便我可以在 c# 中轻松使用 OpenGl。我现在的问题是,当我尝试获取我的两件制服的位置时,两者都是 returns -1。
顶点着色器:
#version 440 core
uniform vec3 position
void main(void)
{
gl_Position = position;
}
片段着色器:
#version 440 core
uniform vec4 frag_Color;
out vec4 color;
void main(void)
{
color = frag_Color;
}
代码:
GL.BindVertexArray(pointVertexArray);
GL.UseProgram(program);
int a = GL.GetUniformLocation(program, "position");
int b = GL.GetUniformLocation(program, "frag_Color");
Debug.WriteLine(a + ", " + b);
GL.DrawArrays(PrimitiveType.Points, 0, 1);
GL.PointSize(size);
编辑: 这是我创建程序的地方:
public int CreateShader(string path) {
var vertexShader = GL.CreateShader(ShaderType.VertexShader);
GL.ShaderSource(vertexShader, File.ReadAllText(".\shaders\" + path + ".vert"));
GL.CompileShader(vertexShader);
var fragmentShader = GL.CreateShader(ShaderType.FragmentShader);
GL.ShaderSource(fragmentShader, File.ReadAllText(".\shaders\" + path + ".frag"));
GL.CompileShader(fragmentShader);
var program = GL.CreateProgram();
GL.AttachShader(program, vertexShader);
GL.AttachShader(program, fragmentShader);
GL.LinkProgram(program);
GL.DetachShader(program, vertexShader);
GL.DetachShader(program, fragmentShader);
GL.DeleteShader(vertexShader);
GL.DeleteShader(fragmentShader);
programs.Add(program);
return program;
}
记得检查着色器的编译状态。
int status;
GL.GetShader(shader, ShaderParameter.CompileStatus, out status);
if (status == 0)
throw new Exception(
String.Format("Error compiling {0} shader: {1}",
type.ToString(), GL.GetShaderInfoLog(shader)));
因为你的顶点着色器只有两个拼写错误,编译状态会告诉你。
0(5) : error C0000: syntax error, unexpected reserved word "void", expecting ',' or ';' at token "void"
0(7) : error C1035: assignment of incompatible types
你少了一个分号,gl_Position
是 vec4
而不是 vec3
,编译状态会告诉你这一点。
uniform vec3 position;
^ Missing
[...]
gl_Position = vec4(position, 1.0);