C ++着色器优化问题

时间:2010-11-24 20:00:06

标签: c++ performance shader

有人可以向我解释像素和顶点着色器交互的相当基础。

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

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

据我所知,这些也是插值的(不太确定这个时刻,听说过复杂的UV衍生数学,但我认为我们可以说它们是被插值的)。


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

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

我可以假设,如果我在我的像素着色器中评估矩阵 - 矢量积 ,那么当图像是时,它将被评估一次光栅化?或者,在我的顶点着色器中评估所有可能的内容然后将其传递给像素着色器会更好吗?

此外,如果有人可以就此主题指出文章/摘要,我将非常感激。

谢谢。


更新

我认为这实际上没关系,因为各地的互动应该是相同的。我正在为桌面开发可视化应用程序游戏,使用HLSL / GLSL / Nvidia CG作为着色器,主要是使用C ++作为基本语言。

1 个答案:

答案 0 :(得分:3)

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

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

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

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

这意味着您在像素着色器中执行的所有操作都将执行一次每个像素被光栅化原始图像覆盖