GLSL - 使用自定义输出属性而不是gl_Position

时间:2014-06-25 19:05:02

标签: opengl glsl vertex-shader

我目前正在使用着色器学习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);
};

着色器在两种情况下编译都没有问题,但第二个代码只生成空白屏幕。我是否需要以某种方式指定哪个变量是输出变量?

2 个答案:

答案 0 :(得分:27)

这些评论主要涵盖了这一点,但为了有一个答案,让我总结一下核心简介中哪些预定义的GLSL变量已经消失,哪些仍然存在。

在大多数情况下,预定义变量已从核心配置文件着色器中删除,这是固定功能管道的大部分从API中移除的直接后果。有很多uniform变量反映了根本不再存在的状态。典型的例子包括:

  • 固定功能转换状态(gl_ModelViewMatrixgl_ProjectionMatrix等)。
  • 灯光参数(gl_Light*)。
  • 材料参数(gl_Material*)。
  • 剪裁平面(gl_Clip*)。

类似地,接收固定函数顶点属性的顶点着色器输入已消失,因为核心配置文件中仅支持通用属性。其中包括gl_Vertexgl_Normalgl_Color

还有一些预先定义的varying变量,例如gl_FrontColorgl_BackColorgl_TexCoord这些变量都已消失,可以通过定义拥有out / in个变量。

预定义的片段着色器输出gl_FragColorgl_FragData也消失了。这是一个有趣的案例,因为原因不是功能弃用。我的理解是它们已被弃用,因为它们不够灵活,无法容纳当前的功能。由于gl_FragColor的类型为vec4,因此片段着色器的输出必须是具有float组件的向量。如果您的渲染目标具有不同的类型,例如,这不会很好。如果要渲染整数纹理。

那么还有什么预先定义的变量呢?虽然比以前少得多,但仍有一些,这些都与可编程管道中仍然存在的固定功能有关。例子包括:

  • 顶点着色器和片段着色器之间的顶点坐标界面,主要由顶点着色器中的gl_Position输出和片段着色器中的gl_FragCoord输入组成。在顶点和片段着色器之间仍然存在许多固定的功能块,如剪切和光栅化。那些固定的功能块在顶点坐标上运行,因此预定义的变量仍然有意义。
  • 与实例化有关的一些变量(gl_VertexIDgl_InstanceID)。
  • gl_ClipDistance支持使用任意平面进行裁剪,该平面也以固定函数形式存在。
  • gl_FrontFacing。三角形的绕线顺序由固定功能评估,并可用于片段着色器。

这些列表都不是详尽无遗的,但我希望它是一个有用的概述,并提供一些背景知识。与往常一样,规范文档提供了最终和完整的答案。

答案 1 :(得分:1)

正如我们的同事刚才所说,gl_Position并未弃用。我刚刚购买了关于OpenGL 4.3的OpenGL Superbible第6版,正好在第一页(第18页)上使用了这个函数。

我只能建议拿到这本书。它是由设计OpenGL的人写的,真的是教学。

我之前也像你一样迷失了因为我试图通过互联网或stackexchange学习,在我拿到这本书之后,我在OpenGL上度过了美好的时光。我想我将在三周内学到的这本书将比从互联网上学习5年更有价值。 OpenGL并不复杂,也不是任何"野兽"正如许多人所说,只要你从这本书中学到它。如果你通过互联网学习它,我相信它不仅仅是一个野兽!

这本书在开头就说他不会教任何不是核心OpenGL的东西,所以你可以确保不会像你那样陷入陷阱。

你可以以50美分的价格购买亚马逊使用的这本书。我只能推荐它!