什么是顶点和像素着色器?
什么是顶点和像素着色器?
他们有什么区别? 哪一个是最好的?
一个像素着色器是一个GPU(graphics处理单元)组件,可以编程,以每像素为基础进行操作,并照顾像照明和凹凸映射的东西。
顶点着色器也是GPU组件,并且也使用像像素着色器那样的特定汇编语言来编程,但是面向场景几何体,并且可以执行诸如将卡通轮廓边缘添加到对象等等。
两者都不如其他,它们各有其特定的用途。 大多数支持DirectX 9或更高版本的现代graphics卡都包含这些function。
networking上有多种资源可以更好地理解如何使用这些东西。 NVidia和ATI尤其是这个主题的文档的好资源。
DirectX 10和OpenGL 3引入了几何着色器作为第三种types。
在渲染stream水线顺序 –
顶点着色器 – 采取一个单一的点,可以调整它。 可用于计算复杂的顶点光照计算作为下一阶段的设置和/或扭曲周围的点(摆动,缩放等)。
每个生成的原始数据都传递给
几何着色器 – 接受每个变换的图元(三angular形等),并可以对其进行计算。 这可以添加新的点,拿走它们或根据需要移动它们。 这可用于从单个基本网格dynamic地添加或删除细节级别,基于点(对于复杂粒子系统)和其他类似任务创buildmath网格。
每个得到的图元都得到了扫描线转换,并且跨度覆盖的每个像素都通过了
像素着色器 (OpenGL中的片段着色器) – 根据顶点着色器传入的内容,绑定纹理和用户添加的数据,计算屏幕上像素的颜色。 这根本不能读取当前屏幕,只是计算当前图元的像素应该是什么颜色/透明度。
然后这些像素被放在当前的绘制缓冲区(屏幕,后缓冲区,渲染到纹理,不pipe)
所有的着色器都可以访问全局数据,比如世界视图matrix,开发人员可以传递简单的variables,以便用于照明或其他目的。 着色器是用类似汇编语言处理的,但是现代的DirectX和OpenGL版本已经内置了分别构build在名为HLSL和GLSL的高级c类语言编译器。 NVidia也有一个名为CG的着色器编译器,可以在两个API上工作。
[编辑以反映我以前的错误顺序(Geometry-> Vertex-> Pixel),如注释中所述。]
DirectX 11中现在有3个新的着色器用于细分。 新的完整着色器顺序是Vertex-> Hull-> Tessellation-> Domain-> Geometry-> Pixel。 我还没有使用这些新的,所以没有资格准确地描述它们。
顶点和像素着色器在graphicspipe线中提供不同的function。 顶点着色器采取和处理与顶点有关的数据(位置,法线,texcoords)。
像素(或者更准确地说,片段)着色器从在顶点着色器中处理的像素中插入值并生成像素片段。 大多数“酷”的东西是在像素着色器中完成的。 这是纹理查找和照明等事情发生的地方。
在开发方面,像素着色器是一个对每个像素单独进行操作的小程序,类似地,顶点着色器对每个顶点单独进行操作。
这些可以用来创build特殊效果,阴影,照明等…
由于每个像素/顶点都是单独操作的,因此这些着色器可以使用现代graphics处理器的高度并行架构。
DirectX特定:
着色器:
一组程序,这些程序对未在固定渲染pipe道中定义的对象实施附加graphics特征。 正因为如此,我们可以根据自己的需要拥有自己的graphics效果 – 也就是说,我们不再局限于预定义的“固定”操作。
HLSL:(高级着色语言):
HLSL是一种类似C ++的编程语言,用于实现着色器(像素着色器/顶点着色器)。
顶点着色器:
顶点着色器是在graphics卡的GPU上执行的程序,其在每个顶点单独运行。 这有利于我们编写自己的自定义algorithm来处理顶点。
像素着色器:
像素着色器是在每个像素的光栅化处理期间在graphics卡的GPU上执行的程序。 它使我们能够直接访问/操作单个像素。 这种对像素的直接访问使我们能够实现多种特效,如多纹理,每像素照明,景深,云模拟,火灾模拟和复杂的阴影技术。
注意:在使用之前,顶点着色器和像素着色器(程序)应该使用特定版本的编译器进行编译。 编译可以像调用具有文件名,主入口函数等所需参数的API一样完成,