【发布时间】:2020-06-29 21:49:11
【问题描述】:
我正在使用 OpenTK,一个用于 C# 的 OpenGL 库。我在我的主 PC(Nvidia 视频卡)上开始了一个项目,一切都很好。然后我在我的笔记本电脑(AMD 显卡)上继续它,调用 GL.EnableVertexArrayAttrib 时出现异常。
最少的复制代码:
// 创建一个带有 `test` 属性的着色器
int vertexShaderID = GL.CreateShader(ShaderType.VertexShader);
GL.ShaderSource(vertexShaderID, "在 vec3 测试中; void main() { gl_Position = vec4(0, 0, 0, 0); }");
GL.CompileShader(vertexShaderID);
int fragmentShaderID = GL.CreateShader(ShaderType.FragmentShader);
GL.ShaderSource(fragmentShaderID, "void main() { gl_FragColor = vec4(0, 0, 0, 0); }");
GL.CompileShader(fragmentShaderID);
int programID = GL.CreateProgram();
GL.UseProgram(programID);
GL.AttachShader(programID, vertexShaderID);
GL.AttachShader(programID, fragmentShaderID);
GL.LinkProgram(programID);
// 创建一个 VAO,获取 `test` 属性位置并启用它
int vao = GL.GenVertexArray();
int attrib = GL.GetAttribLocation(programID, "test");
GL.EnableVertexArrayAttrib(vao, attrib); // 在 AMD 上抛出 AccessViolationException,但在 NVIDIA 上不抛出
我在 Windows 8.1 AMD 笔记本电脑上安装了最新的 GPU 驱动程序和最新的 OpenTK。
【问题讨论】:
-
这似乎不是您的全部真实代码。片段着色器在哪里?为什么不在检索属性之前调用
GL.UseProgram?让我们假设这些问题以正确的方式得到解决。然后可能会发生由于 GL 链接器优化了属性“test”而无法检索到它,因为它没有被使用。 -
@Ripi2 我的整个真实代码很长,包含多个类,其中大部分对于这个问题并不重要,这只是重现错误的最少代码。片段着色器和
GL.UseProgram是对的,这些很重要,我添加了它们。但这并没有改变任何东西,它仍然会在 AMD 笔记本电脑上崩溃。 -
两台机器上的 OpenGL 版本是否相同?