UnityShader学习记录(一)

PS:本文章摘取自《UnityShader入门精要》一书。

之前一直想Shader是一个很难的东西,在接触《UnityShader入门精要》之后感觉也不是想象中的复杂,但是想要学好shader是一个漫长的过程,基础篇和初级篇看完之后感觉收获挺大,为此,记录一下。

在进入shader之前,需要把渲染流水线搞清楚,什么是渲染流水线?渲染流水线包括什么?渲染流水线举个例子,比如一个工厂做一个产品,从产品的第一道工序到最后的产品出售就是完整的一套渲染流水线,一张图片,从点数据,纹理等信息出发,直到我们可以在屏幕上看到一张图片,这个完整的过程就是渲染流水线,渲染流水线是在CPU和GPU的相互协作下完成的,完整的一套流程是:顶点数据——>顶点着色器——>曲面细分着色器——>几何着色器——>裁剪——>屏幕映射——>三角形摄者——>三角形遍历——>片元着色器——>逐片元操作——>屏幕图像。

看起来很复杂,其实在这些流程中有的是不需要我们操作的,很多是CPU和GPU自行处理的需要我们去用脚本控制的只是其中的几个。

屏幕映射,三角形设置,三角形遍历,屏幕图像是GPU固定实现。

裁剪,逐片元操作是可以配置但是不可以编程实现

顶点着色器,曲面细分着色器,几何着色器,片元着色器是完全可编程的,在这里面顶点着色器是必须编程实现

顶点着色器在后续的Shader编程中很常用的,所以这里重点说一下:顶点着色器主要负责的是坐标的转换和逐顶点光照,坐标转换是把顶点坐标从模型空间转换到裁剪空间里面,这里说到了一个空间转换的问题,对于空间转换这里不说,在后续的文章中会重点说,这里只是在进入学习shader之前简单的了解一点东西。


UnityShader的结构:

properties是用来定义属性的语义块

UnityShader中的属性有以下几种(前面的是类型,后面的是示例,例如_Int是属性名称,“Int”是显示在面板中的名称):

 Int       _Int("Int",Int) = 2

Vector       _Vector("Vector",Vector) = (2,3,4,1)

Float        _Float("Float",Float) = 1.5

2D       _2D("2D",2D) = ""{}

Range()       _Range("Range",Range(0,5)) = 3

Cube       _Cube("Cube",Cube) = "White"{}

Color       _Color("Color",Color) = (1,1,1,1)

3D       _3D("3D",3D) = “Black”{}


SubShader类似于函数的概念,对Shader 的操作和Shader脚本要放在SubShader中,真正意义上的Shader代码都是包含在SubShader语义块中,一个Shader脚本可以拥有很多个SubShader。

一个的SubShader中有一系列的Pass语义块以及一些可选的标签(Tags)和状态,如果标签和状态写在SubShader中,那么这个SubShader中所有的Pass都会受到这些标签和状态的影响,如果只是写在单个Pass中,那么就是这个Pass会有影响。

SubShader中的标签:是SubShader和渲染引擎之间的沟通桥梁,它会告诉渲染引擎希望在什么时候怎么去渲染对象

SubShader中的状态:是对显卡的各种状态的设置,比如是否设置剔除模式等等。 

猜你喜欢

转载自blog.csdn.net/qq_38186269/article/details/82691665