我目前正在使用着色器学习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);
};
着色器在两种情况下编译都没有问题,但第二个代码只生成空白屏幕。我是否需要以某种方式指定哪个变量是输出变量?
答案 0 :(得分:27)
这些评论主要涵盖了这一点,但为了有一个答案,让我总结一下核心简介中哪些预定义的GLSL变量已经消失,哪些仍然存在。
在大多数情况下,预定义变量已从核心配置文件着色器中删除,这是固定功能管道的大部分从API中移除的直接后果。有很多uniform
变量反映了根本不再存在的状态。典型的例子包括:
gl_ModelViewMatrix
,gl_ProjectionMatrix
等)。gl_Light*
)。gl_Material*
)。gl_Clip*
)。类似地,接收固定函数顶点属性的顶点着色器输入已消失,因为核心配置文件中仅支持通用属性。其中包括gl_Vertex
,gl_Normal
,gl_Color
等
还有一些预先定义的varying
变量,例如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
。三角形的绕线顺序由固定功能评估,并可用于片段着色器。这些列表都不是详尽无遗的,但我希望它是一个有用的概述,并提供一些背景知识。与往常一样,规范文档提供了最终和完整的答案。
答案 1 :(得分:1)
正如我们的同事刚才所说,gl_Position并未弃用。我刚刚购买了关于OpenGL 4.3的OpenGL Superbible第6版,正好在第一页(第18页)上使用了这个函数。
我只能建议拿到这本书。它是由设计OpenGL的人写的,真的是教学。
我之前也像你一样迷失了因为我试图通过互联网或stackexchange学习,在我拿到这本书之后,我在OpenGL上度过了美好的时光。我想我将在三周内学到的这本书将比从互联网上学习5年更有价值。 OpenGL并不复杂,也不是任何"野兽"正如许多人所说,只要你从这本书中学到它。如果你通过互联网学习它,我相信它不仅仅是一个野兽!
这本书在开头就说他不会教任何不是核心OpenGL的东西,所以你可以确保不会像你那样陷入陷阱。
你可以以50美分的价格购买亚马逊使用的这本书。我只能推荐它!