改编自《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)反射贴图相关推荐

  1. Unity Shader - Heightmap 高度贴图

    目录:Unity Shader - 知识点目录(先占位,后续持续更新) 原文:Heightmap 版本:2019.1 Heightmap 高度贴图(也称为视差映射)是一个类似于法线映射的概念,但是这种 ...

  2. unity shader实现纹理贴图

    unity实现纹理贴图很简单,首先在appdata结构体里声明uv语义TEXCOORD0,就可以获得当前顶点的uv坐标,对外部导入的模型来说.这个uv坐标是在3d模型软件例如maya中制作模型的人预先 ...

  3. Unity Shader 高光反射光照模型

    高光反射光照模型计算公式如下: 需要四个参数:入射光线的颜色和强度,材质的高光反射系数,视角方向,反射方向. 反射方向可以由表面法线和光源方向计算而得: 也可以直接使用CG提供的计算反射方向的函数re ...

  4. 【备份】《Unity Shader入门精要》配图

    说明:本页面是书籍<Unity Shader入门精要>的随书彩图集锦,包含了书中所有的插图,使用时可通过图片编号进行搜索.  作者:冯乐乐  邮箱:lelefeng1992@gmail.c ...

  5. 【备忘】《Unity Shader入门精要》随书彩色插图

    转载来源:http://www.manew.com/blog-194008-42590.html <Unity Shader入门精要>随书彩色插图 <Unity Shader入门精要 ...

  6. 《Unity Shader入门精要》随书彩色插图

    说明:本页面是书籍<Unity Shader入门精要>的随书彩图集锦,包含了书中所有的插图,使用时可通过图片编号进行搜索.  作者:冯乐乐  邮箱:lelefeng1992@gmail.c ...

  7. unity shader法线贴图实现凹凸映射效果

    法线贴图 法线贴图是一张保存了物体法线信息的纹理,可以用来细化模型的光照效果. 例如一块石头表面坑坑洼洼的,如果全部用建模实现,需要非常多的顶点数和面数才能完成.但是做一个简单的模型,比如表面平整的一 ...

  8. 【Unity Shader】 CubeMap(立方体贴图)

    Unity Shader 立方体贴图 一.介绍CubeMap Shader中对CubeMap采样 Unity中如何制作CubeMap 二.Reflect CubeMap(反射立方体纹理用于环境映射) ...

  9. Unity Shader 水多种元素的实现(反射、折射、菲涅尔、深浅、浪花/泡沫、水波、可交互)

    综合效果 经过各元素叠加 和 程序的审美调参 后的综合效果 交互的水波与边缘浪花的合并需要优化一下 反射 两种方案: cubeMap 以水面对称设一个摄像机 cubeMap 实现:反射探针生成Cube ...

最新文章

  1. webservice 返回对象 java_JAVA 调用webservice不同返回值类型的方法
  2. 【Linux】一步一步学Linux——ipcrm命令(142)
  3. android网络监听
  4. 五分钟读懂UML类图
  5. MATLAB学习笔记(十五)
  6. 用bool函数判断int类型相加溢出_Go是强类型语言,不支持隐式类型转换,那该怎么办?...
  7. S1304第一本书内测测试分析
  8. C++中的异常处理(上)
  9. Google earth
  10. 类的加载过程详解之过程五:类的Unloading(卸载)
  11. 使用ActivityGroup来切换Activity和Layout,android入门开发与实战
  12. html5+前端脸部识别采集,前端人脸识别框架Tracking.js
  13. js生成二维码,js 解析二维码,jsqrcode,js从url生成二维码
  14. 从DOS中装操作系统时要加载smartdrv命令
  15. Kubuntu 22.04的安装及基本配置(语言、分辨率自适应等)
  16. 网记者采访时,一直称李某萍为“妻子”
  17. 拔丝芋头的Java学习日记--Day6
  18. android win10 投屏,安卓手机投影win10不成功,版本升级前可以
  19. Semantic Nighttime Image Segmentation with Synthetic Stylized Data Gradual Adaptation
  20. 微擎 公众号分享朋友圈不显示缩略图

热门文章

  1. 机器学习11主成分分析
  2. 机器学习06神经网络--学习
  3. 阿里云天池 Python训练营Task3: Python基础进阶:从函数到高级魔法方法 学习笔记
  4. 6.17 dokcer(一)Compose 简介
  5. Linux 命令 之查看程序占用内存
  6. iOS - LocalCache 本地数据缓存
  7. Java中抽象类和接口在概念、语法和应用上的区别和关系
  8. .net 预编译 提示中导入的类型 冲突
  9. C#命名空间与类名的冲突
  10. ubuntu11.04正式版下载地址