专栏首页逍遥剑客的游戏开发球面环境映射实现高光效果

球面环境映射实现高光效果

前段时间在看wow的模型的时候, render flag中有一个很奇怪的渲染状态切换, 而且这个状态在WoWDev上也没有被提及.

pass.useEnvMap = (texunitlookup[tex[j].texunit] == -1) && ((rf.flags & 0x10) !=0) && rf.blend>2; //&& rf.blend<5; // Use environmental reflection effects? 

当时跟踪了一下, 发现几个模型只有在使用某一类纹理时才会切换到这个"SphereMap", 文件名通常是:ARMORREFLECT4.BLP这样的

当时只是知道是用来做高光, 至于实现没有细看.

后来在项目中偶然发现也用了这项技术, 才知道除了Cubic Environment Mapping之外, 还有个Spherical Environment Mapping.

按DX SDK中的说法, UV坐标是这样计算的:, 其中Nx和Ny是摄像机空间顶点法线的xy分量. 原来画wow模型时没有实验成功, 就把这张纹理给当普通纹理处理了, 怪不得画出来的龙的牙跟爪子看起来没有wowmodelviewer的锐利@_@. 现在看来是我没有把法线变换到摄像机空间.

在RenderMonkey里拿个茶壶实验了一下, 这次效果对了:

float4x4 matViewProjection;  
float4x4 matView;  
struct VS_INPUT   
{  
   float4 Position : POSITION0;  
   float3 Normal   : NORMAL;  
   float2 Texcoord : TEXCOORD0;  
};  
struct VS_OUTPUT   
{  
   float4 Position : POSITION0;  
   float2 Texcoord : TEXCOORD0;  
   float2 SphereUV : TEXCOORD1;  
};  
VS_OUTPUT vs_main( VS_INPUT Input )  
{  
   VS_OUTPUT Output;  
   Output.Position = mul( Input.Position, matViewProjection );  
   Output.Texcoord = Input.Texcoord;  
   float3 viewNormal = mul(Input.Normal, matView);  
   Output.SphereUV = viewNormal.xy * 0.5 + 0.5;  
 return( Output );  
}  
sampler2D baseMap;  
sampler2D sphereMap;  
struct PS_INPUT   
{  
   float2 Texcoord : TEXCOORD0;  
   float2 ShpereUV : TEXCOORD1;  
};  
float4 ps_main( PS_INPUT Input ) : COLOR0  
{  
   float4 diffuse = tex2D( baseMap, Input.Texcoord );  
   float4 envmap = tex2D(sphereMap, Input.ShpereUV);  
 return diffuse + envmap;  
}  

效果图:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Direct3D学习(五):基于高度图的地形生成

    逍遥剑客
  • 写的第一个Shader

    逍遥剑客
  • Gamma校正问题

    逍遥剑客
  • Flutter学习--基础控件

    在开始使用flutter之前,需要熟悉dart语法,然后就开始学flutter的基础控件了.

    草莓和奶酪
  • 如何在Ubuntu 14.04上使用Transporter将转换后的数据从MongoDB同步到Elasticsearch

    Elasticsearch有助于对数据进行全文搜索,而MongoDB则擅长存储数据。使用MongoDB存储数据和使用Elasticsearch进行搜索是一种常见...

    所有的酒都不如你
  • jq获取文档和窗口高度

    jquery获取窗口高度和窗口高度,$(document).height()、$(window).height()

    93年的老男孩
  • Direct3D学习(五):基于高度图的地形生成

    逍遥剑客
  • 机器学习| 一个简单的入门实例-员工离职预测

    2016年,我国员工离职率达到20.1%,一线城市22.4%,意味着你身边每10个同事中就有2个会离职。科技行业员工离职率最高,达到25.1%,其中主动...

    用户1621951
  • JAVAWEB复习-JS

    特点:信息动态交互,不可直接访问本地磁盘,只要是可以解析js的浏览器都可以跨平台执行

    阮键
  • Jfinal QuartzPlugin 简单使用案例

    之前一直使用spring quartz感觉还挺好用的,就想着jfinal是不是也可以使用quartz插件,于是发现了QuartzPlugin和jfinal-sc...

    大道七哥

扫码关注云+社区

领取腾讯云代金券