顶点着色器 vs 片段着色器

163

我阅读了一些有关Cg的教程,但有一件事对我来说不太清楚。顶点着色器和片元着色器之间到底有什么区别?在哪些情况下,一个比另一个更适合使用?


24
@genpfault 这绝对不是重复的问题,它询问的是顶点着色器与片元着色器之间的区别。而“重复”的问题是关于像素和顶点着色器的。即使片元着色器是像素着色器的一部分。如果我们在谷歌上搜索还是不懂,我们就会提出问题,因此需要使用同义词来提出两个问题。在提问者的脑海中,它们是两个不同的问题。 - zardilior
5个回答

259

片段着色器(Fragment Shader)与像素着色器(Pixel Shader)是相同的。

主要区别在于顶点着色器(Vertex Shader)可以操作顶点的属性,这些属性是多边形角点的坐标。

而片段着色器则负责处理两个顶点之间的像素颜色。它们会按照特定的规则插值生成定义好的顶点间的颜色过渡效果。

例如: 如果想让多边形完全呈现红色,需要将所有的顶点坐标设置为红色。如果想实现特殊的效果如渐变,就需要通过片段着色器来实现。

换言之:

顶点着色器是图形渲染管线中的早期阶段之一,在模型坐标变换和多边形裁剪之间执行。此时还没有进行任何真正的处理。

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

如果想了解有关图形渲染管线的更多信息,请参阅以下链接: http://en.wikipedia.org/wiki/Graphics_pipeline


5
实际上,你不一定要将顶点属性设置为红色:你可以在片元着色器中设置fragcolor为红色,这样更加明智,也更符合颜色/光栅化的逻辑。 - RichieHH

48

顶点着色器(Vertex shader)在每个顶点上执行,而片元着色器(Fragment shader)在每个像素上执行。片元着色器在顶点着色器之后应用。有关GPU管道的更多信息,请参见链接文字


32

Nvidia Cg 教程:

顶点变换是图形硬件流水线中的第一个处理阶段。它对每个顶点执行一系列数学操作,包括将顶点位置转换为屏幕位置以供光栅化使用、生成纹理坐标进行纹理映射以及为了确定其颜色而对顶点进行光照。

光栅化的结果是一组像素位置和一组片元。一个基元(primitive)所产生的片元数量与其顶点数量之间没有关系。例如,由三个顶点组成的三角形可能覆盖整个屏幕,从而生成数百万个片元!

前面我们告诉你,如果你不知道什么是片元,可以将其看作像素。但是在这一点上,片元和像素之间的区别变得重要起来。像素表示帧缓冲区中特定位置的内容,如该位置的颜色、深度和任何其他值。片元是更新特定像素可能需要的状态。

之所以称之为“片元”,是因为光栅化将每个几何基元(例如三角形)分成覆盖该基元的每个像素大小的片元。一个片元有一个关联的像素位置、深度值以及一组插值参数,例如颜色、次要(高光)颜色和一个或多个纹理坐标集。这些插值参数由构成生成片元的特定几何基元的变换后的顶点导出。可以将片元看作是“潜在像素”。如果片元通过各种光栅测试(在光栅操作阶段中描述),则该片元会更新帧缓冲区中的像素。


5
顶点着色器和片段着色器都是3D实现中的特性,不使用固定管线渲染。在任何3D渲染中,顶点着色器先于片段/像素着色器应用。
顶点着色器对每个顶点进行操作。如果您有一个固定的多边形网格,并且想要在着色器中变形它,则必须在顶点着色器中实现它。也就是说,可以通过顶点着色器来对顶点外观进行任何物理上的改变。
片段着色器获取顶点着色器的输出并关联颜色、像素深度值等信息。在这些操作之后,片段被发送到帧缓冲区以在屏幕上显示。
一些操作,例如光照计算,您可以在顶点着色器和片段着色器中执行。但是,片段着色器比顶点着色器提供更好的结果。

3
在通过3D硬件渲染图像时,通常会使用网格(点、多边形、线段)来定义顶点。要单独操作顶点,通常用于模型运动或海洋中的波浪,您可以使用顶点着色器。这些顶点可以具有静态颜色或由纹理分配的颜色,要操作顶点颜色,您可以使用片元着色器。在管道的末端,当视图到达屏幕时,您也可以使用片元着色器。

2
“单独操作顶点通常用于模型中的动作或海洋中的波浪”,虽然这可能是正确的,但更适合使用几何着色器,在顶点着色器之后和像素/片段着色器之前进行处理。 - Placeable

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接