【发布时间】:2009-05-07 01:41:33
【问题描述】:
什么是顶点和像素着色器?
它们之间有什么区别?哪个最好?
【问题讨论】:
标签: graphics shader terminology
什么是顶点和像素着色器?
它们之间有什么区别?哪个最好?
【问题讨论】:
标签: graphics shader terminology
Pixel Shader 是一个 GPU(图形处理单元)组件,可以对其进行编程以在每个像素的基础上运行,并处理诸如照明和凹凸贴图之类的事情。
Vertex Shader 也是 GPU 组件,也使用特定的类汇编语言(如像素着色器)进行编程,但面向场景几何图形,可以执行向对象添加卡通轮廓边缘等操作。
两者各有千秋,各有各的用途。大多数支持 DirectX 9 或更高版本的现代显卡都包含这些功能。
网络上有多种资源可以帮助您更好地了解如何使用这些东西。 NVidia 和 ATI 尤其是有关此主题的文档的好资源。
【讨论】:
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 中,这可能会让某人获得非常高的报酬。侧面的查看窗口将显示渲染结果。 我赚了百万富翁。
【讨论】: