Unity的shader学习2
下面继续看基于surface的shader代码,基本与Vertex&Fragment shader差不多,只是不能写pass,然后只需要声明surface函数,就能处理所有的事情。
Shader "T1/Hero/Diffuse" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_Color ("Main Color", Color) = (,,,)
[HideInInspector]_BlendColor("_Blend Color", Color) = (, , , )
[HideInInspector]_BlendIntensity ("BlendColorShininess", Range (, )) =
}
SubShader {
Tags { "Queue" = "Geometry+20" "RenderType"="Opaque"}
LOD
CGPROGRAM
// #include "T1.cginc"
#pragma surface surf LambertT1HeroSideLight
#pragma only_renderers d3d9 opengl
sampler2D _MainTex;
fixed4 _Color;
struct Input {
float2 uv_MainTex;
};
#include "T1.cginc"
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex) ;
#if defined (UNITY_PASS_FORWARDBASE) || defined (UNITY_PASS_PREPASSFINAL)
o.Albedo = lerp (c.rgb* _Color.rgb, _BlendColor * _BlendIntensity, _BlendColor.a);
#else
o.Albedo = c.rgb* _Color.rgb;
#endif
o.Alpha = ;
o.Emission = c.rgb * _heroSelfIllumin;
}
ENDCG
}
FallBack "Hidden/T1/VertexLit-Hero"
}
第3行的_MainTex声明后,就可以在第17行中引用到。
第5-6行的HideInInspector意思是不在编辑器的属性界面显示,隐藏起来。然后_BlendColor表示一个颜色,_BlendIntensity表示0-1的值。看后面的意思可以得知是混合颜色和混合强度。
第9行的RenderType=Opaque表示声明是一个不透明的物体,具体解释在这里,然后"Queue" = "Geometry+20"其实就是说渲染层次是2000+20,就是比一般的不透明物体层次要高一点。
第10行的LOD这个数值决定了我们能用什么样的 Shader。在Unity的Quality Settings中我们可以设定允许的最大LOD,当设定的LOD小于SubShader所指定的LOD时,这个SubShader将不可用。Unity 内建Shader定义了一组LOD的数值。具体解释在这里。200是默认的diffuse值。
第14行的#pragma surface surf Lambert,它声明了我们要写一个表面Shader,并指定了光照模型。它的写法是这样的
#pragma surface surfaceFunction lightModel [optionalparams]
- surface - 声明的是一个表面着色器
- surfaceFunction - 着色器代码的方法的名字
- lightModel - 使用的光照模型。
Lambert就是普通的diffuse漫反射光照模型。
第15行#pragma only_renderers d3d9 opengl表示限制这个shader只编译在d3d9和opengl上。具体解释在这里
第17行sampler2D就是GLSL中的2D贴图的类型,相应的,还有sampler1D,sampler3d,samplerCube等等格式。不啰嗦了
第18行的fixed4主要用来表示颜色rgba四个数值。
第20行的Input声明后,主要是用来给surf函数来使用的。
第26行-34行主要是CG规定了声明为表面着色器的方法(就是我们这里的surf)的参数类型和名字,因此我们没有权利决定surf的输入输出参数的类型,只能按 照规定写。这个规定就是第一个参数是一个Input结构,第二个参数是一个inout的SurfaceOutput结构。
这里用到了一个tex2d函数,这是CG程序中用来在一张贴图中对一个点进行采样的方法,返回一个float4。这里对_MainTex在输入点上进行了采 样,并将其颜色的rbg值赋予了输出的像素颜色。
28行的主要意思见这里。这里主要是前向渲染或者延迟渲染的话,物体颜色就需要考虑混合的颜色和混合的亮度,否则就直接取颜色。
33行,设置无透明。
34行表示自发光,这个值是图片的颜色乘以t1定义的自发光亮度常量。
Unity的shader学习2的更多相关文章
- Unity的shader学习1
先来看一段我们项目常见的Shader代码,这个是Vertex&Fragment shader,目前已经不常用了,不过还是适合我们理解一些基础知识和理解一些比较老的shader 代码.下次我们再 ...
- 【Unity Shaders】Shader学习资源和Surface Shader概述
写在前面 写这篇文章的时候,我断断续续学习Unity Shader半年了,其实还是个门外汉.我也能体会很多童鞋那种想要学好Shader却无从下手的感觉.在这个期间,我找到一些学习Shader的教程以及 ...
- Unity Shader 学习之旅
Unity Shader 学习之旅 unityshader图形图像 纸上学来终觉浅,绝知此事要躬行 美丽的梦和美丽的诗一样 都是可遇而不可求的——席慕蓉 一.渲染流水线 示例图 Tips:什么是 GP ...
- Unity Shader 学习之旅之SurfaceShader
Unity Shader 学习之旅之SurfaceShader unity shader 图形图像 如果大地的每个角落都充满了光明 谁还需要星星,谁还会 在夜里凝望 寻找遥远的安慰——江河 官方文档 ...
- 第四章 开始Unity Shader学习之旅(2)
目录 1. 强大的援手:Unity提供的内置文件和变量 1.1 内置的包含文件 1.2 内置的变量 2. Unity提供的Cg/HLSL语义 2.1 什么是语义 2.2 Unity支持的语义 2.3 ...
- [转]Unity Shader 学习总结
1.先来一段单张纹理贴图的shader示例代码: // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClip ...
- 【Unity Shaders】学习笔记——SurfaceShader(十一)光照模型
[Unity Shaders]学习笔记——SurfaceShader(十一)光照模型 转载请注明出处:http://www.cnblogs.com/-867259206/p/5664792.html ...
- 【Unity Shaders】学习笔记——SurfaceShader(十)镜面反射
[Unity Shaders]学习笔记——SurfaceShader(十)镜面反射 如果你想从零开始学习Unity Shader,那么你可以看看本系列的文章入门,你只需要稍微有点编程的概念就可以. 水 ...
- 【Unity Shaders】学习笔记——SurfaceShader(九)Cubemap
[Unity Shaders]学习笔记——SurfaceShader(九)Cubemap 如果你想从零开始学习Unity Shader,那么你可以看看本系列的文章入门,你只需要稍微有点编程的概念就可以 ...
随机推荐
- day5 常用模块json和pickle
json 和 pickle json和pickle是用于字符串序列化和反序列化的过程,我们在存储和使用的时候,经常把列表存入文件,读取的时候我们还想以列表的形式读取.就需要使用json和pickle. ...
- LoadRunner中自定义C函数实现字符串替换
.在globals.h 中定义一个函数ReplaceStr,实现字符串的替换: int ReplaceStr(char* sSrc, char* sMatchStr, char* sReplaceSt ...
- poj2253 Frogger(Floyd)
题目链接 http://poj.org/problem?id=2253 题意 给出青蛙A,B和若干石头的坐标,现在青蛙A要跳到青蛙B所在的石头上,求出所有路径中最远那一跳的最小值. 思路 Floyd算 ...
- c#多线程实现函数同步运行
我们假设有方法run1()和run2(),耗时都比较大,实现他们同步运行将大大提高程序的效率,在这里考虑使用多线程的方法. 首先添加引用,定义bool型i,j为false. using System. ...
- git合并分支理解和常用命令的总结
原文参考:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 工作区和暂存区 工作区 ...
- 转:perl源码审计
转:http://www.cgisecurity.com/lib/sips.html Security Issues in Perl Scripts By Jordan Dimov (jdimov@c ...
- Linux (x86) Exploit 开发系列教程之六(绕过ASLR - 第一部分)
转:https://bbs.pediy.com/thread-217390.htm 前提条件: 经典的基于堆栈的缓冲区溢出 虚拟机安装:Ubuntu 12.04(x86) 在以前的帖子中,我们看到了攻 ...
- quartz定时任务,已过期的内容自动下线
概念: Quartz是一个开源的作业调度框架,可以让计划的程序任务一个预定义的日期和时间运行.Quartz可以用来创建简单或复杂的日程安排执行几十,几百,甚至是十万的作业数. 框架架构: 简单实例: ...
- 创建基于主-从视图的应用程序(Master-Detail Application)
以Master-Detail Application创建的应用程序在iPad和iPhone上都能运行,虽然模板解决了大部分问题,但还是有一些Apple遗留问题需要解决.使用该模板创建项目时,需要将下拉 ...
- Proud Merchants HDU - 3466 (思路题--有排序的01背包)
Recently, iSea went to an ancient country. For such a long time, it was the most wealthy and powerfu ...