opengl - Nvidia 驱动程序上出现“out 不能与非变化的”着色器编译错误,Intel 工作正常,AMD 有另一个错误

标签 opengl glsl

我尝试使用以下顶点着色器程序运行一个简单的 OpenGL 3 应用程序:-

in vec4 vPosition;
out vec2 otexcoord;

uniform mat4 modelview;
uniform mat4 projection;

void main()
{
    gl_Position = projection * modelview * vPosition;
    otexcoord.s = vPosition.x;
    otexcoord.t = vPosition.y * -1.0;
};

我在来自不同公司的 3 个 GPU 上运行了此代码,结果不同。

  • 使用Intel的驱动程序,没有错误,运行完美。
  • 使用 Nvidia 的驱动程序时,错误是“out 不能与非变化的 otexcoord 一起使用”。
  • 使用 AMD 驱动程序时,错误为“GL3 向前兼容上下文不支持隐式版本号 110”

AMD 的似乎是最不明显的。事实上我对此一无所知。

下面是一些查询字符串

  • 英特尔:OpenGL 3.2.0 - 内部版本 9.17.10.2932 GLSL 1.50 - 内部版本 9.17.10.2932
  • Nvidia:OpenGL 3.2.0 GLSL 1.50 NVIDIA(通过 Cg 编译器)
  • AMD:OpenGL 3.2.12002 核心配置文件上下文 9.12.0.0 GLSL 4.20

Intel 和 Nvidia 的类似,都是 GLSL 1.50 编译器。 AMD 的是 GLSL 4.20

下面是问题:-

  1. 在这种情况下,英特尔和 Nvidia 的编译器中哪一个可以正常工作?
  2. AMD 编译器的错误消息的真正含义是什么?我需要什么来纠正错误。

最佳答案

您必须始终使用 #version directive 。如果您不这样做,那么编译器将假定您指的是 GLSL 版本 1.10。这意味着 out 不是有效的关键字。

关于opengl - Nvidia 驱动程序上出现“out 不能与非变化的”着色器编译错误,Intel 工作正常,AMD 有另一个错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15234281/

相关文章:

c++ - 顶点着色器属性位置中的数据已损坏

java - 天空盒纹理是透明的

c++ - 使用 openGL 在 C++ 中绘制圆

c++ - 不同缓冲区布局中 glVertexArrayVertexBuffer()/glVertexArrayAttribFormat() 的问题

opengl - 如何在shader中制作波浪扭曲效果?

c++ - 使用 cmake 打包字体和着色器

python - 如何将 C++ 或 GLM 结构表示为 numpy 数组?

c++ - 当前设置的 OpenGL C++ 小 map

c++ - 我如何知道源代码使用的是哪个版本的 OpenGL?

opengl - glGenerateMipmap 需要哪个内存屏障?