Shader例子(1) 高光效果(surf/顶点)
来源:互联网 发布:linux more 倒序 编辑:程序博客网 时间:2024/05/01 22:29
效果
一、surf
Shader "Custom/surf镜面高光" { //------------------------------------【属性值】------------------------------------ Properties { //主颜色 _Color ("Color", Color) = (1,0,0,1) //主纹理 _MainTex ("Albedo (RGB)", 2D) = "white" {} //高光颜色 _SpecColor ("SpecColor", Color) = (1.0,1.0,1.0,1) //高光系数 _Shininess ("Shininess ", Range(0.01,1)) = 0.4 } //------------------------------------【唯一的子着色器】------------------------------------ SubShader { //【注意:Surface Shader不能使用Pass,直接在SubShader中实现即可】 //渲染类型设置:不透明 Tags { "RenderType"="Opaque" } //细节层次设为 LOD 300 //===========开启CG着色器语言编写模块=========== CGPROGRAM //编译指令:告知编译器表明着色函数的名称为surf #pragma surface surf BlinnPhongTest //编译指令: 指定着色器编译目标为Shader Model 3.0 #pragma target 3.0 //变量的声明 sampler2D _MainTex; //fixed4 _SpecColor; half _Shininess; fixed4 _Color; //表面输入结构体 struct Input { float2 uv_MainTex; //纹理坐标 }; //--------------------------------【表面着色函数】----------------------------- //输入:表面输入结构体 //输出:Unity 内置的SurfaceOutputStandard结构体 /* 原型如下: struct SurfaceOutputStandard { fixed3 Albedo; // 漫反射颜色 fixed3 Normal; // 切线空间法线 half3 Emission; // 自发光 half Metallic; // 金属度;取0为非金属, 取1为金属 half Smoothness; // 光泽度;取0为非常粗糙, 取1为非常光滑 half Occlusion; // 遮挡(默认值为1) fixed Alpha; // 透明度 }; */ //--------------------------------------------------------------------------------- //计算颜色输出 void surf (Input IN, inout SurfaceOutput o) { // 取主纹理的对应当前像素点的值 fixed4 c = tex2D (_MainTex, IN.uv_MainTex); o.Albedo = c.rgb* _Color.rgb; o.Gloss = c.a; //整体光滑度,高光计算结果的附加系数,值越大, 高光反射越清晰,0则无高光效果 o.Specular = _Shininess; // 高光点,越小光泽度越高,0为全白 o.Alpha = c.a; } //对输出颜色进一步处理 float4 LightingBlinnPhongTest(SurfaceOutput s, float3 lightDir, float3 viewDir, float atten) { // 1.半角向量:求(点到光源+点到摄像机)的单位向量,他们的中间平均值 float3 h = normalize(lightDir + viewDir); // 2.漫反射系数【点到光源单位向量与法线向量的余弦值】 float diff = max(0, dot(s.Normal, lightDir)); // 3.高光底数【半角向量与法线向量的余弦值】 float nh = max(0, dot(s.Normal, h)); // 4.高光系数:根据高光低数和高光指数求得 float spec = pow(nh, s.Specular * 128.0) * s.Gloss; float4 c; // 5.最终光照rgb = 漫反射+半角高光 c.rgb = (s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * _SpecColor.rgb * spec) * (atten * 2); c.a = s.Alpha + _LightColor0.a * _SpecColor.a * spec * atten; return c; } ENDCG } FallBack "Diffuse"}
二、顶点shader
Shader "Custom/镜面高光10" { Properties { _Color("表面颜色",Color) = (1.0,1.0,1.0,1.0) _Threshold("加强系数",float) = 10 //高光加强系数 _HightColor("高光颜色",Color) = (1.0,1.0,1.0,1.0) }SubShader{Pass{ Tags{"LightMode" = "ForwardBase"}ZWrite OffCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc" float4 _Color; float _Threshold; float4 _HightColor; float4 _LightColor0; struct vertexInput { float4 vertex : POSITION; float3 normal : NORMAL; }; struct vertexOutput { float4 pos : SV_POSITION; float4 col : COLOR; }; vertexOutput vert(vertexInput input) { vertexOutput output; output.pos = mul(UNITY_MATRIX_MVP,input.vertex); float3 normalDir = normalize(mul(float4(input.normal,0.0),_World2Object).xyz); float3 viewDir = normalize(_WorldSpaceCameraPos-mul(_Object2World,input.vertex)); float3 lightDir; float factor; if(0.0 ==_WorldSpaceLightPos0.w){ factor =1; lightDir = normalize(_WorldSpaceLightPos0); }else{ float3 lightDirection = normalize(_WorldSpaceLightPos0-mul(_Object2World,input.vertex).xyz); float dis = length(lightDirection); factor = 1/dis; lightDir = normalize(lightDirection); } float3 diffuseLight = factor * _LightColor0.rgb * _Color.rgb * max(0.0,dot(normalDir,lightDir)); float3 hightLightDir; if(dot(normalDir,lightDir)<=0.0) { hightLightDir = float3(0.0,0.0,0.0); } else { hightLightDir = reflect(-lightDir,normalDir); } float3 hightLight = factor * _LightColor0.rgb *_HightColor.rgb * pow(max(0.0,dot(hightLightDir,viewDir)),_Threshold); float3 ambientLighting = UNITY_LIGHTMODEL_AMBIENT.rgb * _Color.rgb; output.col = float4(diffuseLight+hightLight+ambientLighting,0.0); return output; } float4 frag(vertexOutput input):COLOR { return input.col; }ENDCG } Pass{ Tags{"LightMode" = "ForwardAdd"}ZWrite OffBlend One OneCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc" float4 _Color; float _Threshold; float4 _HightColor; float4 _LightColor0; struct vertexInput { float4 vertex : POSITION; float3 normal : NORMAL; }; struct vertexOutput { float4 pos : SV_POSITION; float4 col : COLOR; }; vertexOutput vert(vertexInput input) { vertexOutput output; output.pos = mul(UNITY_MATRIX_MVP,input.vertex); float3 normalDir = normalize(mul(float4(input.normal,0.0),_World2Object).xyz); float3 viewDir = normalize(_WorldSpaceCameraPos-mul(_Object2World,input.vertex)); float3 lightDir; float factor; if(0.0 ==_WorldSpaceLightPos0.w){ factor =1; lightDir = normalize(_WorldSpaceLightPos0); }else{ float3 lightDirection = normalize(_WorldSpaceLightPos0-mul(_Object2World,input.vertex).xyz); float dis = length(lightDirection); factor = 1/dis; lightDir = normalize(lightDirection); } float3 diffuseLight = factor * _LightColor0.rgb * _Color.rgb * max(0.0,dot(normalDir,lightDir)); float3 hightLightDir; if(dot(normalDir,lightDir)<=0.0) { hightLightDir = float3(0.0,0.0,0.0); } else { hightLightDir = reflect(-lightDir,normalDir); } float3 hightLight = factor * _LightColor0.rgb *_HightColor.rgb * pow(max(0.0,dot(hightLightDir,viewDir)),_Threshold); float3 ambientLighting = UNITY_LIGHTMODEL_AMBIENT.rgb * _Color.rgb; output.col = float4(diffuseLight+hightLight+ambientLighting,0.0); return output; } float4 frag(vertexOutput input):COLOR { return input.col; }ENDCG } }}
0 0
- Shader例子(1) 高光效果(surf/顶点)
- 顶点高光.Shader
- Shader自学笔记 2.2.1 逐顶点高光反射光照模型
- 片段高光.Shader
- Unity|ShaderLab笔记整理-四(逐顶点漫反射+环境光 +高光反射Phone)
- 高光效果
- 一步步学shader系列(3):高光(specular light)
- Unity Shader 学习笔记(7) 高光反射
- 高光反射-逐顶点光照
- unity shader中高光反射光照模型之顶点光照
- Shader 简单的波浪顶点动画效果
- [Shader 着色器]边缘高光
- Ogre高光Shader入门(HLSL)
- Unity Shader Example 12 (Bloom 高光)
- shader中创建漫反射和高光
- Unity Shader-边缘光(RimLight)效果
- Unity Shader-边缘光(RimLight)效果
- 取消icon高光效果
- 安卓手册 第四章(MVP介绍和实战)
- CentOS 6.3下PostgreSQL 的安装与配置
- leetcode: Missing Number
- js数组去重
- 包含max/min 的 栈/队列 该作者的其他文章也很好! 要看!
- Shader例子(1) 高光效果(surf/顶点)
- iic模块PCF8574驱动1602学习记载
- java基础知识回顾---单例模式的三种实现
- 第七次CCF-D:游戏
- Mysql Binlog三种格式介绍及分析
- 通过ObjectAnimator动画显示数字
- HDU 3681 BFS
- java各类面试题集合
- 谈谈我对C++的认识