Unity SurfaceShader 开始编程

Unity SurfaceShader 开始编程

在14年年初的时候,以前给自己定下了今年要实现的三个目标。当中之中的一个就是学会编写自己的Shader,并可以投入到实际的项目应用之中。如今,转眼间日历已经翻到了6月份,而自己关于Shader的学习,还停留在三天打鱼两天晒网的零碎学习状态,自己心里非常是着急。平时的工作任务多,挤掉了自己的学习时间是一方面。

但更重要的。还是由于自己没有制定一个稳步的计划。来监督自己利用一切可以利用的时间完毕学习的内容。相反,自己做的太过任意了。

所以。继续以博文的形式来督促自己的学习,把关于shader学习的点滴都记录下来。并制定自己的学习进度计划,在规定的时间节点,必须完毕计划的内容。迈出这一步,算是一个開始——Unity
ShaderLab基础学习记录。

Unity 使用自己定义的ShaderLab来组织Shader的内容。并针对不同的平台进行编译。在Unity自己定义的ShaderLab中,通过SurfaceShader结构封装了能处理不同的照明及阴影,同一时候还能在Unity的两个渲染路径(Forward和Deferred)下正常工作的极具复杂性的Shader。SurfaceShader的基本结构例如以下所看到的:

Shader"Custom/NewShader" {

Properties {

// 一些属性,Shader的数据接口

}

SubShader {

// SubShader包装了一个渲染方案。这是我们编写Shader时的主阵地

}

SubShader {

// SubShader可有多个。这是为了可以让我们编写的Shader适应不同的显卡

}

FallBack "Diffuse"

}

我们在Properties块中可以定义的所有属性,例如以下所看到的:

Properties {

_Texture ("Texture",2D) = "white" {}             // 图片(纹理)形式的属性

_Color ("Color",Color) = (1, 1, 1, 1)               // 颜色属性

_Cube ("3D Map",Cube) = "white" {}             //3D纹理,须要6张图片

_Vector ("Vector4",Vector) = (1, 1, 1, 1)       // 4个元素的向量

_Float ("Float",float) = 1.0                             //浮点数

_Range ("Range", range(-10,10)) = 1.0       // 限定范围的浮点数

}

在Unity的ShaderLab所提供的结构中,Shader的逻辑代码部分。都位于SubShader中的GLSLPROGRAM—ENDGLSL部分(GLSL语言)。或者是CGPROGRAM—ENDCG部分(Cg/HLSL语言),我们能够选择不同的着色器语言来进行编写。

以上在Properties块中定义的属性,必须在逻辑代码块中(即GLSLPROGRAM—ENDGLSL或CGPROGRAM—ENDCG部分)再声明一次才干使用。

它们在Cg代码中的声明方式例如以下:

CGPROGRAM

sampler2D _Texture;

float4 _Color;

samplerCUBE _Cube;

float4 _Vector;

float _Float;

float _Range;

… …

ENDCG

要格外注意的一点是,在Cg代码块中声明的变量名称必须与Properties块中变量的名称保持一致。否则会提示错误。

综上所述,一个SurfaceShader的完整代码为:

Shader"Custom/NewShader" {

Properties {

_MainTex("Texture",2D) = "white" {}             // 图片(纹理)形式的属性

}

SubShader {

Tags {"RenderType"="Opaque" }

LOD 200

CGPROGRAM

#pragma surface surf Lambert

sampler2D _MainTex;

struct Input {

float2 uv_MainTex;

};

void surf (Input IN, inoutSurfaceOutput o) {

half4 c = tex2D(_MainTex, IN.uv_MainTex);

o.Albedo = c.rgb;

o.Alpha = c.a;

}

ENDCG

}

FallBack "Diffuse"

}

这也是在Unity创建Shader默认模板。

关于此默认Shader有些内容模板,我记录下一个会被再次分析。在这里的第一篇文章: )

时间: 2024-11-12 21:20:53

Unity SurfaceShader 开始编程的相关文章

Unity SurfaceShader 编程起步

Unity SurfaceShader 编程起步 在14年年初的时候,曾经给自己定下了今年要实现的三个目标,其中之一就是学会编写自己的Shader,并能够投入到实际的项目应用之中.现在,转眼间日历已经翻到了6月份,而自己关于Shader的学习,还停留在三天打鱼两天晒网的零碎学习状态,自己心里很是着急.平时的工作任务多,挤掉了自己的学习时间是一方面.但更重要的,还是因为自己没有制定一个稳步的计划,来监督自己利用一切可以利用的时间完成学习的内容,相反,自己做的太过随意了.所以,继续以博文的形式来督促

蛋哥的学习笔记之-基于Unity的Shader编程:X-1 音乐水波特效

蛋哥的学习笔记之-基于Unity的Shader编程:X-1 音乐水波特效 热度 13728 2015-7-11 23:34 |个人分类:蛋哥的学习笔记之-基于Unity的Shader编程| 音乐, Unity, Shader, 水波, Shader, Shader, Shader, Shader 一.要干些啥: 很久很久没有写文档了,前段时间做了个个人很喜欢的,自认为比较原创的小特效,所以写个文档纪念下(本人特别喜欢音乐) 思路其实很简单,首先用顶点着色器实现一般的水波特效,然后解析音频数据(我

【Unity】AOP编程--拦截,用于缓存和异常处理

第一步:定义拦截行为:CachingBehavior 和 ExceptionLoggingBehavior 他们都继承接口:IInterceptionBehavior (程序集 Microsoft.Practices.Unity.Interception.dll, v2.1.505.0 命名空间:Microsoft.Practices.Unity.InterceptionExtension) 需要实现连个接口: public IEnumerable<Type> GetRequiredInter

Unity基础 GUI编程

脚本语言:C# 附上一张图说明Unity GUI编程中可用的控件:(可能有遗漏) 下面列出一些例子来说明: 1.Groups : 在固定Layout模式中起到组织可用项的功能,它让你在屏幕的一个区域中包含多个控件.把定义的控件放在GUI.BeginGroup()和 GUI.EndGroup()这对函数中间,所有控件的位置坐标都以Groups的0坐标为起点,假如更改了group坐标,那么内部的控件也会跟随改变. 示例代码: using UnityEngine; using System.Colle

(译)Cg Programming/Unity(Cg编程/Unity)

最近在学习Unity3d中的shader编程,能找到的中文资料比较少,于是,尝试翻译一下wiki Books上的资料,以方便其他跟我一样的入门学习者.由于是第一次翻译技术资料,经验不足,难免出错,请路过的大神们批评指正,共同帮助我等新手少走弯路,谢谢. 下面翻译开始: (原文:https://en.wikibooks.org/wiki/Cg_Programming/Unity) Cg programming in the game engine Unity is considerably eas

Unity中用Shader编程实现3D红心

有些形状,即使没有3D美术设计师提供模型,也可以用代码生成. 对于想保持原创性不想借用他人模型的独立开发者来说,这无非是一个很重要的途径. 今天献给大家的是用Shader编程实现的一颗红心,寄托下淡淡的思乡情. 最终效果图:      开发环境:Unity 4.5.5 第一步:在原点处创建标准球体 GameObject  ->  Create Other ->  Sphere (注意:大小是默认的) 第二步:在Shader文件夹中创建HeartShader.shader文件 源代码: Shad

【Unity】Shader编程 基础总结

Shader编程一直是一个比较难入门难上手的主题,本篇对Unity Shader编程的一些基础和要点进行了总结. 包括Shader编程相关知识图谱.Shader编程相关数据类型.Shader核心结构体等(后续继续补充). 每个部分相互独立,可以单独参考,亦可作为一个整体参考. 博文首发:http://blog.csdn.net/duzixi 一.Shader编程知识图谱 个人对Shader编程的理解凝在四个字:色即是光. 无论是要手写Shader程序,还是利用各类Shader制作插件(如Shad

Unity的GPU编程问题解析

在游戏蛮牛知识问答里面经常有人询问关于Unity中的Shader编程方面的函数问题,GPU编程其实就是把固定流水线的各种矩阵变换放到了GPU里面进行. 下面给大家主要介绍一些基本的常识: 我们在Shader编程中经常使用 Vertex & Fragment Shaders,通过举例说明: struct Vert {       float4 vertex : POSITION;       float3 normal : NORMAL;       float4 texcoord : TEXCO

unity在C#编程中的一些引用说明

System包含用于定义常用值和引用数据类型.事件和事件处理程序.接口.属性和处理异常的基础类和基类.其他类提供支持下列操作的服务:数据类型转换,方法参数操作,数学计算,远程和本地程序调用,应用程序环境管理以及对托管和非托管应用程序的监管. System.Collections包含定义各种对象集合(如列表.队列.位数组.哈希表和字典)的接口和类. System.Collections.Generic包含定义泛型集合的接口和类:泛型集合允许用户创建强类型的集合,这种集合在类型安全和性能上均优于非泛