什么是顶点着色器和像素着色器?
它们之间有什么区别?哪一个是最好的?
DirectX 10 和 OpenGL 3 引入了几何着色器作为第三种类型。
在渲染管道顺序中 -
顶点着色器- 采用单个点并可以对其进行调整。可用于计算复杂的**顶点照明计算作为下一阶段的设置和/或扭曲周围的点(摆动、缩放等)。
每个生成的原语都被传递给
几何着色器- 获取每个转换后的图元(三角形等)并可以对其执行计算。这可以根据需要添加新点、将其移除或移动它们。这可用于从单个基础网格动态添加或删除细节级别,基于点创建数学网格(用于复杂粒子系统)和其他类似任务。
每个生成的图元都得到扫描线转换,跨度覆盖的每个像素都通过
像素着色器(OpenGL 中的片段着色器) - 根据顶点着色器传入的内容、绑定纹理和用户添加的数据计算屏幕上像素的颜色。这根本无法读取当前屏幕,只需计算出该像素对于当前图元应该是什么颜色/透明度。
然后将这些像素放入当前绘制缓冲区(屏幕、后缓冲区、渲染到纹理等)
所有着色器都可以访问全局数据,例如世界视图矩阵,开发人员可以传递简单的变量供它们用于照明或任何其他目的。着色器是用一种类似汇编语言的语言处理的,但现代 DirectX 和 OpenGL 版本已经内置了分别称为 HLSL 和 GLSL 的高级类 c 语言编译器。NVidia 也有一个名为 CG 的着色器编译器,它适用于这两种 API。
[编辑以反映我之前的错误顺序(几何->顶点->像素),如评论中所述。]
现在 DirectX 11 中使用了 3 个新的着色器来进行曲面细分。新的完整着色器顺序是 Vertex->Hull->Tessellation->Domain->Geometry->Pixel。我还没有使用这些新的,所以没有资格准确地描述它们。
顶点和像素着色器在图形管线中提供不同的功能。顶点着色器获取并处理与顶点相关的数据(位置、法线、纹理坐标)。
像素(或更准确地说,片段)着色器采用从顶点着色器中处理的值进行插值并生成像素片段的值。大多数“酷”的东西都是在像素着色器中完成的。这是发生纹理查找和照明等事情的地方。
DirectX 特定:
着色器:
为未在固定渲染管道中定义的对象实现附加图形功能的程序集。因此,我们可以根据需要拥有自己的图形效果——即,我们不再局限于预定义的“固定”操作。
HLSL:(高级着色语言):
HLSL 是一种类似于 C++ 的编程语言,用于实现着色器(像素着色器/顶点着色器)。
顶点着色器:
顶点着色器是在显卡的 GPU 上执行的程序,它单独对每个顶点进行操作。这有助于我们编写自己的自定义算法来处理顶点。
像素着色器:
像素着色器是在每个像素的光栅化过程中在显卡的 GPU 上执行的程序。它为我们提供了直接访问/操作单个像素的便利。这种对像素的直接访问使我们能够实现各种特殊效果,例如多纹理、每像素照明、景深、云模拟、火灾模拟和复杂的阴影技术。
注意:顶点着色器和像素着色器(程序)在使用前都应使用特定版本的编译器进行编译。编译可以像使用所需参数(如文件名、主入口函数等)调用 API 一样完成,
在开发方面,像素着色器是一个单独对每个像素进行操作的小程序,类似地,顶点着色器对每个顶点进行单独操作。
这些可用于创建特殊效果、阴影、照明等......
由于每个像素/顶点都是单独操作的,因此这些着色器适用于现代图形处理器的高度并行架构。
曾经有一个 Flash 演示,显示从靠近观察者到反射距离的曝光平面。这表示通过其路径中的任何其他平面返回观察者的反射光距离的观察平面。这些平面上的任何东西都可以按原样使用,也可以在参数化数据值中使用以改变返回光或颜色。这是您将看到的最简单的解释。我希望 Flash 演示仍然可以执行,但由于安全原因不再可以执行。实际上,任何设置 3d 着色器的物体都可以在 Z 轴上显示 x 个垂直平面,显示与这些平面的交互作用。该视图可以以与显示概念视图的方式相同的角度显示,从而使解剖变得明显。换句话说,视图将是管道所见和观察者所见的角度横截面。事实上,当将此着色器用作着色器创建时,开发人员只需将必要的平面插入到 Z 轴 adhoc 中,这可能会让某人获得非常高的报酬。侧面的查看窗口将显示渲染结果。我让百万富翁。