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 开始编程的更多相关文章

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

    最近在学习Unity3d中的shader编程,能找到的中文资料比较少,于是,尝试翻译一下wiki Books上的资料,以方便其他跟我一样的入门学习者.由于是第一次翻译技术资料,经验不足,难免出错,请路 ...

  2. Unity SurfaceShader详解

    声明:文章主要是总结手游开发的经验,只涉及到了前向渲染.未涉及延迟渲染. Unity的Surface Shader本质上就是VS/PS.只不过Unity经过精心设计,将shader划分为了几个关键部分 ...

  3. Unity粒子系统特性

    经代码测试分析,unity粒子系统 Shiruken粒子系统的可编程性比较差.所有的Modules都无法通过代码控制. 可以用ParticleSystem.SetParticles设置粒子,但是设置进 ...

  4. 【浅墨Unity3D Shader编程】之一 夏威夷篇:游戏场景的创建 & 第一个Shader的书写

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)  ...

  5. WCF技术剖析之七:如何实现WCF与EnterLib PIAB、Unity之间的集成

    原文:WCF技术剖析之七:如何实现WCF与EnterLib PIAB.Unity之间的集成 在这之前,我写过深入介绍MS EnterLib PIAB的文章(参阅<MS Enterprise Li ...

  6. 再议Unity优化

    0x00 前言 在很长一段时间里,Unity项目的开发者的优化指南上基本都会有一条关于使用GetCompnent方法获取组件的条目(例如14年我的这篇博客<深入浅出聊Unity3D项目优化:从D ...

  7. 有趣而又被忽略的Unity技巧

    0x00 前言 本文的内容主要来自YouTube播主Brackeys的视频TOP 10 UNITY TIPS 和TOP 10 UNITY TIPS #2.在此基础上经过自己的实践和筛选之后,选择了几个 ...

  8. Unity Android 5.6版本Resources.Load效率的问题

    0x00 前言 相信不少使用Unity的小伙伴都听说过,甚至也亲身经历过在Unity5.6最初的几个版本中使用Resources.Load方法加载资源变--慢的问题. 这个问题的确是存在的,比如这个i ...

  9. Unity项目开发过程中常见的问题,你遇到过吗?

    最近看到有朋友问一个unity游戏开发团队,需要掌握哪些知识之类的问题.事实上Unity引擎是一个很灵活的引擎,根据团队开发游戏类型的不同,对人员的要求也有差异,所以不能一概而论.但是,一些在Unit ...

随机推荐

  1. Intent常用使用汇总

    方法一:调用默认的短信程序Intent intent = new Intent(Intent.ACTION_VIEW);intent.setType("vnd.android-dir/mms ...

  2. 补间动画实现(tween)

    1.补间动画的概念: 补间动画:仅仅须要开发人员设置好动画的開始与结束的关键帧 中间帧有喜用计算机补齐. 2.种类:分为4种: ①alpha 透明度 ②alpha 透明度 ③translate 位置移 ...

  3. springMVC+angular+bootstrap+mysql的简易购物网站搭建

    springMVC+angular+bootstrap+mysql的简易购物网站搭建 介绍 前端的css框架用了bootstrap, 以及bootstrap的JS组件, 以及很好用的angular(a ...

  4. 网络编程I/O功能介绍

    read和write #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); ssize_t write(in ...

  5. 飞天熊猫游戏源代码android文本

    这款游戏是前一段时间完毕的一个项目,飞行熊猫游戏源代码android版.飞行熊猫基于cocos2d游戏引擎开发.包含了谷歌admob广告支持,没有不论什么版权问题.大家能够自由改动和上传应用商店. 1 ...

  6. leetcode 刷道题 70 earch Insert Position 二进制搜索插入位置

    Given a sorted array and a target value, return the index if the target is found. If not, return the ...

  7. neu1458 方格取数 dp解法

    题意: 有N * N个格子,每一个格子里有正数或者0,从最左上角往最右下角走,仅仅能向下和向右,一共走两次(即从左上角走到右下角走两趟),把全部经过的格子的数加起来,求最大值SUM,且两次假设经过同一 ...

  8. MPI编程简述

    第三章MPI计划 3.1 MPI简单介绍 多线程是一种便捷的模型,当中每一个线程都能够訪问其他线程的存储空间.因此,这样的模型仅仅能在共享存储系统之间移植. 一般来讲,并行机不一定在各处理器之间共享存 ...

  9. LCS 小结

    转载链接:http://www.cnblogs.com/PJQOOO/p/3897745.html 第一步:先计算最长公共子序列的长度. 实现第一步: 设一个C[i][j]: 保存Xi与Yj的LCS的 ...

  10. HDU 3639 Hawk-and-Chicken(Tarjan缩点+反向DFS)

    Problem Description Kids in kindergarten enjoy playing a game called Hawk-and-Chicken. But there alw ...