【原】unity shader(3)反射贴图
生活随笔
收集整理的這篇文章主要介紹了
【原】unity shader(3)反射贴图
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
改編自《cg教程--可編程實時圖形學(xué)權(quán)威指南》上的demo。
反射向量計算公式 R=I-2N(N*I) 備注N*I是點乘 ? I入射光線,N法向量
函數(shù)實現(xiàn):
float3 reflect(float3 I,float3 N)
{
? return I-2.0*N*dot(N,I);
}
Shader "CG shader Reflect"{Properties {environmentMap("Environment Map", Cube) = "" {}reflectivity("reflectivity1", float) =1 //反射系數(shù) 影響反射強度decalMap("decalMap", 2D) = "white" {} }SubShader{Pass{CGPROGRAM#pragma vertex vert //頂點編程入口#pragma fragment frag //片段編程入口#include "UnityCG.cginc" //注意引入struct VertInput{float4 position:POSITION;float2 texCoordw:TEXCOORD0;float3 normal1:NORMAL;};struct VertOutput{float4 oPosition:SV_POSITION;float2 oTexCoord:TEXCOORD0;float3 R:TEXCOORD1;};// uniform 類型的參數(shù) 需要在Properties uniform samplerCUBE environmentMap;uniform float reflectivity;uniform sampler2D decalMap; VertOutput vert(VertInput input){VertOutput o;o.oPosition=mul(UNITY_MATRIX_MVP,input.position);//UNITY_MATRIX_MVP變量, 就是對應(yīng)圖形中的模型視圖投影矩陣(ModelViewProj),unity中規(guī)定 必須這么寫o.oTexCoord=input.texCoordw;float3 positionW=mul(_Object2World,input.position).xyz;//_Object2World 模型矩陣,把本地坐標(biāo)轉(zhuǎn)到世界坐標(biāo)float3 N=mul((float3x3)_Object2World,input.normal1);N=normalize(N);float3 I=positionW-_WorldSpaceCameraPos;//計算入射光線,需要在世界坐標(biāo)系中計算。_WorldSpaceCameraPos視點(相機)在世界坐標(biāo)的位置o.R=reflect(I,N);//計算反射光線 reflect系統(tǒng)自帶函數(shù)return o;}float4 frag(VertOutput output):COLOR{float4 reflectionColor=texCUBE(environmentMap,output.R);float4 decalColor=tex2D(decalMap,output.oTexCoord);float4 color1=lerp(decalColor,reflectionColor,reflectivity);return color1;}ENDCG}} }上例代碼出現(xiàn)的_Object2World,_WorldSpaceCameraPos 莫名奇妙的參數(shù),來自UnityCG.cginc文件,在對cg、hlsl、glsl進(jìn)行移植的時候,特殊參數(shù)需要參考UnityCG.cginc文件的定義。
實現(xiàn)效果:
初學(xué)階段,不妥之處望大家指教。
轉(zhuǎn)載于:https://www.cnblogs.com/U-tansuo/archive/2012/12/09/unity_reflect.html
總結(jié)
以上是生活随笔為你收集整理的【原】unity shader(3)反射贴图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wincc连接mysql数据库说明_wi
- 下一篇: 杭电 1233 最小生成树 kruska