概述
三维场影里的天空并不是“真正”的天空,而是用图片拼起来的,欺骗我们眼睛。通常把大家所在的场景用一个几何体包裹起来,再在里面贴上从各个角度的风景图,就好像一个真正的环境一样。想想CS之类的天空,是不是有点印象?
原理现在的游戏里可能半球用的较多吧?不过原理上一样,我们这里以立方体为例。最简单的方法,莫过于画6个正方形,分别为它们贴上纹理。(要是真这样,我就不用写了-_-)这里我们只用一个正方形,也只用一个纹理,HOHO~想知道怎么回事?住下看吧(欠扁)
立方体环境贴图(Cubic Environment Mapping),也叫立方体贴图,就是一个纹理包含了包围物体场景的图像数据, 就像一个物体在立方体中心一样.每个面包含横竖各90度的视野,每个立方体贴图共6个面. 面的方向如下面左图所示:
右图呢,就是立方体贴图的UV坐标纹理的等价形式,说到底,就是把6张图片拼到一块儿去了而已。不过一般情况下,立方体贴图是映射到一个曲面上,而且,它跟本不使用UV坐标。代替它的是一个3D向量,在DirectX中是D3DFVF_TEXCOORDSIZE3类型。这样就很易的根据表面法向量将周围环境映射到物体表面,实现反射效果(激动人心呢)。
制作立方体贴图看起来立方体贴图挺麻烦的,其实DirectX自己的纹理格式.dds就支持Cubemap Texture。创建也不需要什么复杂的工具,用SDK带的DxTex.exe就可。
1. 新建一个立方体贴图
2. 选择一个表面
3. 为当面表面添加纹理
在这之前可要把各个方向的贴图准备好哦
4. 重复2、3,直到6个面全部完成
5. 保存
绘制天空盒子既然有了立方体贴图,那么是不是画个立方体把图贴上就行了?道理是不错,只不过还有更简单的办法:在面前画个矩形,你往哪看,就画哪个角度的天空!(太贱了,这样的鬼点子是谁想的?)
还记得D3DFVF_XYZRHW不?当顶点结构体中有RHW时,表示这个顶点已经在屏幕坐标系上,不用再进行什么世界变换、视图变换、投影变换,也不用进行光线计算了。不过这时的原点就在客户区的左上角了,其中x向右为正,y向下为正,而z的意义已经变为z-buffer的象素深度。那么我们就在z=1.0f处画这个矩形就行了,没有比1.0f更远的了!
有矩形了,那么怎么把环境贴图映射到上面呢?用HLSL一句搞定!(GPU编程不是盖的)。
不过别记了把纹理坐标向量先算出来:
Output.Tex = normalize( mul(Input.Pos, g_mInvWorldViewProjection) );
|
至于映射嘛,用texCUBE 就行了
语法
ret texCUBE(s, t)
|
Name
|
In/Out
|
Template Type
|
Component Type
|
Size
|
s
|
in
|
object
|
samplerCUBE
|
1
|
t
|
in
|
vector
|
float
|
3
|
ret
|
out
|
vector
|
float
|
4
|
|
|
|
|
|
|
代码:
float4 color = texCUBE( EnvironmentSampler, Input.Tex );
|
注意:texCUBE需要显卡支持PixelShader1.1,如果用到偏导数则需要PixelShader2.0查了一下我的显卡(Intel集成的GMA900),刚好支持PS2.0,我心里那个激动呀……激动的我都不知道该怎么表达我的感情了
看看我做的效果吧:ReferencesThe DirectX Software Development Kit
分享到:
相关推荐
!Microsoft.DirectX.dll Microsoft.DirectX.Direct3D.dll
vs2010中c#调用directx 9.0 direct3d画二维图形的方法,文档中包括详细的配置,以及初始化等操作。需要自己下载directx 9.0的sdk并安装。 在c#工程中,我添加了两个panel,按下对应的button会画出两个对称的三角形
《Direct3D技术内幕》所涉及的主题包括:DirectX 7基础,通过Direct3D和 T&L流水线的转换和照明,渲染对象图元,使用DirectInput与用户交互交控制力 反馈设备,纹理处理、雾化、alpha混合以及其他3D基本概念,高级...
32位控件microsoft.directx.direct3dµsoft.directx.direct3dx.rar
本书是基于DirectX9.0编写的,是介绍Direct3D技术的入门教程。它详细 介绍了Direct3D的背景、基本知识... 本书适用于略有DirectX基础的C/C++程序员学习Direct3D游戏开发,也适用于具有Direct3D开发经验的程序员参考。
Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D...
with an emphasis on game development, using Direct3D 12. It teaches the fundamentals of Direct3D and shader programming, after which the reader will be prepared to go on and learn more advanced ...
directx12 3d 游戏开发实战 源码
Direct3D 的DELPHI 实现.Microsoft Direct3D Tutorials 的DELPHI 实现.包括代码和实例
Direct 3D 游戏编程入门教程(第2版)基于DirectX 9.0,是介绍Direct3D技术...Direct 3D 游戏编程入门教程(第2版)适用于略有DirectX基础的C/C++程序员学习Direct3D游戏开发,也适用于具有Direct3D开发经验的程序员参考。
是一个关于Directx的使用及基础知识
Direct3D教程c#版Direct3D教程c#版Direct3D教程c#版Direct3D教程c#版Direct3D教程c#版Direct3D教程c#版Direct3D教程c#版Direct3D教程c#版Direct3D教程c#版Direct3D教程c#版Direct3D教程c#版Direct3D教程c#版Direct3D...
DirectX简介,介绍Direct3D开发环境配置和三维场景绘制的实现过程,并通过案例讲述基于面向对象思想的Direct3D开发过程模块封装方法。 第 4 章. 基本空间变换,介绍计算机图形学的空间变换原理和算法。 第 5 章. ...
源码配套博文 《【Visual C++】游戏开发笔记三十三 浅墨DirectX提高班之二 化腐朽为神奇:DirectX初始化四步曲 》 ,文章地址为 http://blog.csdn.net/zhmxy555/article/details/8197792, 点击debug下的exe文件...
第2章 Direct3D程序设计基础 CreateDevice 演示Direct3D程序的基本框架,以及如何创建Direct3D对象和Direct3D设备对象。
本程序在Windows 2000、VisualC++6.0、DirectX 9.0 环境下编译通过。
Tutorial 1: Setting up DirectX 11 with Visual Studio Tutorial 2: Creating a Framework and Window Tutorial 3: Initializing DirectX 11 Tutorial 4: Buffers, Shaders, and HLSL Tutorial 5: ...
龙书10中文版,译者汤毅。前言 这是一本介绍Direct3D 10...第III部分主要是运用Direct3D实现一些 有趣的技术和特殊效果,比如使用网格、地形渲染、拾取、粒子系统、环境贴图映射、法线 贴图映射、阴影和渲染到纹理。
本文首先介绍了国内外游戏研究发展状况以及游戏引擎的发展及其重要 性。研究了图形编程接口 DirectX...本文在此框架下对 3D 游戏引擎的主要功能模块做了研究和探讨,并在最 后设计开发了一个 3D 赛车游戏作为实践。
cs 和 direct 3D 混合编程的实例代码