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有些内容模板,我记录下一个会被再次分析。在这里的第一篇文章: )
Unity SurfaceShader 开始编程的更多相关文章
- (译)Cg Programming/Unity(Cg编程/Unity)
最近在学习Unity3d中的shader编程,能找到的中文资料比较少,于是,尝试翻译一下wiki Books上的资料,以方便其他跟我一样的入门学习者.由于是第一次翻译技术资料,经验不足,难免出错,请路 ...
- Unity SurfaceShader详解
声明:文章主要是总结手游开发的经验,只涉及到了前向渲染.未涉及延迟渲染. Unity的Surface Shader本质上就是VS/PS.只不过Unity经过精心设计,将shader划分为了几个关键部分 ...
- Unity粒子系统特性
经代码测试分析,unity粒子系统 Shiruken粒子系统的可编程性比较差.所有的Modules都无法通过代码控制. 可以用ParticleSystem.SetParticles设置粒子,但是设置进 ...
- 【浅墨Unity3D Shader编程】之一 夏威夷篇:游戏场景的创建 & 第一个Shader的书写
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨) ...
- WCF技术剖析之七:如何实现WCF与EnterLib PIAB、Unity之间的集成
原文:WCF技术剖析之七:如何实现WCF与EnterLib PIAB.Unity之间的集成 在这之前,我写过深入介绍MS EnterLib PIAB的文章(参阅<MS Enterprise Li ...
- 再议Unity优化
0x00 前言 在很长一段时间里,Unity项目的开发者的优化指南上基本都会有一条关于使用GetCompnent方法获取组件的条目(例如14年我的这篇博客<深入浅出聊Unity3D项目优化:从D ...
- 有趣而又被忽略的Unity技巧
0x00 前言 本文的内容主要来自YouTube播主Brackeys的视频TOP 10 UNITY TIPS 和TOP 10 UNITY TIPS #2.在此基础上经过自己的实践和筛选之后,选择了几个 ...
- Unity Android 5.6版本Resources.Load效率的问题
0x00 前言 相信不少使用Unity的小伙伴都听说过,甚至也亲身经历过在Unity5.6最初的几个版本中使用Resources.Load方法加载资源变--慢的问题. 这个问题的确是存在的,比如这个i ...
- Unity项目开发过程中常见的问题,你遇到过吗?
最近看到有朋友问一个unity游戏开发团队,需要掌握哪些知识之类的问题.事实上Unity引擎是一个很灵活的引擎,根据团队开发游戏类型的不同,对人员的要求也有差异,所以不能一概而论.但是,一些在Unit ...
随机推荐
- spring交易声明的几个传播特性
近期遇到了一个spring事务导致的问题,所以写了几个小程序了解了一下事务的传播特性,以下分别举样例分别看看事务的传播特性. 事务的几种传播特性 1. PROPAGATION_REQUIRED: 假设 ...
- ANDROID PAD版本号 PHONE版本号 源代码有什么 差别?
ANDROID PAD版本号 PHONE版本号 源代码有什么 差别? 直接把frameworks/base/core/res/res/values/config.xml里面的<bool name ...
- 详细解释VB连接access几种方法数据库
在VB中,连接ACCESS数据库的方法主要有以下三种 使用ADO对象,通过编写代码訪问数据库 Connection 对象 ODBC数据源 使用ADO Data 控件高速创建数据库连接 有三种连接方法 ...
- mysql三学习sql声明学习
SQL 是一门 ANSI 的标准计算机语言,用来訪问和操作数据库系统.SQL 语句用于取回和更新数据库中的数据.SQL 可与数据库程序协同工作,比方MySQL. MS Access.DB2.Infor ...
- FPGA 设计流程,延迟,时间
FPGA 设计流程,延迟,时间 流程:每个时钟周期可以传输的数据比特. 延迟:从输入到时钟周期的输出数据需要经验. 时间:两个元件之间的最大延迟,最高时钟速度. 1 採用流水线能够提高 流量: 比如计 ...
- Yii Framework2.0开发教程(5)数据库mysql性能
继续<Yii Framework2.0开发教程(3)数据库mysql入门> 首先给予一定的尊重yii2数据库支持引进 Yii 基于 PHP's PDO一个成熟的数据库访问层的建立.它提供了 ...
- WebAPI客户端
封装WebAPI客户端,附赠Nuget打包上传VS拓展工具 一.前言 上篇< WebAPI使用多个xml文件生成帮助文档 >有提到为什么会出现基于多个xml文件生成帮助文档的解决方案,因为 ...
- bigdata_hive_Issue of Vectorization on Parquet table
When Vectorization is turned on in Hive:set hive.vectorized.execution.enabled=true;If the involved t ...
- Effective C++ 7
7.预先准备足够的内存情况. new当内存分配请求无法完成,它会抛出一个异常,怎么办异常,这是一个非常现实的,绝对必要的所遇到的问题后. 于c一般使用宏来分配内存和测试分发成功.c++中产阶级似下面的 ...
- jQuery遍历table中间tr td并获得td价值
jQuery遍历table中间tr td并获得td中间值 $(function(){ $("#tableId tr").find("td").each(func ...