顶点着色器与片段着色器

我已经阅读了一些关于Cg的教程,但是有一件事对我来说并不是很清楚。 顶点和片段着色器究竟有什么区别? 而在什么情况下比另一个更适合?

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

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

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

例如:如果你想要你的多边形是完全红色的,你可以定义所有的顶点红色。 如果你想要特定的效果像顶点之间的渐变,你必须在片段着色器中做到这一点。

换一种方式:

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

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

只要阅读这里的graphicspipe道,一切都会显示出来: http : //en.wikipedia.org/wiki/Graphics_pipeline

顶点着色器在每个顶点上完成,而片段着色器在每个像素上完成。 片段着色器在顶点着色器之后应用。 更多关于着色器GPUpipe道的链接文字

Nvidia CG书

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

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

早些时候,如果您不知道片段究竟是什么,我们告诉您将片段视为一个像素。 然而,在这一点上,片段和像素之间的区别变得重要。 术语“像素”是“像素”的缩写。 像素表示特定位置处的帧缓冲器的内容,诸如颜色,深度以及与该位置相关联的任何其它值。 片段是可能需要更新特定像素的状态。

使用术语“片段”是因为光栅化将每个几何图元(例如三angular形)分解为图元覆盖的每个像素的像素大小的片段。 片段具有相关联的像素位置,深度值以及诸如颜色,辅助(镜面)颜色和一个或多个纹理坐标集的一组插值参数。 这些各种插值参数是从组成用于生成片段的特定几何图元的变换顶点导出的。 你可以把一个片段想象成一个“潜在的像素”。 如果一个片段通过了各种光栅化testing(在光栅操作阶段,简要描述),片段更新帧缓冲区中的一个像素。

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

顶点着色器在每个顶点上运行。如果你有一个固定的多边形网格,并且你想在着色器中变形,你必须在顶点着色器中实现它。顶点着色器中的任何物理变化都可以在顶点着色器中完成。

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

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

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