shader镜面反射(Reflection)
这里用DXUT 实现的一个反射的Demo(下载地址)
镜面反射:
实现步骤:
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);
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 );}
shader镜面反射(Reflection)相关推荐
- Unity3D 镜面反射
原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 QQ群:[119706192] 本文链接地址: Unity3D 镜面反射 这是官方CharacterCustomization事例中的镜面 ...
- TA课程笔记01——光照(主要为shader入门精要第六章)
//老师在这里简单的简述了一下渲染流水线,我在之前的图形学笔记中很详细的讲述了渲染流水线的过程,便不再赘述 //因为老师很详细的将几种常见的光照模型都讲了一遍,但都是美术方向,前面的案例也都缺少代码, ...
- 【Unity Shader】 CubeMap(立方体贴图)
Unity Shader 立方体贴图 一.介绍CubeMap Shader中对CubeMap采样 Unity中如何制作CubeMap 二.Reflect CubeMap(反射立方体纹理用于环境映射) ...
- Unity shader Note :高级纹理(CubeMap反射折射菲涅尔,Rendermap镜子玻璃,程序纹理)
1.Cubemap–反射折射 使用脚本来创建Cubemap ①通过Camera.RenderToCubemap 把任意位置观察到的场景图制作成一张Cubemap之中 ②脚本使用自定义编译窗体的命令 – ...
- vr 瞬移_瞬移演示
vr 瞬移 We'd like to share with you a project that was built during the R&D period of the Physical ...
- 【Unity3D】反射和折射
1 前言 立方体纹理(Cubemap)和天空盒子(Skybox)中介绍了生成立方体纹理和制作天空盒子的方法,本文将使用立方体纹理进行采样,实现反射.菲涅耳反射和折射效果.另外,本文还使用了 GrabP ...
- Unity 渲染管线
文章目录 1. 渲染管线 1.1 选择一种渲染管线 2. 默认管线 Built-in Render Pipeline 2.1 渲染通路 Rendering paths 2.1.0.1 前向渲染 For ...
- Cg Programming/Unity/Reflecting Surfaces反射表面
本教程介绍了反射贴图(以及实现它的立方体贴图). 这是Unity中使用立方体贴图的环境映射的一系列小教程中的第一篇.本章基于章节"平滑镜面高光"中介绍的逐像素光照以及章节" ...
- Q86:镜面反射(Mirror Reflection)
86.1 光照模型 在考虑"间接光照"的情况下,间接光照可能来自撞击点上半球的任意方向,如下图所示: 86.2 镜面反射(Mirror Reflection) 一般情况,求解&qu ...
最新文章
- 向上滚动tabBar隐藏向下显示
- shell脚本之变量的作用域
- 全球及中国教育信息化行业投资模式与发展建议咨询报告2022版
- 从STL中查找、统计和过滤重复(相同)的数据
- java guava json文件_Json解析文件位置的问题
- leetcode714.买卖股票的
- 【6】C++语法与数据结构之STL_list学生管理系统_链表外排序_函数指针
- Qt笔记-QSerialPort的使用(串口通信简单实例)
- java重新_Java程序重新配置教程
- 扩展类载入器的载入问题
- 02 Python元组 字典 数据类型 if while for 迭代
- Linux下安装JDK说明
- Gradle与Gradle插件
- RV减速器动力学模型静力学matlab程序代码
- android显示缩略图,Android:是否可以显示视频缩略图?
- 转帖自勉:一个猎头的自述
- ubuntu18.04安装五笔输入法
- Android生态系统分裂剖析 开放性系统带来的影响
- SNMP协议以及著名的MIB详解
- Win8系统mscomctl.ocx缺失的解决方法 run-time error 339