Shader_基础篇

0x00 引言

从这篇文章开始我就正式的入了Shader的坑,以前一直觉得会很难(^_^)但是经过我们主程的鼓励和教导决定要好好的把这坑入好。(如若以后提到“好程序”就是我的主程,缘由就顾名思义吧,个人觉得可以是我师傅了,很厉害。)跟着我一起开始你们的Shader之旅吧。(哈哈哈,虽然可能写的不是很好,但是希望能对你们有帮助,对我来说就是一个学习的记录)。随时欢迎各位大佬提出指导意见,指出错误!!!!

最近公司没有项目,好程序就来给我说让我学学shader,说对以后的开发很有帮助,然后给了我一个网站,然后看了两天之后就想放弃了,就在网上到处找Shader相关的书什么的,然后就买了本冯乐乐大神的书。但是还是不知道从何入手,然后好程序过来后看到我毫无头绪,就给我大致讲了一下怎么学,

我说:“我买了一本书,”
他看了一眼说:“这本书很不错。”
我说:“嗯,我在网上看到别人推荐的。”
他说:“等到别人给你推荐的时候,证明别人已经甩你一大截了。”
我:“….不知道说什么了。”
他说:“好好学吧年轻人。”

所以说小伙伴们,不要在收藏n个教程,n个文档,n个视频了,学习要抓紧,不能一拖再拖。好了废话就不多说了,我们开始吧!!!(第一篇往往都是长篇大论都是概念!!不想看的可以跳过,但是建议扫一下。)

0x01 什么是shader

shader就是专门用来渲染3D图形的一种技 术,通过shader,程序设计人员可以自己编写显卡渲染画面的算法,使画面更漂亮、更逼真。
shader又分两种,一种是顶点shader(3D图形都是由一个一个三角形组 成的,顶点shader就是计算顶点位置,并为后期像素渲染做准备的),另一种是像素shader,像素shader顾名思义,就是以像素为单位,计算光 照、颜色的一系列算法。

0x02 什么是Cg?

Cg是最早的为可编程图形硬件设计的高级编程语言。它是英伟达和微软公司一起合作开发出来了语言,如果你非常熟悉C语言或者其他的编程语言,如C++、C#或者Java等,那对于Cg语言你将会非常容易掌握。
Cg可以再多个平台使用。从而更容易针对OpenGL,DirectX,Windows,Linux,Macintosh OS X和控制台平台(如Xbox)。

0x03 可编程渲染管道

图形管道中的并行性

GPU是高度并行的处理器。这是她们表现的主要原因,实际上,他们实现了两种并行性:垂直和水平并行:

下图显示了垂直平行度(由框表示的阶段处理)和水平平行度(每个阶段的多个处理单元由框之间的多个箭头表示)。

可编程和固定功能阶段

OpenGL ES 1.x,核心OpenGL 1.x和Direct3D 7.x的流水线是可配置的固定功能流水线,即不可能在这些流水线中包含程序。在OpenGL(ES)2.0,WebGL和Direct3D 8.0中,管道的两个阶段(顶点着色器和片段着色器阶段)是可编程的,即用Cg(或其他着色语言)编写的小程序(着色器)应用于这些阶段。阶段。在下图中,可编程级由绿色框表示,固定功能级由灰色框表示,数据由蓝色框表示。

数据流

为了编写Cg顶点和片段着色器,了解每个着色器的输入和输出非常重要。为此,了解如何在管道的所有阶段之间传递数据也很有用。这在下图中说明:

顶点输入参数基于顶点数据定义。对于每个顶点输入参数,必须定义语义,该语义指定参数如何与固定功能管道中的数据相关。语义的例子有POSITION,COLOR,NORMAL,TEXCOORD0,TEXCOORD1,等。这使得它可以使用Cg程序,即使最初被设计为一个固定功能管线的API。例如,顶点位置的顶点输入参数应使用POSITION语义,以便所有API都可以为此输入参数提供适当的数据。请注意,顶点位置是对象坐标,即这是3D建模工具中指定的位置。

统一参数(或制服)对于渲染特定基元(例如三角形)时执行的所有顶点着色器和所有片段着色器具有相同的值。但是,可以为其他原语更改它们。通常,它们对构成网格的大量基元具有相同的值。通常,顶点变换,光源和材料的规格等被指定为制服。

顶点输出参数由顶点着色器计算,即每个顶点有一组这些参数的值。语义具有用于每个参数来指定,例如POSITION,SV_POSITION,COLOR,TEXCOORD0,TEXCOORD1,等。通常,必须有与语义一个输出参数POSITION或SV_POSITION,其确定其中原语在屏幕上呈现(“SV”表示“系统价值“并且可以具有特殊意义”。点基元的大小可以由具有语义的输出参数指定PSIZE。对于由基元覆盖的每个像素,内插其他参数(参见“光栅化”部分)。

对于由基元覆盖的每个像素,从顶点输出参数内插片段输入参数。与顶点输出参数类似,必须为每个片段输入参数指定语义。这些语义用于将顶点输出参数与片段输入参数进行匹配。因此,只要语义相同,顶点着色器和片段着色器中相应参数的名称可以不同。

片段输出参数由片段着色器计算。必须指定语义,该语义确定如何在以下固定功能管道中使用该值。大多数片段着色器使用语义指定输出参数COLOR。即使没有DEPTH指定具有语义的输出参数,也会隐式计算片段深度。

纹理数据包括统一采样器,其指定纹理采样单元,该采样单元又指定从中提取颜色的纹理图像。

0x04 摘要

关于基础知识只能说是简单的介绍了,相关的数学基础大家也要补充一下哦~我这里就不发布了,可以看看冯乐乐大神的书有讲到数学基础,或者是Siki学院也有一个课程(不打广告了需要的可以去看一下)。该教程也是经过总结摘要来写的,随时欢迎各位大佬来提出意见!!!☺☺☺

猜你喜欢

转载自blog.csdn.net/A_AiTing/article/details/81508560