什么是顶点着色器和像素着色器?
它们之间有什么区别?哪个更好?
什么是顶点着色器和像素着色器?
它们之间有什么区别?哪个更好?
DirectX 10和OpenGL 3引入了几何着色器作为第三种类型。
在渲染管道顺序中,
顶点着色器 - 获取一个单一的点并进行调整。可用于计算复杂的**顶点照明计算作为下一阶段的设置和/或使点变形(抖动、缩放等)。
每个生成的基元传递到
几何着色器 - 获取每个变换后的基元(三角形等),并可以对其执行计算。这可以添加新的点、删除它们或根据需要移动它们。这可用于从单个基础网格动态添加或删除细节级别,创建基于点的数学网格(用于复杂的粒子系统)以及其他类似任务。
每个生成的基元都会通过扫描线转换,并将跨越的每个像素传递到
像素着色器(OpenGL中的片段着色器)- 根据顶点着色器传递的内容、绑定的纹理和用户添加的数据计算屏幕上像素的颜色。它无法读取当前屏幕,只能计算当前基元中该像素应该是什么颜色/透明度。
这些像素然后被放在当前绘制缓冲区(屏幕、后备缓冲区、渲染到纹理等)上。
所有着色器都可以访问全局数据,如世界视图矩阵,并且开发人员可以传递简单的变量供它们用于照明或任何其他目的。着色器以汇编语言的方式进行处理,但现代的DirectX和OpenGL版本内置了名为HLSL和GLSL的高级类c语言编译器。NVIDIA还有一个着色器编译器CG,可以在两个API上工作。
对于细分使用,DirectX 11中现在有3个新的着色器。新的完整着色器顺序是顶点->外壳->细分->域->几何->像素。我还没有使用这些新的着色器,因此不太能准确地描述它们。
顶点着色器和像素着色器在图形管线中提供不同的功能。顶点着色器接收和处理与顶点相关的数据(位置、法线、纹理坐标)。
像素(或更准确地说,片段)着色器接收从顶点着色器处理的值进行插值,并生成像素片段。大部分“酷炫”的效果都是在像素着色器中实现的。这是纹理查找和光照等操作发生的地方。
DirectX相关:
着色器(Shader):
一组程序,可将额外的图形特效应用于未在固定渲染管线中定义的物体。 因此,我们可以根据需要拥有自己的图形效果 - 也就是说,我们不再受限于预定义的“固定”操作。
HLSL(High-Level Shading Language)高级着色语言:
HLSL是类似于C++的编程语言,用于实现着色器(像素着色器/顶点着色器)。
顶点着色器(Vertex Shaders):
顶点着色器是在显卡GPU上执行的程序,可对每个顶点逐个进行操作。这使我们能够编写自己的顶点算法。
像素着色器(Pixel Shaders):
像素着色器是在光栅化过程中针对每个像素在显卡GPU上执行的程序。它使我们能够直接访问/操作单个像素。 这种直接访问像素的方式使我们能够实现各种特殊效果,例如多重纹理、逐像素照明、景深、云模拟、火焰模拟和复杂的阴影技术。
注意:顶点着色器和像素着色器(程序)都应在使用之前使用特定版本的编译器进行编译。编译可以像调用API一样使用所需参数(例如文件名、主入口函数等)进行。