千锋教育

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 129|回复: 5

[京1902] 第一阶段分享总结——BJ190243008

  [复制链接]

2

主题

14

帖子

60

积分

大虾

Rank: 2

发表于 19-8-21 17:03:37 | 显示全部楼层 |阅读模式
Unity学习Shader中遇到的最大的困难——计算机图形学基础


        在unity班开班后,了解了很多关于unity的知识,其中,令我影响最深刻的是在学习Unity中的Shader时,了解计算机图形学的基础以及编写第一个Shder时所遇到的困难及解决。

       刚开始,了解了关于GPU与CPU架构的不同。

QQ截图20190821162916.jpg

     由于GPU的高并行性,所以,GPU在图形处理数据和复杂算法方面拥有比CPU更高的效率。上图展示了CPU与GPU在架构上的不同,CPU大部分面积为控制器和寄存器,与之相比,GPU拥有更多的ALU用于数据处理,而非数据高速缓存和流控制,这样的结构适合对密集型数据进行并行处理。CPU执行时,一个时刻只处理一个数据,不存在真正意义上的并行性,而GPU拥有多个处理核,在一时间可以并行处理多个数据。

     了解了CPU与GPU的架构之后,还要去了解GPU渲染图形的渲染管线是如何运作的。如下图所示。

QQ截图20190821163506.jpg

     GPU的渲染管线一般分为三个阶段:应用程序阶段、几何阶段、光栅阶段。

     应用程序阶段使用高级编程语言进行开发,主要和CPU和内存打交道,诸如碰撞检测,场景图建立,空间八叉树更新等。在应用程序阶段末端,通过数据总线传输到图形处理硬件中。

     几何阶段,主要负责顶点的变换,光照,裁剪,投影,以及屏幕映射等任务,该阶段基于GPU运行,在该阶段的末端,得到了经过变换和投影之后的顶点坐标、颜色、以及纹理坐标。

     光栅阶段,基于几何阶段的输出数据,为像素(Pixel)正确配色,以便绘制完整的图像,该阶段进行的都是单像素操作,每个像素的信息存储在颜色缓冲区中。

    了解了GPU渲染管线后,就可以进入Shader的编写了。unity中的shader是采用CG语言进行编程的。(我们以创建一个简单的漫反射为例子)


    在ShaderLAb中,首先需要输入当前Shader所使用的属性,属性的格式一般是:Properties { Property [Property ...] }。

    属性中定义的属性,可以在我们的监视面板中显示出来,用于开发者对于Shader数值的微调。这次的漫反射Shader中定义的属性如下:

                _EmissiveColor ("Emissive Color", Color) = (1,1,1,1)
                _AmbientColor  ("Ambient Color", Color) = (1,1,1,1)
                _MySliderValue ("This is a Slider", Range(0,10)) = 2.5
   我们定义了三个颜色,_EmissiveColor ,_AmbientColor 给与了(1,1,1,1)的初值。给予_MySliderValue一个范围和一个初值,用于调试。
  然后在CGPROM中,运用三个属性进行光照的运算。在计算之前,需要将我们创建的三个颜色的数据进行传递。
                float4 _EmissiveColor;
                float4 _AmbientColor;
                float _MySliderValue;
数据传递好之后,就可以使用漫反射的算法来进行数值的计算。
           void surf (Input IN, inout SurfaceOutput o)
                {
                        float4 c;
                        c =  pow((_EmissiveColor + _AmbientColor), _MySliderValue);
                       
                        o.Albedo = c.rgb;
                        o.Alpha = c.a;
                }

我们将_EmissiveColor的属性值加到_AmbientColor中,把结果计算赋值给o.Albedo。然后,使用基本的漫反射函数对属性进行更进一步的计算。
            inline float4 LightingBasicDiffuse (SurfaceOutput s, fixed3 lightDir, fixed atten)
                {
                        float difLight = max(0, dot (s.Normal, lightDir));
                       
                        float4 col;
                        col.rgb = s.Albedo * _LightColor0.rgb * (difLight * atten * 2);
                        col.a = s.Alpha;
                        return col;
                }

   我们需要将unity和SurfaceOut结构体提供的数据做乘法计算。为此我们需要乘上刚刚计算出来的o.Albedo和_Light0.rgb,然后将结果与difLight * atten相乘,返回这个值作为颜色值。至此,一个基本的漫反射就编写完成了,效果如下图所示。
QQ截图20190821170101.jpg






评分

参与人数 1千锋币 +1 收起 理由
安静的美男子 + 1 很给力!

查看全部评分

2

主题

4

帖子

18

积分

菜鸟

Rank: 1

发表于 19-8-21 17:08:06 | 显示全部楼层
哦豁 牛批
回复 支持 反对

使用道具 举报

3

主题

9

帖子

46

积分

菜鸟

Rank: 1

发表于 19-8-21 17:09:28 | 显示全部楼层
哎呦,不错哦
回复 支持 反对

使用道具 举报

2

主题

6

帖子

23

积分

菜鸟

Rank: 1

发表于 19-8-21 17:11:33 | 显示全部楼层
你看你这个代码,他又大又圆
回复 支持 反对

使用道具 举报

1

主题

8

帖子

28

积分

菜鸟

Rank: 1

发表于 19-8-21 17:38:00 | 显示全部楼层
就很棒
回复 支持 反对

使用道具 举报

2

主题

18

帖子

54

积分

大虾

Rank: 2

发表于 19-8-21 18:31:11 | 显示全部楼层
好!(此回复虽有且仅有一个字,却深刻的表达了回复人的深深祝福与刻骨的情感,可谓言简意骇,一字千金,字字扣人心弦,字字催人泪下,足可见回复人扎实的文字功底和信手拈来的写作技巧以及惨绝人寰的创新能力。再加上以感叹号收尾,点睛之笔,妙笔生花,意境深远,照应前文,升华主题)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

订阅|小黑屋|手机版|千锋教育论坛 ( 京ICP备12003911号-3

GMT+8, 19-9-23 00:17 , Processed in 0.380480 second(s), 42 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表