Directx11教程(57) 环境映射

简介: 建好skydome后,如果我们想让其中的某个物体,比如那个球体来映射出周围环境的蓝天白云(不包括自己附近的物体),该怎么做呢?此时可以把这个球体当成一面镜子,把我们视点看这个物体上某个顶点p时的反射向量当作cube map查询向量v,得到纹理texel,然后p点的颜色可以用blend的方式,混合当前颜色和采样的纹理texel,就可以实现我们想要的效果。

      建好skydome后,如果我们想让其中的某个物体,比如那个球体来映射出周围环境的蓝天白云(不包括自己附近的物体),该怎么做呢?此时可以把这个球体当成一面镜子,把我们视点看这个物体上某个顶点p时的反射向量当作cube map查询向量v,得到纹理texel,然后p点的颜色可以用blend的方式,混合当前颜色和采样的纹理texel,就可以实现我们想要的效果。

image

     我们新建一个LightTexCubeShaderClass来渲染这个球体,它调用的shader文件为lighttexcube.vs, lighttexcube.ps,vs文件没有什么变化,但ps文件中加入了环境映射的处理,混合了光照,纹理以及环境映射纹理三者的颜色。

     finalcolor = finalcolor * textureColor;

     //计算反射cube的颜色
    {
        float3 incident = input.worldposition.xyz - cameraPosition.xyz;
        float3 refW = reflect(incident, input.worldnormal);
        float4 reflectedColor = gCubeMap.Sample(SampleType, refW); //用反射向量,查询cube颜色
        finalcolor += reflectedColor;
    }

  return finalcolor;

      在GraphicsClass中,渲染该球体的代码为:

//sphere 顶点和索引数据放入缓冲区,准备渲染
m_SphereModel->Render(m_D3D->GetDeviceContext());

D3DXMatrixTranslation(&worldMatrix3, 0.0,4.5, 0.0);

result = m_LightTexCubeShader->Render(m_D3D->GetDeviceContext(), m_SphereModel->GetIndexCount(), worldMatrix3, viewMatrix, projectionMatrix,
    light, material, camera,m_TexManager->createTex(m_D3D->GetDevice(),string("ice.dds")), m_TexManager->createCubeTex(m_D3D->GetDevice(),string("grassenvmap1024.dds")));

    程序执行后界面如下:

image

      
完整的代码请参考:

工程文件myTutorialD3D11_52

代码下载:

http://files.cnblogs.com/mikewolf2002/d3d1150-58.zip

http://files.cnblogs.com/mikewolf2002/pictures.zip

相关文章
Directx11教程(49) stencil的应用-镜面反射
本教程中,我们利用stencil来实现一个镜面反射效果。 1、首先我们要在D3DClass中增加几个成员变量及函数。 ID3D11DepthStencilState* m_depthStencilStateMirror; ID3D11DepthStencilState* ...
1079 0
|
索引
Directx11教程(51) 简单的billboard
billboard称作公告板,通常用一个quad(四边形)表示[有的billboard用两个正交的quad表示],它的特点就是始终面向摄像机的方向。在大规模场景渲染中,可以公告板上贴一个纹理,比如树,这样在比较远的场景中,可以用它表示模型数据,从而减少场景中的顶点数量。
915 0
|
算法
Directx11教程(60) tessellation学习(2)
本教程中,我们开始tessellation编程,共实现了2个程序,第一个tessellation程序,是对一个三角形进行细分操作,第二个程序是对一个四边形进行细分操作,两个程序coding差不多,我们先看第一个程序。
772 0
|
算法
Directx11教程(61) tessellation学习(3)
现在我们看看在不同tess factor的情况下,三角形是如何细分的?(这儿三条边和内部tess factor值是一样的,而且partitioning("integer")) 下面8张图是三角形在tess factor 1到8的情况下的细分细节:        因为TS阶段是硬件自己做的,没有算法细节,所以我们只能从这些图中,来猜一猜不同tess factor情况下的规律。
1072 0
Directx11教程(63) tessellation学习(5)
TS中生成细分后顶点的u,v,{w}坐标,我们根据控制点和u,w,{w}坐标生成新的顶点位置,在前面四边形的细分中,我们用了双线性差值的方法,得到新的顶点位置,这些新顶点位置都在一个平面上。
918 0
Directx11教程(62) tessellation学习(4)
现在看看四边形在不同tess factor时,四边形细分的细节,下图是tess factor1-8时候的细分。tess factor是偶数时候,细分的三角形是对称的,奇数时候,只有一条对角线,细分的三角形是不对称的。
734 0
|
算法 Go 异构计算
Directx11教程(59) tessellation学习(1)
在D3D11管线中,新增加了3个stage, Hull shader, Tessellator, Domain shader,用来实现细分操作,就是在gpu中把低细节的表面细分成高细节的体元。
851 0
[学习笔记]开始学directx了之一
看了书的好几章节,反复讲有关directdraw原理的问题,在这里用自己的理解讲述一下这个原理,也好方便以后的重温,现在可能有很多错误和漏洞,在以后发现来说就是一种进步了。首先要了解directdraw的绘图和动画产生的原理。
797 0
Directx11教程(4) 一个最基本D3D应用程序(2)
接着上篇教程的代码,本篇加入基本的D3D代码,实现一个完整的D3D11程序框架。 我们增加一个新类D3DClass, 用来处理3D渲染功能。增加该类后,程序的框架如下图:     GraphicsClass.h代码改变如下, 主要是增加了一个D3DClass类成员变量,在Render函数中,将会调用D3DClass的相应Render函数,比如BeginScene、EndScene,BeginScene主要是清除framebuffer,设置渲染背景颜色,而EndScene则是把交换前后缓冲,使当前渲染的内容在屏幕上显示出来。
1343 0
|
Windows
Directx11教程(3) 一个最基本D3D应用程序(1)
在前一篇教程程序代码的基础上,这次我们将增加2个类: InputClass,键盘处理的代码将放在这个类里面,GraphicsClass类,D3D渲染的代码放在这个类里,这两个类都是SystemClass类的成员变量,SystemClass类中会调用这2个类实例的初始化、渲染以及shutdown函数。
1025 0

热门文章

最新文章