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

标签 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);
};

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

最佳答案

这主要由评论涵盖,但为了找到合适的答案,让我总结一下哪些预定义的 GLSL 变量在核心配置文件中消失了,哪些仍然存在。

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

  • 修复了函数转换状态(gl_ModelViewMatrixgl_ProjectionMatrix 等)。
  • 光照参数 (gl_Light*)。
  • Material 参数 (gl_Material*)。
  • 剪裁平面 (gl_Clip*)。

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

过去还存在一些预定义的变化变量,例如gl_FrontColorgl_BackColorgl_TexCoord全部消失了,并且可以通过定义您自己的 out/in 变量轻松替换。

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

那么还剩下哪些预定义变量呢?虽然比以前少了很多,但仍然有一些,它们都与可编程管道中仍然存在的固定功能有关。示例包括:

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

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

关于opengl - GLSL - 使用自定义输出属性而不是 gl_Position,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24416589/

相关文章:

python - 在片段着色器中访问 3D 数组

c - OpenGl 中的 glColor3f 亮度很小

c++ - OpenGL Loader Generator 对 gl::BindBuffer 等的 undefined reference (OpenGL 函数)

opengl - 为什么这个 GLSL 代码即使有语法错误也能编译和链接?

OpenGL顶点着色器转换和输出

opengl - OpenGL 纹理的纵横比会影响性能吗?

webpack - 在 NextJS 中导入 GLSL 着色器——如何检查 Webpack 加载器是否工作?

image - 如何写入纹理缓冲区对象?

three.js - 顶点着色器中的复数运算

vertex-shader - 为什么这个计算着色器比顶点着色器慢得多?