这里用DXUT 实现的一个反射的Demo(下载地址)

镜面反射:

要实现场景中类似镜面反射的场景,是一种很美妙的事,列如水中的倒影,玻璃上面的反射.下面我们来实现这种功能.我们来看一下实现的效果.

实现步骤:

需要先用一张立方体环境贴图,实现环境的颜色,.渲染立方体环境.这个在这里就不啰嗦了.
我们重点是实现对环境的反射.
以上的现象遵循物理反射定律,反射角等于入射角,即 角a = 角b
在HLSL 中有refect 反射函数  返回入射光线i对表面法线n的反射光线。
在反射物体中,通过使用每个像素点上的反射向量来索引到立方体纹理上的像素,就能近似模拟反射效果了.
Pixel Shader 里面的代码
float3 vLight;
float AmbientIntensity;
float DiffuseIntensity;
float SpecularIntensity;
float4 AmbientColor;
float4 DiffuseColor;
float4 SpecularColor;
float SpecularPow;samplerCUBE Environment;struct PS_INPUT
{float3 Normal   : TEXCOORD0;float3 Eye      : TEXCOORD1;
};float4 ps_main( PS_INPUT Input ) : COLOR0
{float3 light = normalize(vLight);float3 eye = normalize(Input.Eye);float3 normal = normalize(Input.Normal);float ndl = saturate(dot(light, normal));//光线的反射方向float3 r = normalize(reflect(-light, normal));float rdv = pow(saturate(dot(r, eye)), SpecularPow);//环境贴图 //这两行主要功能float3 reflectEye = reflect(-eye, normal);float4 reflectColor = texCUBE(Environment, reflectEye);//光照方程float4 color = AmbientColor * AmbientIntensity + DiffuseColor * DiffuseIntensity * ndl + SpecularColor * SpecularIntensity * rdv;return reflectColor * color;
}

主要代码就是

      float3 reflectEye = reflect(-eye, normal);float4 reflectColor = texCUBE(Environment, reflectEye);
实现的原理是反射物体的效果文件不再是取自身的纹理,而是取环境立方体的纹理了.
同时我们看一下Vertex Shader 里面的代码吧,这个和以前的没有什么区别,姑且看看吧
float4x4 matWorldViewProjection;
float4x4 matWorldInverseTranspose;
float4x4 matWorld;
float4 vViewPosition;struct VS_INPUT
{float4 Position : POSITION0;float4 Normal   : NORMAL0;
};struct VS_OUTPUT
{float4 Position : POSITION0;float3 Normal   : TEXCOORD0;float3 Eye      : TEXCOORD1;
};VS_OUTPUT vs_main( VS_INPUT Input )
{VS_OUTPUT Output;Output.Position = mul( Input.Position, matWorldViewProjection );//法线变换要用世界矩阵逆矩阵的转置矩阵,但除了做非等比例的缩放时,直接用世界矩阵也可以Output.Normal = mul ( Input.Normal, matWorldInverseTranspose );//视线Output.Eye = vViewPosition - mul(Input.Position, matWorld);return( Output );}

这里用DXUT 实现的一个反射的Demo(下载地址)

shader镜面反射(Reflection)相关推荐

  1. Unity3D 镜面反射

    原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 QQ群:[119706192] 本文链接地址: Unity3D 镜面反射 这是官方CharacterCustomization事例中的镜面 ...

  2. TA课程笔记01——光照(主要为shader入门精要第六章)

    //老师在这里简单的简述了一下渲染流水线,我在之前的图形学笔记中很详细的讲述了渲染流水线的过程,便不再赘述 //因为老师很详细的将几种常见的光照模型都讲了一遍,但都是美术方向,前面的案例也都缺少代码, ...

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

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

  4. Unity shader Note :高级纹理(CubeMap反射折射菲涅尔,Rendermap镜子玻璃,程序纹理)

    1.Cubemap–反射折射 使用脚本来创建Cubemap ①通过Camera.RenderToCubemap 把任意位置观察到的场景图制作成一张Cubemap之中 ②脚本使用自定义编译窗体的命令 – ...

  5. vr 瞬移_瞬移演示

    vr 瞬移 We'd like to share with you a project that was built during the R&D period of the Physical ...

  6. 【Unity3D】反射和折射

    1 前言 立方体纹理(Cubemap)和天空盒子(Skybox)中介绍了生成立方体纹理和制作天空盒子的方法,本文将使用立方体纹理进行采样,实现反射.菲涅耳反射和折射效果.另外,本文还使用了 GrabP ...

  7. Unity 渲染管线

    文章目录 1. 渲染管线 1.1 选择一种渲染管线 2. 默认管线 Built-in Render Pipeline 2.1 渲染通路 Rendering paths 2.1.0.1 前向渲染 For ...

  8. Cg Programming/Unity/Reflecting Surfaces反射表面

    本教程介绍了反射贴图(以及实现它的立方体贴图). 这是Unity中使用立方体贴图的环境映射的一系列小教程中的第一篇.本章基于章节"平滑镜面高光"中介绍的逐像素光照以及章节" ...

  9. Q86:镜面反射(Mirror Reflection)

    86.1 光照模型 在考虑"间接光照"的情况下,间接光照可能来自撞击点上半球的任意方向,如下图所示: 86.2 镜面反射(Mirror Reflection) 一般情况,求解&qu ...

最新文章

  1. 向上滚动tabBar隐藏向下显示
  2. shell脚本之变量的作用域
  3. 全球及中国教育信息化行业投资模式与发展建议咨询报告2022版
  4. 从STL中查找、统计和过滤重复(相同)的数据
  5. java guava json文件_Json解析文件位置的问题
  6. leetcode714.买卖股票的
  7. 【6】C++语法与数据结构之STL_list学生管理系统_链表外排序_函数指针
  8. Qt笔记-QSerialPort的使用(串口通信简单实例)
  9. java重新_Java程序重新配置教程
  10. 扩展类载入器的载入问题
  11. 02 Python元组 字典 数据类型 if while for 迭代
  12. Linux下安装JDK说明
  13. Gradle与Gradle插件
  14. RV减速器动力学模型静力学matlab程序代码
  15. android显示缩略图,Android:是否可以显示视频缩略图?
  16. 转帖自勉:一个猎头的自述
  17. ubuntu18.04安装五笔输入法
  18. Android生态系统分裂剖析 开放性系统带来的影响
  19. SNMP协议以及著名的MIB详解
  20. Win8系统mscomctl.ocx缺失的解决方法 run-time error 339

热门文章

  1. 用户注册登录页面的设计与实现
  2. 今日头条图片爬取(一)
  3. Android系统框架-Androi的面试必问部分
  4. 动态菜单,根据登录用户权限返回不同菜单,登录完成跳转到不同的首页
  5. 2005年10月--至今,开发过的项目
  6. hdwiki 数据库结构说明
  7. 如何评价2021年的B站跨年晚会
  8. 微信小程序—仿美团酒店入住日期时段选择
  9. here-document at line 40 delimited by end-of-file (wanted `EOF‘)
  10. sql 计算法定假节假日解决方案一