UnityShader官方案例之编写顶点和片段着色器

来源:互联网 发布:类中静态变量和常量php 编辑:程序博客网 时间:2024/06/05 23:44

“Look well to this day. Yesterday is but a dream and tomorrow is only a vision. But today well lived makes every yesterday a dream of happiness and every tomorrow a vision of hope. Look well therefore to this day.”
*引自网络*

本节学习vertex&fragment shader,,官方只给了一些基础的语法和注意事项, 所以翻译shader的文章将会暂停一段时间,以后会自己写一些小东西

官网shader案例还有很多,比如:具有 DX11 密铺 (Tessellation) 的表面着色器**以及更复杂的compute shader(计算shader)

step1
着色器程序的编写采用 Cg/HLSL 语言,是通过在着色器文本中 Pass 命令内的某处嵌入“代码片段”的来实现的
回想下以前的surfaceShader,在一个SubShader下是不需要也不能加pass的,但是在vertex&fragment shader中,想要执行渲染命令,那么就必须为其指定一个pass通道。

在CG程序代码块中
编译指令

> #pragma  指示编译哪些着色器函数的编译指令:

下面列举一些比较基础的着色器函数

> #pragma vertex 名称 - 将函数名称编译为顶点着色器。#pragma fragment 名称 - 将函数名称编译为片元着色器。    #pragma target 名称 - 要编译成哪个着色器目标

就先写这几个,写多了除了懵还有别的么。

step2

其实在形式上,vertex&fragment shader 跟 surfaceShader并没有什么不同
都是用编译指令去定义,都需要用同名函数去实现,但是其在内容上以及在输出上是不一样的(感觉像是废话︿( ̄︶ ̄)︿)

*简单介绍下shaderLab*
(1)**UsePass

UsePass 命令使用来自另一个着色器的已命名通道。着色器/名称包含着色器的名称与通道的名称,两者用斜杠字符隔开
UsePass “Shader/Name””

(2)GrabPass

GrabPass 属于子着色器。它有两种形式:


GrabPass { }
会将当前屏幕内容捕获到纹理中。纹理可通过
_GrabTexture
名称在较远通道中访问。请注意:这种形式的捕获通道会为每个使用它的对象进行昂贵的屏幕捕获操作!
GrabPass { “TextureName” }
将屏幕内容捕获到纹理中,但仅为第一个使用指定纹理名称的对象每帧捕获一次。纹理可通过指定纹理名称在较远通道中访问。当您的场景中有多个使用捕获通道的对象时,这是一个性能更佳的方法。

Shader "GrabPassInvert" {    SubShader {        // 在所有不透明几何结构之后进行自我绘制        Tags { "Queue" = "Transparent" }        // 将对象之后的屏幕捕捉进 _GrabTexture        GrabPass { }        // 用以上生成的纹理渲染对象,并反转其颜色        Pass {            SetTexture [_GrabTexture] { combine one-texture }        }    }} 

该着色器有两个通道:第一个通道在渲染时捕获对象后面的任何物体,然后将其应用于第二个通道。当然,现在使用反转混合模式可更便宜地获得同样的效果。

blend(混合模式)

渲染图形时,执行所有着色器且应用所有纹理之后,将像素写入屏幕。混合 (Blend) 命令控制这些像素如何与已有像素混合。

> 语法

Blend Off
关闭混合
Blend SrcFactor DstFactor
配置和启用混合。生成的颜色乘以 SrcFactor。已在屏幕上的颜色乘以 DstFactor,然后两者相加。
Blend SrcFactor DstFactor, SrcFactorA DstFactorA
与上述操作相同,但是混合 alpha 通道要使用不同的因子
BlendOp Min | Max | Sub | RevSub
不将混合颜色相加,而是对它们进行不同的操作。

以下是一个小的示例着色器,它可以在已显示在屏幕上的任何东西上添加纹理:

Shader "Simple Additive" {    Properties {        _MainTex ("Texture to blend", 2D) = "black" {}    }    SubShader {        Tags { "Queue" = "Transparent" }        Pass {            Blend One One            SetTexture [_MainTex] { combine texture }        }    }}

(3)回退 (Fallback)
这个就简单了
回退 (Fallback) 可定义在所有子着色器 (Subshader) 之后。大致来说就是“如果所有子着色器都无法在该硬件上运行,请尝试使用另一个着色器的子着色器”。

> 语法

Fallback”name”
回退到有给定名称的着色器。
回退关闭 (Fallback Off)
明确表示即使没有子着色器可以在该硬件上运行,也不会有回退以及应要打印的警告。

其他的内容shader内容,理解之后再写吧,像一些高级的shaderLab用法,以我现在的水平看起来很捉鸡啊( ⊙ o ⊙ )啊~~

以后会写对3D数学,3D渲染,以及顶点&片段着色器的理解,不当之处,还望指教(*^__^*)

0 0
原创粉丝点击