着色器的一般结构:

Shader "MyShader/MyShaderName" {
Properties {
// ... properties here ...
}
SubShader {
// ... subshader for graphics hardware A ...
Pass {
// ... pass commands ...
}
// ... more passes if needed ...
}
SubShader {
// ... subshader for graphics hardware B ...
}
// ... Optional fallback ...
FallBack "VertexLit"
}

Shader

Shader命令包含了字符串组成的着色器的名称,这个名字可以用“/”字符细分模拟一个文件夹结构,着色器的名称应该是唯一的

Subshader

一个Shader可以存在一个或多个SubShader,主要是用来为不同的GPU实现着色器功能,所有的SubShader应该使用不同的技术对每个体系结构,实现与现在相似的功能.ShaderLab翻译的代码着色器自动到其他架构,但在某些情况下着色器的功能在移动架构不理想或丢失一些输入。

pass

每个SubShader由若干个pass组成。每个Pass代表了顶点的执行和片段代码的着色器的材质渲染同一个对象。为了性能你可以通过尽可能少数量的pass。

CGPROGRAM.............ENDCG

这个指令定义了再ShaderLab中使用的着色器语言。Unity可以使用CG和GLSL的着色器语言,CG语言是被推荐的,被实施了不同的体系结构的几个优化步骤。

Simple Shader

定点和片段着色器的不同是在渲染管道的开发过程。顶点着色器可以定义为着色器程序修改场景的几何形状,使3d投影,相关片段着色器渲染窗口,定义每个像素的颜色。片段和顶点着色器可以提供更多的功能在新的显卡,如移动顶点位置为每个像素或存储更多的数据。

Shader "Custom/SolidColor" {
SubShader {
Pass {
CGPROGRAM #pragma vertex vert
#pragma fragment frag float4 vert(float4 v:POSITION) : SV_POSITION {
return mul (UNITY_MATRIX_MVP, v);
} fixed4 frag() : SV_Target {
return fixed4(1.0,0.0,0.0,1.0);
} ENDCG
}
}
}

Pragma vertex vert

顶点着色器是一个着色器程序修改场景的几何形状,它执行在场景中的每个点,输出坐标投影,颜色,纹理和其他数据传递到片段着色器。指令 #pragma vertex [function name]用来定义顶点方法的名称。

Pragma fragment frag

片段着色器是一个着色器程序更改图像的属性在渲染窗口。它执行在每个像素,输出信息的像素的颜色。指令 #pragma fragment [function name]用来定义片段方法的名称。

float4 vert(float4 v:POSITION) : SV_POSITION

这句定义了顶点的方法,变量v包含了顶点的值,这个方法被场景渲染中的每个顶点调用。返回的值为顶点在屏幕中的位置的float4变量。使用四个浮点值用来在SV_POSITION中存储在一个2D窗口中的坐标位置。因为预计的几何投影是在齐次坐标,使用两个值的像素屏幕(x,y),一个值为深度(z),和一个其次坐标的值(z)。你可以将齐次坐标转换成3D坐标。但是你将会失去在未来获得的3D位置顶点的能力。同样你可以删除(z)值,但是你将会失去最终渲染时执行深度测试的能力。齐次坐标用于几乎所有的GPU。删除变量的顶点着色器输出着色器不代表任何的代码优化。反而会使代码变得不通用,并且变得更加难以理解。

return mul(UNITY_MATRIX_MVP,v);

这是顶点方法的核心功能,将3D坐标投影到2D窗口,这个过程包括了乘以3D位置矩阵Model-View-Projection (模型到视窗的投影矩阵)。

fixed4 frag() : COLOR

这一句定义了frag方法,这是使用的片段着色器作为其主要功能。这个片段方法没有输入的参数。和输出被定义为一个颜色值定义在一个fixed4变量包含RGBA(红,绿,蓝,α)的颜色。可以使用颜色作为可视化的一个浮点数变量,甚至传递信息在顶点着色器与片段着色器之间。然而COLOR变量是固定值0和1之间,所以希望改变COLOR变量中的值

return fixed4(1.0,0.0,0.0,1.0)

片段着色器的核心功能,为每个像素处理的片段着色器定义了红色。

Unity cg vertex and fragment shaders(二)的更多相关文章

  1. Unity cg vertex and fragment shaders(一)

    cg片段 Cg程序片段写CGPROGRAM和ENDCG之间 开始时的片段可以作为#pragma语句编译指令 Pass { // ... the usual pass state setup ... C ...

  2. 3D Computer Grapihcs Using OpenGL - 06 Vertex and Fragment Shaders

    从这里就接触到了可编程图形渲染管线. 下面介绍使用Vertex Shader (顶点着色器)和 Fragment Shader(像素着色器)的方法. 我们的目标是使用这两个着色器给三角形填充绿色. 添 ...

  3. Vertex and fragment programs

    [Vertex and fragment programs] When you use vertex and fragment programs (the so called "progra ...

  4. UnityShader之顶点片段着色器Vertex and Fragment Shader【Shader资料】

    顶点片段着色器 V&F Shader:英文全称Vertex and Fragment Shader,最强大的Shader类型,也是我们在使用ShaderLab中的重点部分,属于可编程管线,使用 ...

  5. Vertex And Fragment Shader(顶点和片段着色器)

    Vertex And Fragment Shader(顶点和片段着色器) Shader "Unlit/ Vertex­_And_Fragment_Shader " { Proper ...

  6. Android Fragment使用(二) 嵌套Fragments (Nested Fragments) 的使用及常见错误

    嵌套Fragment的使用及常见错误 嵌套Fragments (Nested Fragments), 是在Fragment内部又添加Fragment. 使用时, 主要要依靠宿主Fragment的 ge ...

  7. Android系列之Fragment(二)----Fragment的生命周期和返回栈

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  8. Vertex and Fragment Shader

    Semantics语义词: 定义:GPU工作时,数据通常暂存在寄存器,那么在Cg中,语义词就指定了输入/输出数据和图形硬件寄存器之间的映射关系. 原理:根据输入语义,图形处理器从某个寄存器取数据:然后 ...

  9. Unity 的“Vertex Lit Rendering path“中 shader Pass 的注意事项

    "MADFINGER/Environment/Unlit (Supports Lightmap)"是 ShadowGun 示例中最简单的 shader 了,如下: // Unlit ...

随机推荐

  1. openstack 采用conductor的原因

    供参考. Tan0同学给我的解释: 两个原因 一个是为了isolation做准备 因为升级主要就是升DB的schema 如果让compute直接读写DB,那每次升级都得升compute 现在隔离开之后 ...

  2. error while loading shared libraries: libevent-1.x.so.1

    安装完memcache后启动报错(error while loading shared libraries: libevent-1.x.so.1) 这是由于64位linux会去/usr/lib64目录 ...

  3. FilenameUtils工具类

    转载请出自出处:http://eksliang.iteye.com/blog/2217081 一.概述 这是一个Java操作文件的常用库,是Apache对java的IO包的封装,这里面有两个非常核心的 ...

  4. 转载:SQL语句Where中使用别名作为判断条件

    原文地址:http://www.cnblogs.com/dwfbenben/p/3307941.html 当我们使用某个表达式作为输出的一列时,我们无法再Where条件中直接使用该列作判断条件.   ...

  5. iOS iOS9下修改回HTTP模式进行网络请求

    升级为iOS9后,默认请求类型为https,如何使用http进行请求会报错 The resource could not be loaded because the App Transport Sec ...

  6. UICollectionView 简单的使用和注意事项

    UICollectionView 在创建的时候,要给它一个UICollectionViewFlowLayout (不然会崩溃),就像tableview一样,也要为它注册自定义的cell. UIColl ...

  7. Collections之sort的两个方法(自然排序和自定义比较器排序)

    Collections是个服务于Collection的工具类(静态的),它里面定义了一些集合可以用到的方法. 本文演示了Collections类里sort()的两个方法.第一种只需传入被排序的集合,便 ...

  8. codeforces 55D. Beautiful numbers 数位dp

    题目链接 一个数, 他的所有位上的数都可以被这个数整除, 求出范围内满足条件的数的个数. dp[i][j][k], i表示第i位, j表示前几位的lcm是几, k表示这个数mod2520, 2520是 ...

  9. zoj 3792 Romantic Value

    题目链接 求最小割的值, 以及割边最少的情况的边数. 先求一遍最小割, 然后把所有割边的权值变为1, 其他边变成inf, 在求一遍最小割, 此时求出的就是最少边数. Inf打成inf  WA了好几发. ...

  10. 树莓派读取DHT11传感器的源代码

    import wiringpi2 as gpio owpin=8 #第8脚为1-wire脚 def getval(owpin): tl=[] #存放每个数据位的时间 tb=[] #存放数据位 gpio ...