编辑: 我将 GLTextureUnitID 从 uint 更改为 int,它导致错误停止出现,但呈现黑色方块而不是纹理。当我注释掉对 SetTexture 的调用时,即使我从未在该行之前设置过该制服,它仍然可以正常呈现。
Edit2: 看起来 GLTextureUnitID 的值为 1,而正在设置的纹理的 ID 为 0。
Edit3: 将 SetTexture 函数更改为具有以下内容似乎已经解决了问题,但感觉有点像一个肮脏的解决方案。
GL.BindTexture(TextureTarget.Texture2D, (int)texture.GLTextureUnitID);
GL.Uniform1(GLTextureUnitLocation, 0);
原始问题: 我开始在我的项目中添加对纹理文件的支持,但是每当我为我的纹理着色器程序调用 GL.Uniform1 时,我都会收到“InvalidOperation”错误。更奇怪的是,当我注释掉对导致错误的函数的调用时,纹理仍然会被渲染。
渲染带有纹理的四边形的 RenderGUI 函数是:
public override void RenderGUI()
{
// Translate Matrix to Position of GUI Element
Matrices.Translate(SetMatrixParam.ModelViewMatrix, Position.X, Position.Y, 0);
// Bind Shaders and Send Matrices
Shader.Bind();
Shader.SendMatrices();
// Set Texture Information
Shader.SetTexture(Texture); // <- This causes the error, it's just a call to Uniform1 using a property from the texture object, if commented out the error doesn't appear.
Shader.SetTextureColor(Color4.White);
GL.Begin(BeginMode.Triangles);
// Render Quad
Vector3 topLeft = new Vector3(0, 0, 0);
Vector3 bottomLeft = new Vector3(0, Size.Y, 0);
Vector3 topRight = new Vector3(Size.X, 0, 0);
Vector3 bottomRight = new Vector3(Size.X, Size.Y, 0);
Shader.SetTextureCoord(0, 0); GL.Vertex3(topLeft); // Top Left
Shader.SetTextureCoord(0, 1); GL.Vertex3(bottomLeft); // Bottom Left
Shader.SetTextureCoord(1, 1); GL.Vertex3(bottomRight); // Bottom Right
Shader.SetTextureCoord(0, 0); GL.Vertex3(topLeft); // Top Left
Shader.SetTextureCoord(1, 1); GL.Vertex3(bottomRight); // Bottom Right
Shader.SetTextureCoord(1, 0); GL.Vertex3(topRight); // Top Right
GL.End();
}
并且正在调用的函数导致出现错误:
public void SetTexture(Texture2D texture)
{
if (texture.GLTextureUnitID == null)
throw new ArgumentException();
GL.Uniform1(GLTextureUnitLocation, (uint)texture.GLTextureUnitID);
}
这也可以在这个项目的 github 上找到。连同Texture2D 类以及正在使用的顶点和片段着色器以及处理使用这些着色器的着色器程序的类。