Surface Shader(表面着色器)
Shader "Custom/Surface_Shadeer" {
Properties { //属性
_Color ("主颜色", Color) = (1,1,1,1)
_MainTex ("主纹理", 2D) = "white" {}
_NormalTex ("法线纹理", 2D) = "" {}
}
//子着色器
SubShader {
Tags { "RenderType"="Opaque" } //标签
LOD 200 //多层次细节 高效渲染的运算
//开始CG着色器编程语言段 surface 固定格式
CGPROGRAM
//1.光照模式声明:使用兰伯特光照模式 surface 固定格式 声明为表面着色器 Lamber是漫反射光照模式
#pragma surface surf Lambert
//2.输入结构 主要是用来接收外部的数据
struct Input
{
//四元素的颜色值(RGBA)
float4 color : COLOR;
float2 uv_MainTex;//uv + 变量名称 就可以获取当前的uv点 可以直接使用 是一个固定的结构
};
sampler2D _MainTex; //声明一张贴图
float4 _MainColor; //声明主颜色
sampler2D _NormalTex; //声明法线贴图
//3.表面着色函数的编写实现方法
void surf (Input IN, inout SurfaceOutput o) {
//反射率 float3 表示三维变量 floa4表示四维变量
// o.Albedo = float3(0.5,0.8,0.3); //(0.5,0.8,0.3)分别对应于RGB分量
//而o.Albedo = 0.6;等效于写o.Albedo = float3(0.6,0.6,0.6);
//改变着色器颜色
o.Albedo = _MainColor.rgb;
//给当前着色器贴图赋值 四维颜色转三维RGB
o.Albedo = tex2D(_MainTex,IN.uv_MainTex).rgb;
//给当前着色器的法线赋值 首先获取到法线贴图的颜色输出值tex2D(_NormalTex, IN.uv_MainTex) 但是需要把颜色输出值转换成法线向量赋值给着色器 也就是赋值给 o.Normal
o.Normal = UnpackNormal(tex2D(_NormalTex, IN.uv_MainTex));
}
ENDCG //结束CG着色器编程语言段
}
FallBack "Diffuse" //备用渲染方式 “”里面填的内容为Shader的路径
}
注:此着色器与unity 3d 本身预制的光照进行计算 ,Lambert和BlinnPhong,或者是自定义的光照模型 ,void surf (Input IN,inout SurfaceOutput 0)是其重要的显示实现函数,作用是接收 struct Input 函数的UV等数据的输入,进行处理,然后将结果填充显示在SurfaceOutput中。
Surface Shader(表面着色器)的更多相关文章
- Surface Shader简单向导
Surface Shader 表面着色器 描述 当你的Material要处理光照,则一般使用Surface Shader.Surface Shader隐藏了光照的计算,你只需要在surf函数里设置好反 ...
- Unity3D Shader官方教程翻译(十九)----Shader语法,编写表面着色器
Writing Surface Shaders Writing shaders that interact with lighting is complex. There are different ...
- Unity Shader入门精要学习笔记 - 第17章 Unity的表面着色器探秘
转自 冯乐乐的<Unity Shader 入门精要> 2010年的Unity 3 中,Surface Shader 出现了. 表面着色器的一个例子. 我们先做如下准备工作. 1)新建一个场 ...
- [Unity] Shader(着色器)输入输出和语义
在Unity5.x后, 已经支持了基于物理的光照模型,也就是常说的次时代引擎所必须具备的功能. 如果在Properties使用2D,CG里要用sampler2D,代表使用的是2维纹理 如果在Prope ...
- Surface Shader
Surface Shader: (1)必须放在SubShdader块,不能放在Pass内部: (2)#pragma sufrace surfaceFunction lightModel [option ...
- UnityShader 表面着色器简单例程集合
0.前言 这些简单的shader程序都是写于2015年的暑假.当时实验室空调坏了,30多个人在实验室中挥汗如雨,闷热中学习shader的日子还历历在目.这些文章闲置在我个人博客中,一年将过,师弟也到了 ...
- 【Unity Shaders】Shader学习资源和Surface Shader概述
写在前面 写这篇文章的时候,我断断续续学习Unity Shader半年了,其实还是个门外汉.我也能体会很多童鞋那种想要学好Shader却无从下手的感觉.在这个期间,我找到一些学习Shader的教程以及 ...
- 关于Unity中表面着色器的使用
写shader其实就是在两个工位顶点shader工位和着色shader工位插入代码,供GPU使用运行 表面着色器四个函数的入口 1:表面着色器包括4个函数: (1): 顶点变换函数; (2): 表面着 ...
- unity3d游戏开发学习分享之表面着色器讲解
一.三种着色器的书写格式: 1.surface shaders, 指的是表面着色器 2.vertex and fragment shaders and 指的是顶点和片段着色器 3.fixed func ...
随机推荐
- Java/C++中数组的区别
1. 数组名区别 -------------------------------------- 1. java中不用说,本着一切皆对象的原则,所以java中的数组也是对象.那么数组类是哪个,当然不是j ...
- [译]Javascript timing事件
本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...
- spring mvc常用注解标签
@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model , ...
- 第一个HelloWorld!
$.介绍 1.eclipse的基本使用 2.第一个程序HelloWorld 3.总结 $.基本使用 对于刚入门的java新手来说选择一个舒适的编译器能让你快速的上手java的程序编写. 针对英语low ...
- upper_bound下确界
//uppper_bound上确界找出首个大于某值的元素 #include<algorithm> #include<iostream> using namespace std; ...
- wamp配置apache虚拟主机支持多域名访问localhost
1.背景: 在进行网站开发的时候,通常需要以http://localhost或者127.0.0.1等地址来访问本地环境的网站.不过随着开发项目的增多,需要每次先访问localhost然后再选项目,显得 ...
- 解读人:林山云,Proteomic Identification of Protein Glutathionylation in Cardiomyocytes(心肌细胞蛋白质谷胱甘肽修饰的蛋白质组鉴定)
发表时间:(2019年4月) IF:3.950 单位:韦恩州立大学化学系 物种:小鼠心肌细胞 技术:谷胱甘肽修饰蛋白组学 一. 概述: 本研究采用化学选择性蛋白组学方法,鉴定出过氧化物诱导HL-1小鼠 ...
- luogu4345 [SHOI2015]超能粒子炮·改(组合数/Lucas定理)
link 输入\(n,k\),求\(\sum_{i=0}^k{n\choose i}\)对2333取模,10万组询问,n,k<=1e18 注意到一个2333这个数字很小并且还是质数这一良好性质, ...
- Leetcode 121. Best Time to Buy and Sell Stock 最佳股票售卖时(动态规划,数组,模拟)
题目描述 已知一个数组,第i个元素表示第i天股票的价格,你只能进行一次交易(买卖各一次),设计算法找出最大收益 测试样例 Input: [7, 1, 5, 3, 6, 4] Output: 5 最大收 ...
- [国家集训队]happiness 最小割 BZOJ 2127
题目描述 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文 ...