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