顶点着色器与片段着色器

时间:2010-12-12 10:41:30

标签: opengl cg fragment-shader vertex-shader

我已经阅读了一些关于Cg的教程,但有一件事我不太清楚。 顶点和片段着色器之间究竟有什么区别? 对于哪种情况比另一种更适合?

5 个答案:

答案 0 :(得分:169)

片段着色器与像素着色器相同。

一个主要区别是顶点着色器可以操纵顶点的属性。这是你的多边形的角点。

另一方面,片段着色器负责顶点之间的像素看起来如何。它们按照特定规则在定义的顶点之间进行插值。

例如:如果您希望多边形完全为红色,则可以将所有顶点定义为红色。如果您想要特定效果(如顶点之间的渐变),则必须在片段着色器中执行此操作。

换句话说:

顶点着色器是图形管道中早期步骤的一部分,我认为在模型坐标转换和多边形裁剪之间。那时,还没有真正完成任何事情。

然而,片段/像素着色器是光栅化步骤的一部分,其中计算图像并填充顶点之间的像素或“着色”。

在这里阅读有关图形管道的内容,一切都会显露出来: http://en.wikipedia.org/wiki/Graphics_pipeline

答案 1 :(得分:27)

顶点着色器在每个顶点上完成,而片段着色器在每个像素上完成。片段着色器在顶点着色器之后应用。有关着色器GPU管道的更多信息link text

答案 2 :(得分:19)

Nvidia CG Book

  

顶点变换是图形硬件管道中的第一个处理阶段。顶点变换对每个顶点执行一系列数学运算。这些操作包括将顶点位置转换为屏幕位置以供光栅化器使用,生成纹理的纹理坐标,以及点亮顶点以确定其颜色。

     

光栅化的结果是一组像素位置以及一组片段。基元的顶点数与光栅化时生成的片段数之间没有关系。例如,由三个顶点组成的三角形可能会占据整个屏幕,因此会产生数百万个碎片!

     

早些时候,如果您不确切知道片段是什么,我们会告诉您将片段视为像素。然而,此时,片段和像素之间的区别变得重要。术语像素是“图像元素”的缩写。像素表示特定位置处的帧缓冲器的内容,例如颜色,深度和与该位置相关联的任何其他值。片段是可能更新特定像素所需的状态。

     

使用术语“片段”是因为光栅化将每个几何图元(例如三角形)分解为图元覆盖的每个像素的像素大小的片段。片段具有关联的像素位置,深度值和一组插值参数,例如颜色,次级(镜面)颜色和一个或多个纹理坐标集。这些各种内插参数是从构成用于生成片段的特定几何图元的变换顶点导出的。您可以将片段视为“潜在像素”。如果片段通过各种光栅化测试(在光栅操作阶段,稍后将对此进行描述),片段将更新帧缓冲区中的像素。

答案 3 :(得分:4)

顶点着色器和片段着色器都是三维实现的特征,不使用固定管道渲染。在任何三维渲染中,顶点着色器在片段/像素着色器之前应用。

顶点着色器对每个顶点进行操作。如果您有一个固定的多边形网格,并且您想在着色器中对其进行变形,则必须在顶点着色器中实现它。顶点着色中的任何物理变化都可以在顶点着色器中完成。 / p>

片段着色器从顶点着色器获取输出并关联颜色,像素的深度值等。在这些操作之后,framgment将发送帧缓冲以在屏幕中显示。

某些操作,例如照明计算,你可以在Vertex着色器和freagment着色器中执行。但是碎片着色器提供的结果比顶点着色器更好。

答案 4 :(得分:2)

在通过3D硬件渲染图像时,您通常会有一个网格(点,多边形,线条),这些网格由顶点定义。要通常单独操作顶点模型中的运动或海洋中的波浪,您可以使用顶点着色器。这些顶点可以具有由纹理指定的静态颜色或颜色,以操纵使用片段着色器的顶点颜色。在视图进入屏幕的管道末尾,您还可以使用片段着色器。