gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:18:07 31 4
gpt4 key购买 nike

我目前正在学习 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com