着色器shader
+ -

着色器shader分类信介绍-GLSL、HLSL和CG

2024-05-14 63 0
原文转自:https://blog.csdn.net/weixin_56516170/article/details/135266277

画面通过显卡渲染出来呈现在屏幕上,肯定少不了对于显卡的调用和控制。但如果我们每次操作都需要直接对显卡内部的核心、显存之类的进行沟通则太过于复杂了。所以为了解决这种问题,需要对显卡内部的底层指令进行一些封装,把他们转化为较为简洁的API接口,这样我们只需要实现些接口,显卡会自动进行调用,就可以免去复杂的显卡底层操作。

基于OpenGL的GLSL(OpenGL Shading Language)

OpenGL是Khronos Group开发维护的一个规范,它定义了用来操作图形和图片的一系列函数的API,需要注意的是OpenGL本身并非API,只是一套规范,真正的API一般实现在各厂商的显卡驱动。OpenGL部分本身不提供着色器编译器内容,这部分功能依靠显卡驱动更底层的部分来完成,这也意味着只要显卡驱动支持OpenGL则代表可以兼容该平台硬件。并且由于通过硬件实现,提供商可以通过自己对硬件的理解对应的进行更好的把控和优化,从而发挥各方面的最优效果。基于这种直接硬件编译的操作,GLSL得以支持Windows、linux、Mac、移动端等实现跨平台的优点。但这么作弊端也很明显:各个厂家的显卡驱动多少会不太一样,这可能会导致同样的GLSL代码在不同硬件环境下的实际表现效果产生差异。

2)基于DirectX的HLSL(High Level Shading Language)

由微软推出的高阶着色器语言。语法上类似于C和C++,最初是为了弥补Direct可读性差、效率低等一系列缺点而建立在Direct8.x之上的高级语言。不同于GLSL全部交给硬件的方式,HLSL的着色器编译的工作由微软自己来控制,这样避免了由于硬件差异导致的最终结果差异。但缺点则是只能有限支持微软自己的产品。其他产品可能需要有对应的HLSL编译器支持才行。

3)基于NVIDIA公司的CG(C for Graphic)

诞生于英伟达与微软的合作,所以在语法和使用上与HLSL高度一致。一般情况下这两种语言可以进行互相转换,并且本质上二者其实相当于同一种语言。但关键的点在于CG真正意义上进行了跨平台的操作,他会根据不同平台编译与之相对应的中间语言从而实现跨平台无差异化运行,弥补了HLSL的基础上也对OpenGL发起了挑战。

3.什么是Unity Shader

但Unity shader并不是上面说的传统意义上的Shader,他为传统的Shader再次进行了封装,叫做ShaderLab。从定义上来讲就是一个更高一级的渲染抽象层。开发者不必再忙碌于根据平台选择对应图像接口还有反复载入模型设置渲染状态设置顶点着色器片元着色器等等巴拉巴拉,只需要使用ShaderLab编写出Unity Shader,其他的交给渲染引擎就好。所以每一次代码的封装都是对一个实现层进行化繁为简的操作,经过了层层的封装实现,如今的Unity Shader才得以将整个CPU调用不同GPU进行渲染的庞大操作整合在一个ShaderLab当中。

0 篇笔记 写笔记

D3D11像素着色器
这段像素着色器的代码实现了从YUV图像到RGB图像的转换,并保留了原始图像的alpha通道。让我们逐行解释代码:float4 yuva = {txY.Sample(samLinear, input.Tex).r, txU.Sample(samLinear, input.Tex).r, txV.S......
着色器shader分类信介绍-GLSL、HLSL和CG
画面通过显卡渲染出来呈现在屏幕上,肯定少不了对于显卡的调用和控制。但如果我们每次操作都需要直接对显卡内部的核心、显存之类的进行沟通则太过于复杂了。所以为了解决这种问题,需要对显卡内部的底层指令进行一些封装,把他们转化为较为简洁的API接口,这样我们只需要实现些接口,显卡会自动进行调用,就可以免去复杂......
顶点着色器VertexShader
什么是顶点着色器?顶点着色器是一组指令代码,这组指令代码在顶点被渲染时执行。同一时间内,只能激活一个顶点着色器。每个源顶点着色器最多拥有128条指令(DirextX8.1),而在DirectX9,则可以达到256条。为什么大家要使用顶点着色器?顶点着色器可以提高渲染场景速度(直接由显卡自动调用......
像素着色器PixelShader
什么是像素着色器?像素着色器是针对逐个像素进行的。在光栅化阶段,一个三角形在其所覆盖的每个像素处使用插值来计算相应顶点的各个属性,然后把插值后的顶点传递给像素着色器。像素着色器也是一组指令,这组指令在顶点中像素被渲染时执行。在每个执行时间,都会有很多像素被渲染。(像素的数目依靠屏幕的分辨率决定)......
04.开始绘制2
顶点结构与输入布局我们制作的所有3D对象都将由具有属性(如颜色)的点组成,这些属性称为顶点。我们必须制作自己的顶点结构。这是一个重载的顶点结构(因此我们可以轻松动态地创建和编辑顶点),只有一个位置。注意XMFLOAT3。正如我在上一课中提到的,direct3d正在从d3dx数学库转移到更流行的xna......
3.4 顶点着色器-简介
渲染管道中的第一个可编程着色器阶段是顶点着色器。如上所述,可编程着色器阶段执行用HTSL编写的自定义函数。在顶点着色器阶段的情况下,顶点着色器程序是为输入装配程序生成的顶点流中的每个顶点调用一次的函数。每个输入顶点都作为顶点着色器程序的参数接收,并且处理后的顶点作为函数的结果返回。每个顶点着色器调用......
3.4.1顶点着色器管道输入
由于顶点着色器直接位于管道中的输入装配程序之后,因此它自然会从那里接收输入。配置输入装配程序的输入布局所做的所有工作都旨在使创建的顶点与顶点着色器阶段的当前程序所期望的格式相匹配。这就是为什么在创建ID3DllInputl_ayout对象时需要将编译的着色器字节代码作为输入,以确保组装的顶点与执行顶......
D3D11的着色器资源视图和资源视图有什么区别
在Direct3D 11中,着色器资源视图(Shader Resource View,SRV)和渲染目标视图(Render Target View,RTV)是两个不同的概念。着色器资源视图(SRV):主要用途是将资源(如纹理、缓冲区等)绑定到着色器阶段(如像素着色器、顶点着色器等)。可以用来......
gs_texture_2d成员函数
2d纹理可创建的类型是多样的。有是2d的,也有的是2d-cube的。有的是需要绑定的是渲染目标视图,有的是渲染着色器资源视图。其它的一些配置参数多样。 InitTexture(data);//根据纹理数据创建纹理 InitResourceView();//创建着色器资源视图 ......
3.4.2顶点着色器状态配置
作为可编程着色器阶段,顶点着色器实现通用着色器核心功能。这意味着它提供了一组标准的资源接口方法,允许应用程序向着色器程序提供对所需资源的访问。与所有管道操作一样,所有可以更改顶点着色器阶段状态的方法都属于ID3DllDeviceContext接口。我们将查看这些可用资源中的每一个,并了解它们在顶点着......
3.4.3顶点着色器阶段处理
我们现在知道顶点着色器可以从输入装配程序接收哪些数据作为输入数据,以及哪些资源可以被主机应用程序绑定。顶点绘冲区常量缓冲区着色器资源视图我们还知道,顶点着色器程序提供了对单个顶点的自定义处理,而与调用管道的拓扑无关。那么,在顶点着色器程序中执行哪些类型的操作呢?某些类型的操作更适合这个阶段的组......
3.4.4顶点着色器管道输出
在决定在输出顶点结构中包括哪些信息时,需要考虑如何使用管道的其余部分。图3.18显示了渲染管道的框图。顶点着色器阶段之后是一组曲面细分阶段(外壳着色器、曲面细分器和域着色器阶段),然后是几何体着色器,然后是光栅化器阶段。根据顶点着色器和光栅化器阶段之间这些阶段中的哪一个处于活动状态,必须满足不同的......
3.11像素着色器
光栅化器将基本体转换为片段后,片段将传递到像素着色器阶段。像素着色器阶段是渲染管道中的最后一个可编程着色器阶段。它通过调用其像素着色器程序来单独处理每个片段。每个像素着色器调用都是独立运行的——在被处理的单个片段之间不可能进行直接通信。像素着色器完成后,结果是处理后的输出片段,该片段被传递到输出合......
3.11.1像素着色器管道输出
像素着色器阶段从光栅化器阶段接收其输入片段。这意味着像素着色器程序将使用的输入属性也由光栅化器生成。我们已经在光栅化器部分看到,它基于被光栅化的基元内片段的采样位置生成插值属性数据,该位置通常是像素的中心(尽管有时来自其他采样位置)。我们还看到,可以在像素着色器程序中指定各种插值修改器关键字,该程序......
3.11.2像素着色器状态配置
在清楚了解像素着色器程序可以接收哪些数据后,我们现在将考虑应用程序可以使用哪些类型的状态配置。像素着色器阶段是一个可编程阶段,这意味着它可以访问我们在各个管道阶段看到的标准通用着色器核心功能。再一次,我们不会在这里重复任何代码列表,因为它们本质上与我们在顶点着色器部分中看到的相同。下面列出了这些常见......
作者信息
站长漫谈
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!