C# GetUniformLocation()返回-1
代码C# GetUniformLocation()返回-1,c#,opengl,opentk,C#,Opengl,Opentk,代码 GL.GetUniformLocation(); 对于glsl代码中的统一转换,返回-1 #version 420 layout(location = 0) in vec3 position; uniform mat4 transform; void main() { gl_Position = transform * vec4(position, 1.0); } 关于这一点,我能找到的唯一其他帖子谈到了优化器编译它,但我不知道它如何做到这一点,因为它在着色器的最终输出中是
GL.GetUniformLocation();
对于glsl代码中的统一转换,返回-1
#version 420
layout(location = 0) in vec3 position;
uniform mat4 transform;
void main()
{
gl_Position = transform * vec4(position, 1.0);
}
关于这一点,我能找到的唯一其他帖子谈到了优化器编译它,但我不知道它如何做到这一点,因为它在着色器的最终输出中是必不可少的。我正在使用Windows和普通编译器。当我运行GL.GetError时,我得到一个InvalidOperation错误
完整的代码是
C代码:
public void AddUniform(string Uniform)
{
int tries = 6;
Start:
int UniLocation = GL.GetUniformLocation(Program, Uniform);
#if DEBUG
tries--;
if(UniLocation == -1)
{
Console.WriteLine(this.ToString() + " Failed DEBUG AddUniform check");
if (tries > 0)
{
goto Start;
}
}
#endif
Uniforms.Add(Uniform, UniLocation);
}
制服是一本字典
着色器代码:
#version 420
layout(location = 0) in vec3 position;
uniform mat4 transform = mat4(1.0);
void main()
{
gl_Position = transform * vec4(position, 1.0);
}
实施:
NewWindow.Init(() =>
{
mesh = new MobiusEngine.NewSystems.Mesh();
shader = new MobiusEngine.NewSystems.Shader();
mesh.AddVerticies(new MobiusEngine.NewSystems.Vertex(new OpenTK.Vector3d(-1, -1, 0)), new MobiusEngine.NewSystems.Vertex(new OpenTK.Vector3d(0, 1, 0)), new MobiusEngine.NewSystems.Vertex(new OpenTK.Vector3d(1, -1, 0)));
shader.AddVertexShader(MobiusEngine.NewSystems.ShaderFunctions.LoadShader("BasicVertex.vert"));
shader.AddFragmentShader(MobiusEngine.NewSystems.ShaderFunctions.LoadShader("BasicFrag.frag"));
shader.AddUniform("transform");
shader.ComplieShader();
});
double temp = 0d;
NewWindow.Render(() =>
{
shader.Bind();
shader.SetUniformM("transform", Matrix4.CreateTranslation((float)(Math.Abs(Math.Sin(temp))), 0, 0));
temp += Time.DeltaTime.TotalSeconds;
mesh.Draw();
});
显然,在编译着色器并将程序链接到此处之前,您会尝试查询位置:
链接过程中会指定统一的位置。请参阅,可能的解决方案是,您可能没有针对ES3。整个着色器程序是否实际编译和链接?是的,当我将矩阵设置为默认值mat41.0时,我渲染的三角形会出现,如果没有此选项,则不会出现,我也会对这两个错误进行检查,并在失败时重试。显示实际代码。
shader.AddUniform("transform");
shader.ComplieShader();