深圳 网站设,网站建设功能覆盖范围,cdr里做网站超级链接,视频网站开发项目改编自《cg教程--可编程实时图形学权威指南》上的demo。 反射向量计算公式 RI-2N(N*I) 备注N*I是点乘 I入射光线#xff0c;N法向量 函数实现#xff1a; float3 reflect(float3 I,float3 N) { return I-2.0*N*dot(N,I); } Shader CG shader Reflect{Propertie…改编自《cg教程--可编程实时图形学权威指南》上的demo。 反射向量计算公式 RI-2N(N*I) 备注N*I是点乘 I入射光线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 //反射系数 影响反射强度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 类型的参数 需要在Properties uniform samplerCUBE environmentMap;uniform float reflectivity;uniform sampler2D decalMap; VertOutput vert(VertInput input){VertOutput o;o.oPositionmul(UNITY_MATRIX_MVP,input.position);//UNITY_MATRIX_MVP变量, 就是对应图形中的模型视图投影矩阵(ModelViewProj),unity中规定 必须这么写o.oTexCoordinput.texCoordw;float3 positionWmul(_Object2World,input.position).xyz;//_Object2World 模型矩阵把本地坐标转到世界坐标float3 Nmul((float3x3)_Object2World,input.normal1);Nnormalize(N);float3 IpositionW-_WorldSpaceCameraPos;//计算入射光线需要在世界坐标系中计算。_WorldSpaceCameraPos视点(相机)在世界坐标的位置o.Rreflect(I,N);//计算反射光线 reflect系统自带函数return o;}float4 frag(VertOutput output):COLOR{float4 reflectionColortexCUBE(environmentMap,output.R);float4 decalColortex2D(decalMap,output.oTexCoord);float4 color1lerp(decalColor,reflectionColor,reflectivity);return color1;}ENDCG}}
} 上例代码出现的_Object2World_WorldSpaceCameraPos 莫名奇妙的参数来自UnityCG.cginc文件在对cg、hlsl、glsl进行移植的时候特殊参数需要参考UnityCG.cginc文件的定义。 实现效果 初学阶段不妥之处望大家指教。转载于:https://www.cnblogs.com/U-tansuo/archive/2012/12/09/unity_reflect.html