【发布时间】:2023-12-26 00:14:02
【问题描述】:
我目前正在使用着色器 (3.3) 学习 OpenGL。有一件事我似乎无法解决。我已经读过在 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);
};
着色器在这两种情况下编译都没有问题,但第二个代码只产生空白屏幕。我是否需要以某种方式指定哪个变量是输出变量?
【问题讨论】:
-
这些built-in variables 都没有被弃用。在核心配置文件(兼容性配置文件)之前,有反映固定管道属性的内置函数,如
gl_Color、gl_Normal等。 -
哦,那我很抱歉。我读过一些
gl_*变量已被弃用,并认为它们都是。谢谢你的澄清。无论如何,如何使它与自定义输出变量一起使用?还是只使用 gl_Position 属性来设置顶点位置? -
您仍然必须使用
gl_Position。该变量很特殊,因为它指定了顶点和片段着色器(裁剪、光栅化等)之间的固定功能块使用的坐标。您不能用您定义的变量替换它。除了@BrettHale 已经提到的示例之外,gl_FragColor曾经是 fragment 着色器的预定义输出,也已被弃用。 -
我明白了。我认为如果你可以在片段着色器中指定自定义输出,你可以在顶点着色器中这样做,显然我错了。再次感谢您的澄清。我还有很多东西要学,但到目前为止,OpenGL 一直很有趣。
-
你可以这样做,但
gl_Position是gl_PerVertex的一部分。更准确地说,它是一个非可选部分,渲染管道中仍有固定功能部分需要gl_PerVertex.gl_Position。gl_FragCoord,正如您所提到的,实际上是根据该变量计算得出的 - 在除以w和视口转换之后。
标签: opengl glsl vertex-shader