所以不是这样的:
#version 330\n layout(location=0) in vec2 i_position; out vec4 o_position; void main() { gl_Position = vec4(i_position,0.0,1.0); };
我写了这个:
#version 330\n layout(location=0) in vec2 i_position; out vec4 o_position; void main() { o_position = vec4(i_position,1.0); };
解决方法
在大多数情况下,预定义变量从核心配置文件着色器中删除,这是固定功能管道的大部分从API中移除的直接结果.有很多统一变量反映了根本不再存在的状态.典型的例子包括:
>修复了函数转换状态(gl_ModelViewMatrix,gl_ProjectionMatrix等).
>照明参数(gl_Light *).
>材料参数(gl_Material *).
>剪辑平面(gl_Clip *).
类似地,接收固定函数顶点属性的顶点着色器输入已消失,因为核心配置文件中仅支持通用属性.这些包括gl_Vertex,gl_Normal,gl_Color等.
还有一些预先定义的变量变量,如gl_FrontColor,gl_BackColor和gl_TexCoord都已消失,可以通过定义自己的out / in变量轻松替换.
同样消失的是预定义的片段着色器输出gl_FragColor和gl_FragData.这是一个有趣的案例,因为原因不是功能弃用.我的理解是它们被弃用了,因为它们不够灵活,无法容纳当前的功能.由于gl_FragColor的类型是vec4,因此片段着色器的输出必须是具有float组件的向量.如果您的渲染目标具有不同的类型,例如,这不会很好.如果要渲染整数纹理.
那么还有什么预先定义的变量呢?虽然比以前少得多,但仍有一些,这些都与可编程管道中仍然存在的固定功能有关.例子包括:
>顶点着色器和片段着色器之间的顶点坐标界面,主要由顶点着色器中的gl_Position输出和片段着色器中的gl_FragCoord输入组成.在顶点和片段着色器之间仍然存在许多固定的功能块,如剪切和光栅化.那些固定的功能块在顶点坐标上运行,因此预定义的变量仍然有意义.
>一些与实例化相关的变量(gl_VertexID,gl_InstanceID).
> gl_ClipDistance支持使用任意平面进行裁剪,它也以固定函数形式存在.
> gl_FrontFacing.三角形的绕线顺序由固定功能评估,并可用于片段着色器.
这些列表都没有详尽无遗,但我希望这是一个有用的概述,并提供一些背景知识.与往常一样,规范文档提供了最终和完整的答案.