我已经阅读了一些关于 Cg 的教程,但有一件事我不太清楚。 顶点着色器和片段着色器到底有什么区别? 在什么情况下一个比另一个更适合?
顶点着色器在每个顶点上完成,片段着色器在每个像素上完成。片段着色器应用在顶点着色器之后。更多关于着色器的 GPU 流水线 链接文本
片段着色器与像素着色器相同。
一个主要的区别是顶点着色器可以操作顶点的属性。也就是多边形的角点。
另一方面,片段着色器负责处理顶点之间的像素外观。它们按照特定的规则在定义的顶点之间进行插值。
例如: 如果您希望您的多边形是完全红色的,您将定义所有顶点红色。如果你想获得特定的效果,比如顶点之间的渐变,你必须在片段着色器中完成。
换句话说:
顶点着色器是图形流水线的早期步骤的一部分,我认为它介于模型坐标转换和多边形裁剪之间。在这一点上,还没有真正做什么。
然而,片段/像素着色器是光栅化步骤的一部分,其中计算图像和顶点之间的像素填充或“着色”。
只要阅读这里的绘图管线,一切都会显现出来: Http://en.wikipedia.org/wiki/graphics_pipeline
在通过3D 硬件渲染图像时,通常有一个网格(点、多边形、线) ,这些网格由顶点定义。要单独操作顶点,通常是为了模型中的运动或海洋中的波浪,您可以使用顶点着色器。这些顶点可以有由纹理分配的静态颜色或颜色,来操纵你使用片段着色器的顶点颜色。在管道的末尾,当视图进入屏幕时,您还可以使用片段着色器。
Nvidia Cg 教程 :
顶点变换是图形硬件流水线的第一个处理阶段。顶点转换对每个顶点执行一系列数学运算。这些操作包括将顶点位置转换为光栅化器使用的屏幕位置,生成纹理坐标以进行纹理处理,以及照明顶点以确定其颜色。 光栅化的结果是一组像素位置和一组片段。一个原语拥有的顶点数量和它被栅格化时生成的片段数量之间没有关系。例如,一个由三个顶点组成的三角形可以占据整个屏幕,因此产生数百万个碎片! 早些时候,我们告诉你,如果你不确切知道碎片是什么,就把碎片想象成像素。然而,在这一点上,片段和像素之间的区别变得非常重要。像素这个术语是“图片元素”的简称像素表示位于特定位置的帧缓冲区的内容,如颜色、深度和与该位置关联的任何其他值。片段是可能需要更新特定像素的状态。 使用术语“片段”是因为栅格化将每个几何原语(如三角形)分解为原语所覆盖的每个像素的像素大小的片段。片段具有相关联的像素位置、深度值和一组内插参数,如颜色、二次(镜面)颜色和一个或多个纹理坐标集。这些各种各样的插值参数是从构成用于生成碎片的特定几何原语的转换顶点导出的。你可以把一个片段想象成一个“潜在的像素”如果一个片段通过了各种光栅化测试(在光栅操作阶段,稍后将描述) ,该片段将更新帧缓冲区中的一个像素。
顶点变换是图形硬件流水线的第一个处理阶段。顶点转换对每个顶点执行一系列数学运算。这些操作包括将顶点位置转换为光栅化器使用的屏幕位置,生成纹理坐标以进行纹理处理,以及照明顶点以确定其颜色。
光栅化的结果是一组像素位置和一组片段。一个原语拥有的顶点数量和它被栅格化时生成的片段数量之间没有关系。例如,一个由三个顶点组成的三角形可以占据整个屏幕,因此产生数百万个碎片!
早些时候,我们告诉你,如果你不确切知道碎片是什么,就把碎片想象成像素。然而,在这一点上,片段和像素之间的区别变得非常重要。像素这个术语是“图片元素”的简称像素表示位于特定位置的帧缓冲区的内容,如颜色、深度和与该位置关联的任何其他值。片段是可能需要更新特定像素的状态。
使用术语“片段”是因为栅格化将每个几何原语(如三角形)分解为原语所覆盖的每个像素的像素大小的片段。片段具有相关联的像素位置、深度值和一组内插参数,如颜色、二次(镜面)颜色和一个或多个纹理坐标集。这些各种各样的插值参数是从构成用于生成碎片的特定几何原语的转换顶点导出的。你可以把一个片段想象成一个“潜在的像素”如果一个片段通过了各种光栅化测试(在光栅操作阶段,稍后将描述) ,该片段将更新帧缓冲区中的一个像素。
顶点着色器和片段着色器都是不使用固定流水线渲染的3-D 实现的特性。在任何三维渲染中,顶点着色器应用在片段/像素着色器之前。
顶点着色器操作每个顶点。如果你有一个固定的多边形网格,你想在着色器中使它变形,你必须在顶点着色器中实现它。也就是说,顶点外观的任何物理变化都可以在顶点着色器中完成。
片段着色器从顶点着色器输出并关联颜色、像素的深度值等。在这些操作之后,片段被发送到 Framebuffer,以便在屏幕上显示。
有些操作,例如光照计算,可以在顶点着色器和片段着色器中执行。但片段着色器提供了比顶点着色器更好的效果。