【问题标题】:OpenGL, C++, In Out variablesOpenGL、C++、输入输出变量
【发布时间】:2018-03-17 18:26:10
【问题描述】:

我需要将一些变量直接从顶点着色器传递到片段着色器,但我的管道还包含一个 TCS、一个 TES 和一个 GS,它们只是做透传的东西。

我已经知道片段着色器希望从程序的最后一个链接着色器(在我的例子中是几何着色器)接收其“in”变量的值,但我不想在那里进行 MVP 和正常计算。

如何将变量从顶点着色器直接输出到片段着色器? (跳过中间的其余着色器)

这可能吗?

【问题讨论】:

  • Geometry Shader, but I don't want to do MVP and normal calculations there 好吧,你可以在顶点着色器中完成它们。然后在顶点着色器和片段着色器之间的每个阶段,您只需将一些in 变量复制到out 变量,将您的数据转发到片段着色器。我错过了什么吗?
  • 试过但其他阶段(TCS,TES,GS)强制我将数组作为“in”变量传递。对于 instace,如果我在 GS 中声明输入变量,编译器会说“OpenGL 要求几何输入是数组”。
  • @jovchaos: "一个 GS 只做透传工作。" 如果 GS 什么都不做,那它为什么会存在呢? GS 不是免费的
  • @jovchaos:“尝试过,但其他阶段(TCS、TES、GS)强制我将数组作为“in”变量传递”我似乎你真正的问题是你并不真正了解这些阶段在做什么(因为如果你这样做了,你就会明白为什么它们采用值数组以及这与 VS 的输出有何关系)。

标签: c++ opengl glsl fragment-shader vertex-shader


【解决方案1】:

如何将变量从顶点着色器直接输出到片段着色器? (跳过中间的其余着色器)

你没有。

每个阶段只能访问管道中前一个活动阶段提供的值。如果你想从 VS 到 FS 沟通,那么他们之间的每个阶段都必须通过他们自己来引导这些价值观。毕竟:

我的管道还包含一个 TCS 一个 TES

如果您要进行曲面细分,那么 VS 究竟如何直接与 FS 通信?片段着色器输入是通过对正在渲染的图元进行光栅化生成的每个片段值。但由于曲面细分处于活动状态,VS 正在运行的原语不再存在;仅存在细分后原语。

那么如果 VS 的图元都没有了,那么镶嵌后的图元是如何获取值的呢?对于在 tessellator 激活之前不存在的顶点,它将从哪里获得要在生成的图元中光栅化和插值的顶点值?

解决这个问题的工作交给了 TES。它将使用从 VS 输出的值(如果存在,则通过 TCS 发送)并根据其编码的镶嵌插值方案对它们进行插值/生成。这就是 TES 的用途。

GS 的方式非常相似。几何着色器可以将一个基元变成二十个。它可以丢弃整个基元。 VS 怎么可能通过 GS 将顶点信息传递给片段着色器,而 GS 可能只是将该图元放在地板上或创建 30 个单独的图元?还是把三角形转成直线?

因此,VS 甚至没有概念方式通过其他着色器管道向 FS 提供值。

【讨论】:

  • 非常感谢,我的概念不清楚,所以我一直在寻找错误的解决方案。
猜你喜欢
  • 2020-07-10
  • 1970-01-01
  • 2019-11-19
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 2011-04-20
相关资源
最近更新 更多