当前位置: 代码迷 >> 综合 >> 第一篇 初识庐山真面目 ——Unity 3D Shader(1)
  详细解决方案

第一篇 初识庐山真面目 ——Unity 3D Shader(1)

热度:66   发布时间:2023-09-30 16:14:43.0

第一章 虚拟世界的“魔法” ——Shader(着色器)的概念和在3D游戏中的作用

1.1 Shader的概念

1.1.1 虚拟世界中的光明和色彩

Shader即着色器,是一款运行在GPU上的程序,用来对三维物体进行着色处理、光与影的计算、纹理颜色的呈现等,从而将游戏引擎中的一个个作为抽象的几何数据存在的模型、场景和特效,以和真实世界类似的光与影的形式呈现于玩家眼中。
着色器在GPU上所做的工作,的的确确能称得上是一种魔法,因为它能实现人们所想像出来的各种变化。通过Shader可以改变物体的形状、大小、位置、旋转等,更进一步通过对游戏引擎的支持,Shader还可以做Post Effects后期处理,功能和Photoshop很类似。

1.1.2 游戏开发人员的终点

Shader编程是一种对程序员理论基础和想象力的考验和挑战,所以有人会说,会写Shader的程序员才是真正的高手,可以开玩笑的说,当我们开始学习Shader时,就已经站在游戏开发者高手的起点上了。

1.1.3Shader(着色器)简史

伴随着GPU硬件性能的提升,Shader的编程方式经历了从最初的固定管线,到可编程流水线的发展。Shader有顶点Shader和片段Shader两个基本类型,顶点Shader有着可以处理、变换,最终会渲染到屏幕上的网格物体的顶点位置的功能,但它不能生成新的顶点。顶点Shader的输出会传递给流水线的下一步。几何体的网格经过硬件的栅格化后,如处于流水线上的片段Shader会被执行,片段Shader会对一个片段(预备像素)进行各种测试,Z深度测试、Alpha比较测试,能够通过各种测试的片段,最终会被写入渲染的输出帧中,从而成为显示器屏幕上的一个可见像素。

1.2 Shader的实例化

使用c#、c++、java这些面向对象的编程语言时,大家都知道,大多数情况下需要实例化一个类,得到此类的对象,通过对象来进行逻辑上不相关的数据处理。刚刚说的是CPU上的事,在GPU上也有类似的概念,Shader就相当于编程语言中类的概念,当我们需要对某一具体物体使用此Shader定义时,我们需要实例化此Shader从而得到它的一个对象。通过这种对象,我们可以把同一个Shader的含义通过赋予不同的具体内容,比如贴图、颜色等,从而得到丰富多彩的变化,而无需重新定义,大大降低我们的工作强度。和编程语言的类一样,可以在运行时进行实例化。

1.3 Shader的实现语言

1.3.1 Gpu上的编程

CPU与GPU上的编程语言是不同的,目前这种面向GPU的编程有三种高级图像语言可供选择:HLSL(Direct3D图形库软件),GLSL(OpenGL),Cg。Cg能同时兼容能同时兼容Direct3D和OpenGL图形接口。

1.3.2 Unity中的着色器编程

Unity引擎对Shader编程语言的支持是很全面的。不过为了实现最大化的跨平台支持,Unity对Shader编程语言的支持重点是Cg。Cg语言的权威和入门教程在NVIDIA的官方网站上。
链接地址(https://developer.download.nvidia.cn/CgTutorial/cg_tutorial_chapter01.html)
看到这里也许你会想,哇,还要学习一门语言这么麻烦的吗,但是完全不要有这种担心,如果你以前有过一点点的编程基础的话,再来看cg语言真的是很简单,记住几个关键字和常用函数就ok,当然更加深入的我会在后面慢慢的写到。
好吧,我让我小师妹去官网看了cg语言,但三天了什么也没看出个所以人来,所以在写ShaderLab开发实践时不得不停下再开个新坑,写个Shader入门了,如果有大家有需要的话,可以去我博客里另一个分类中看一下。另外,我写的这些东西都是对书上的知识一些汇总与补充,我知道CSDN上大神挺多,但是也是有许多的小白,如果大神有幸临幸我的文章发现错误还望告知,另外也希望大神不要喷我写的简单,弱智了,毕竟我写的是自己两年来的入门基础,是为我们这些基础薄弱的小白准备,还希望CSDN上的大神口下留情。

  相关解决方案