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 编程起步

时间: 2024-11-08 04:23:01

Unity SurfaceShader 编程起步的相关文章

Unity SurfaceShader 开始编程

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

为准大学生准备的C/C++编程起步教程

最近越来越多的其它领域的大佬陆陆续续来找我 “垂询” 编程起步的方法了,攥写本文一是考虑到逐个回复所费时间甚多,二者是鄙人的脑子实在不是很好用总是会出现记漏东西或者表述不清的情况. 希望这篇教程能够帮到各位初学者. 1.相关概念解析 如果后面理解东西出现了疑惑再跳回来看看:) A. 编辑器 / 编译器 / IDE / 开发环境 编辑器指的是你用来打字的工具(就像记事本或者小米便签),编译器是用来将你的代码从单纯的文本转化为程序的工具. 首先你需要用编辑器录入一段代码,然后保存为  后缀名与语言相

Unity Shader编程(1)漫反射着色

Unity Shader编程(1)漫反射着色 在Unity中创建如下工程: 我们把Shader拖到Material上.Meterial拖到Cube上.这就完成了一个着色器的着色过程. Shader "Custom/Shader" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaq

【Unity C#编程】自定义数据

译林军 灰魅|2014-03-04 10:52|10589次浏览|Unity(315)移动应用(31)技术开发(16)0 在这篇Unity C#的文章中,你将会创建一个简单的数据结构,然后写下它的属性抽屉. 下面你将会学到如何创建. 使用一个序列化的类 创建一个自定义的属性抽屉 使用序列化属性 在编辑器里面使用Unity的立即窗口GUI模式 在此之前,你需要了解Unity的编辑器,以及Uinty C#的一些脚本.如果你已经学习了一些其它的课程,这将会让你更加容易上手. 这篇文章适合Unity 4

【Unity Shader编程】之十四 边缘发光Shader(Rim Shader)的两种实现形态

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/51764028 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 本文工程使用的Unity3D版本: 5.2.1  这篇文章主要讲解了如何在Unity3D中分别使用Surface Shader和Vertex & Fragment Shader来编写边缘发光Shader. 一.最终实现的效果

挨踢部落故事汇(11):编程起步从0到1

Aris在大学期间对编程产生了兴趣,当时他的班主任是教Java的,看着老师用代码写出一些他们做不到的事,Aris便开始觉得编程是一件很牛逼的事情.从那时起,他就沉入到计算机的世界里,每周都会去图书馆借一些书回去,边对照书边敲代码执行,逐渐一个个小案例被成功的敲出来了,顿时他心生满满的成就感.但一味的跟着书编程,并不会一直运行成功,有一次因为书本的某个小错误,Aris没有发现,导致他执行不出结果,于是他通过百度.Google各种查询,最终找到解决方法.此后Aris觉得单单跟着书上敲是不行的,还需要

NPAPI插件编程起步

http://geeklu.com/2010/10/getting-started-with-npapi-plugin/ 2012-10-10 更新:https://code.google.com/p/chromium/issues/detail?id=139816 Chrome22之后貌似完全放弃10.5 Carbon之类的支持,所以Event Model需要进行设置,否则NPAPI插件在Chrome22下无法加载.NPP_New函数中进行如此设置 browser->setvalue(inst

DirectX API 编程起步 #02 窗口的诞生

先用 windows API 制作一个窗口出来,以后我们用 DirectX API 渲染的东西就会显示在这里,控制台那黑白的画面肯定是没法用的. 每次的代码都会更新到Github 首先贴出来目前为止的文件结构图,由上到下表示#include“XXXXX”关系 系统头文件的调用不包含在内 由于.h和.cpp都是对应出现的,我就不写的那么详细了 Main.cpp 是调用 SoftwareClass 类的主函数. 那么我们从上往下开始吧. Main.cpp 由于只用调用接下来的类成员函数就行,所以这个

[Unity3D ARPG网络游戏编程实践]1——初识unity网络编程

[Unity3D ARPG网络游戏编程实践] 想杀人了,百度了半天也不知道本地服务怎么写,结果资源里的服务器竟然可以用了~~~~(>_<)~~~~ 使用了两种方法1 这个方法特别郁闷,自己写服务器,自己写客户端可以通讯.可是这个服务器用在 [Unity3D ARPG网络游戏编程实践] 中就不能链接成功,还好资源里带有启动本地服务的程序,不会原因,不懂服务器链接的原理宣雨松版服务器客户端通讯代码 服务器端 using UnityEngine; using System.Collections;