着色器的一般结构:

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. 字符串匹配——KMP算法

    关于KMP算法的分析,我觉得这两篇博客写的不错: http://www.ruanyifeng.com/blog/2013/05/Knuth–Morris–Pratt_algorithm.html ht ...

  2. openstack core components use 总结

    1,附加volume(块存储,云硬盘)到vmInstances(虚拟机实列)

  3. jquery插件tab——小试牛刀

    <html> <head> <script type="text/javascript" src="http://ajax.googleap ...

  4. web - 清除浮动

    最理想的方式为 伪类 + content : 例如 div:after{content:"";display:block;clear:both;} div{zoom:1;} 另外, ...

  5. HTML系列(三):文字设置

    一.标题 标题的h1到h6标签,这里不再赘述.值得一提的是,H5中新定义了一个元素<hgroup>,用来将标题和副标题群组.一般在header里将一组标题组合在一起,变成一个区块: < ...

  6. [转载]VMWare网络连接透析

    http://blog.csdn.net/struggleyb/article/details/1102214 以前在学校,VMWare里面的Gentoo Linux是采用network bridge ...

  7. 选择器,$("A+B") 和$("A~B") 的理解

    在我发表这个理解之前,我有看过博客园 永恒浪子 大神的 JQuery选择器大全(http://www.cnblogs.com/hulang/archive/2011/01/12/1933771.htm ...

  8. ping时不知道ping那个Ip的解决办法

    利用命令:nslookup Windows+R键,输入CMD,输入命令nslookup www.baidu.com OK!这得在联网情况下,如果本身nslookup就不行的话,可不可以认为网络就不好使 ...

  9. 简析TCP的三次握手与四次挥手

    TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文章时,我想你也知道TCP的概念了,想要更深入的了解TCP的工作,我们就继续.它只是一个超级麻烦的协议,而它又是互联网的基础,也 ...

  10. VC++学习之网络编程中的套接字

    VC++学习之网络编程中的套接字 套接字,简单的说就是通信双方的一种约定,用套接字中的相关函数来完成通信过程.应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问 ...