【问题标题】:C++ shader optimization questionC++着色器优化问题
【发布时间】:2010-11-25 04:12:03
【问题描述】:

谁能解释一下像素和顶点着色器交互的基本知识。

显而易见的是,顶点着色器接收基本的顶点属性,然后重新传递其中一些到实际的像素着色器

但是实际的vertex->pixel 转换是如何发生的呢? 我知道显然所有类型的管道都包含光栅化器更改,它能够插入顶点参数并可以根据某些纹理坐标应用纹理。

据我了解,这些也是插值的(不太确定这一刻,听说过一些关于复杂的 UV 导数数学的东西,但我认为我们可以说它们正在被插值)。


所以,这里有一些“有针对性”的问题。

像素着色器是如何工作的?我的意思是像素着色器显然做了一些动作“每像素”,但是由于不明显的顶点->像素转换这会产生一些问题。

我可以假设如果我在像素着色器中评估 matrix - vector product 一次,当图像被评估时,它会被评估 一次光栅化?或者最好评估我的顶点着色器中可能的所有内容,然后将其传递给像素着色器?

另外,如果有人能指出有关该主题的文章/摘要,我将不胜感激。

谢谢。


更新

我认为这实际上并不重要,因为交互应该在任何地方都差不多。我正在为桌面开发可视化应用程序游戏,使用 HLSL / GLSL / Nvidia CG 作为着色器,主要使用 C++ 作为基础语言。

【问题讨论】:

  • 如果您解释您尝试使用的平台/API,您可能会得到更好的响应。您可能还缺少一两个主题标签。就目前而言,我什至不知道你在说什么。
  • 为什么这个标签是 C++?根据定义,着色器是用 GLSL 或 Cg 等着色器语言编写的,而不是用 C++ 编写的?
  • 实际上,标签的唯一错误是 C++ 并不真正属于。现代 3D 硬件进行板载着色,并且该代码通常使用高级着色器语言 (HLSL) 编写。我对着色器只有一个初步的了解,我将在此处提供,并将答案部分留给有更多知识的人:顶点着色器将 3D 点投影到 2D 渲染表面上。像素着色器确定给定像素呈现什么颜色。

标签: c++ performance shader


【解决方案1】:

顶点着色器对每个顶点执行一次。它允许您将顶点从世界空间坐标(或它可能所在的任何其他坐标系)转换为屏幕空间坐标。

也就是说,如果你有一个三角形,每个顶点都会被变换,所以它最终会在屏幕上得到一个位置。

给定这些位置,光栅化器确定哪些像素被这三个顶点跨越的三角形所覆盖。

然后,对于三角形内的每个像素,调用像素着色器。顶点着色器的输出通常针对每个像素进行插值,因此靠近顶点v0 的像素将收到非常接近顶点着色器为v0 计算的值。

这意味着您在像素着色器中所做的一切被光栅化的图元覆盖的每个像素都会执行一次

【讨论】:

  • 除此之外,甚至因此,您应该在顶点着色器中执行尽可能多的功能,因为它的运行频率远低于像素着色器。
  • 是的。在某些情况下,您甚至可能希望将操作一直拉到您的 CPU 端 C++ 代码中。这完全取决于数据变化的频率。如果三角形中所有像素都通用,则将其放入顶点着色器中。如果是整个shader通用的,就把它作为一个常量放在shader外面。
猜你喜欢
  • 2011-04-23
  • 2021-10-06
  • 2017-07-03
  • 2019-03-04
  • 2019-02-17
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多