我目前正在学习 OpenGL 与着色器 (3.3)。但有一件事我似乎无法解决。我读到,OpenGL 3+ 中不推荐使用 gl_Position 和 gl_FragCoords 等内置变量,因此我想使用自己的输出变量。
所以代替这个:
#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, 0.0, 1.0);
};
着色器在这两种情况下编译都没有问题,但第二个代码只产生空白屏幕。我是否需要以某种方式指定哪个变量是输出变量?
最佳答案
这主要由评论涵盖,但为了找到合适的答案,让我总结一下哪些预定义的 GLSL 变量在核心配置文件中消失了,哪些仍然存在。
在大多数情况下,预定义变量从核心配置文件着色器中删除,这是从 API 中删除大部分固定功能管道的直接结果。有很多统一
变量反射(reflect)了根本不存在的状态。典型例子包括:
- 修复了函数转换状态(
gl_ModelViewMatrix
、gl_ProjectionMatrix
等)。 - 光照参数 (
gl_Light*
)。 - Material 参数 (
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
,因此片段着色器的输出必须是具有浮点分量的向量。如果您的渲染目标具有不同的类型,例如如果您要渲染到整数纹理。
那么还剩下哪些预定义变量呢?虽然比以前少了很多,但仍然有一些,它们都与可编程管道中仍然存在的固定功能有关。示例包括:
- 顶点着色器和片段着色器之间的顶点坐标接口(interface),主要由顶点着色器中的
gl_Position
输出和片段着色器中的gl_FragCoord
输入组成。顶点着色器和片段着色器之间仍然有许多固定功能 block ,例如剪切和光栅化。这些固定功能 block 在顶点坐标上运行,因此预定义的变量仍然有意义。 - 一些与实例相关的变量(
gl_VertexID
、gl_InstanceID
)。 gl_ClipDistance
支持任意平面的裁剪,这也仍然以固定函数形式存在。gl_FrontFacing
。三角形的缠绕顺序由固定函数评估,并可供片段着色器使用。
这些列表都不是详尽无遗的,但我希望它是一个有用的概述,并提供一些背景知识。与往常一样,规范文档提供了最终且完整的答案。
关于opengl - GLSL - 使用自定义输出属性而不是 gl_Position,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24416589/