【原】unity shader(3)反射贴图

改编自《cg教程--可编程实时图形学权威指南》上的demo。

反射向量计算公式 R=I-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.oPosition=mul(UNITY_MATRIX_MVP,input.position);//UNITY_MATRIX_MVP变量, 就是对应图形中的模型视图投影矩阵(ModelViewProj),unity中规定 必须这么写
              o.oTexCoord=input.texCoordw;
              float3 positionW=mul(_Object2World,input.position).xyz;//_Object2World 模型矩阵,把本地坐标转到世界坐标
              float3 N=mul((float3x3)_Object2World,input.normal1);
              N=normalize(N);
              float3 I=positionW-_WorldSpaceCameraPos;//计算入射光线,需要在世界坐标系中计算。_WorldSpaceCameraPos视点(相机)在世界坐标的位置
              o.R=reflect(I,N);//计算反射光线 reflect系统自带函数
              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
         }
   }
}          

上例代码出现的_Object2World,_WorldSpaceCameraPos 莫名奇妙的参数,来自UnityCG.cginc文件,在对cg、hlsl、glsl进行移植的时候,特殊参数需要参考UnityCG.cginc文件的定义。

实现效果:

初学阶段,不妥之处望大家指教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值