OpenGL ES 2.0中GLSL是否支持像gl_Normal、gl_Vertex这样的内置变量?

3

我是OpenGL ES2.0和GLSL的新手,希望使用着色器处理图像。在Xcode中编码时,我直接使用内置变量如gl_Normalgl_Vertex,没有在着色器开头声明它们。最后,我收到了错误信息:

使用了未声明的标识符gl_Normal。为什么会这样?

1个回答

5
未声明的标识符gl_Normal的使用,为什么会出现这种情况?
在OpenGL-ES 2中,以及其后继者OpenGL-3核心版本中,不再有预定义的着色器输入变量。OpenGL-4甚至取消了预定义的着色器输出。
相反,您需要定义自己的输入和输出。每个输入或输出变量都被分配一个所谓的位置。可以通过OpenGL隐式分配,并可通过glGetAttribLocation检索,也可以由程序员显式地使用location存储限定符属性或glBindAttribLocation函数进行分配。输出同样也是通过片段数据位置进行分配的。

从技术上讲,ES2比GL 3早得多。更好的说法是GL 3基于ES 2,但即使如此也不正确。 - Nicol Bolas
@NicolBolas:如果我没记错,OpenGL-3和OpenGL-ES 2是并行开发的,只是OpenGL-3需要更长时间才能最终确定下来。毕竟像兼容性配置文件之类的东西也必须包含在规范中。 - datenwolf
这不是OpenGL 3.0的历史。GL 3.0的历史经历了一个名为“Longs Peak”的努力,这是OpenGL API完全重写的代号。那次重写尝试花费了2年时间,并最终在2008年初失败了。ES 2.0于2007年发布。因此,它不能基于GL 3.0,因为3.0仍然是具有新API的Longs Peak。 - Nicol Bolas
@NicolBolas:好的,我知道Longs Peak,但是我不知怎么会错误地记得它在更早的时候失败了...无论如何,我会相应地改变我的答案,感谢你的提醒。 - datenwolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接