欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

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

发布时间:2023/12/9 编程问答 35 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【原】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文件的定义。

实现效果:

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

转载于:https://www.cnblogs.com/U-tansuo/archive/2012/12/09/unity_reflect.html

总结

以上是生活随笔为你收集整理的【原】unity shader(3)反射贴图的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。