实验六:凹凸纹理映射技术.doc

上传人:大米 文档编号:561468508 上传时间:2023-01-11 格式:DOC 页数:11 大小:383.52KB
返回 下载 相关 举报
实验六:凹凸纹理映射技术.doc_第1页
第1页 / 共11页
实验六:凹凸纹理映射技术.doc_第2页
第2页 / 共11页
实验六:凹凸纹理映射技术.doc_第3页
第3页 / 共11页
实验六:凹凸纹理映射技术.doc_第4页
第4页 / 共11页
实验六:凹凸纹理映射技术.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《实验六:凹凸纹理映射技术.doc》由会员分享,可在线阅读,更多相关《实验六:凹凸纹理映射技术.doc(11页珍藏版)》请在金锄头文库上搜索。

1、实验六:凹凸纹理映射技术一、实验目的掌握凹凸纹理映射的原理,熟悉Ogre中纹理映射的使用方法。二、实验仪器pc、vs2005三、实验原理及过程1、网上检索凹凸纹理映射相关技术凹凸纹理映射是一种纹理混合方法,它可以创建三维物体复杂的纹理外观表面。普通的纹理映射只能模拟比较平滑的三维物体表面,难以显示表面高低起伏、凹凸不平的效果。凹凸纹理映射能够通过一张表示物体表面凹凸程度的高度图(称为凹凸纹理),对另一张表示物体表面环境映射的纹理图的纹理坐标进行相应的干扰,经过干扰的纹理坐标将应用于环境映射,从而产生凹凸不平的显示效果。凹凸纹理映射通常由三张纹理映射图组成,第一张纹理图表示物体表面原始纹理颜色,

2、第二张凹凸纹理图表示物体表面凹凸的高度起伏值,用来对下一张环境纹理图坐标进行干扰,第三张纹理图表示周围镜面反射或漫反射光照的环境光照映射图。让我们来看看一个粗糙的表面。从远处看,你判断这个物体是粗糙的的唯一证据是在它表面上下的亮度有改变。你的大脑能够获得这些亮暗不一的图案信息,然后判断出它们是表面中有凹凸的部位。左边的一幅图就说明了这一点。你可以发现它是一个浮雕式的表面。一些矩型和字母被印入表面,但是它们摸上去就像是一个隐藏的监控器的玻璃。如果这个图像是在适当的位置上,那么它除了改变亮度,不需要再做任何其他的工作。那么你也许会问:我是怎么知道哪些点要亮,哪些点要暗呢?这不难。绝大多数人生活在这

3、样一种环境下这个环境的大多数光源来自上方(译者注:比如白天主要的光来自太阳,夜晚主要的光来自天花板上的日光灯)。所以向上倾的地方就会更亮,而向下倾的地方就会更暗。所以这种现象使你的眼睛看到一个物体上亮暗区域时,可以判断出它的凹凸情况。相对亮的块被判断是面向上的,相对暗的块被判断是面向下的。所以我只需要给物体上的线条简单得上色。如果你想要更多的证据,这里还有一幅几乎相同的图,不同于前的是它旋转了180度。所以它是前一幅图倒转的图像。那些先前看起来是凹进去的区域,现在看起来是凸出来的了。凹凸映射(凹凸纹理)Bump Mapping这个时候你的大脑并没有被完全欺骗,你脑中存留的视觉印象使你仍然有能力

4、判断出这是前一幅图,只是它的光源变了,是从小往上照的你的大脑可能强迫性地判断出它是第一幅图。事实上,你只要始终盯着它,并且努力地想像着光是从右下方向照射的,你就会理解它是凹的(译者注:因为日常生活的习惯,你会很容易把这些图形判断成凸出的图形,但是因为有了上一幅对照图的印象,你可能才会特别注意到这些图块其实还是凹入的,只是判断方法不符合我们日常生活习惯,因为这时大多数光不是从上方照射,而是从下往上照射)。凹凸纹理映射技术可以用来模拟粗糙物体表面凹凸不平的细节,如:橘子、草莓、树皮等。凹凸纹理映射最早只能用于离线绘制系统,随着图形硬件的发展,他已经成为游戏引擎中不可缺少的部分。最早的凹凸纹理映射使

5、用一个高度图和曲面参数(通常是纹理坐标)的偏导数计算扰动后的法向。这个偏导数表明了物体表面改变的尺度。理论上,凹凸映射中涉及的法向操作实在像素层次上的。凹凸纹理映射的步骤如下:(1)计算每个顶点处的T、B、N,并计算切平面坐标的矩阵。(2)根据该矩阵将光源变换到切平面空间,变换后光源的x、y即顶点的相邻点。(3)从凹凸纹理中取出顶点和相邻点处的高度,根据两者的法向量计算出顶点的新法向,再根据新法向量进行光照明计算。2、利用Ogre实现凹凸纹理映射描述程序实现时的思路包括对每个调用的API进行详细说明1)顶点渲染主函数:VS_OUTPUT VS(float4 Pos : POSITION, fl

6、oat2 Tex : TEXCOORD, float3 Normal : NORMAL, float3 Tangent : TANGENT) 2)像素渲染器主函数:PS_OUTPUT PS(float2 Tex: TEXCOORD0, float3 Light : TEXCOORD1, float3 View : TEXCOORD2, float3 Att : TEXCOORD3) 四、实验结果五、实验心得本次实验主要掌握凹凸纹理映射的原理,熟悉Ogre中纹理映射的使用方法;凹凸纹理映射是一种纹理混合方法,它可以实现三维物体复杂的纹理表面,普通的纹理映射只能模拟比较平滑的三维物体表面,而凹凸纹

7、理映射经相应的技术可以产生凹凸不平的显示效果,凹凸纹理映射技术可以用来模拟粗糙物体表面凹凸不平的细节;凹凸映射和纹理映射非常相似。然而,纹理映射是把颜色加到多边形上,而凹凸映射是把粗糙信息加到多边形上。这在多边形的视觉上会产生很吸引人的效果。我们只需要添加一点信息到本来需要使用大量多边形的物体上。需要注意的是这个物体是平的,但是它看起来却是粗糙不平的。让我们来看看左边的那个立方体。如果你很近地观察它时,你会发现它上面的很多细节。它看起来好像是由成千上万个多边形构成的,其实它只是由6个矩形构成。通过本次实验了解凹凸纹理映射的原理,学会在ogre中对三维物体使用纹理映射的方法,对ogre的了解更进

8、一步,收获颇多。六、 主要代码Dot3Bump.h#ifndef _Dot3Bump_H_#define _Dot3Bump_H_#include SdkSample.husing namespace Ogre;using namespace OgreBites;class _OgreSampleClassExport Sample_Dot3Bump : public SdkSamplepublic:Sample_Dot3Bump(): mMoveLights (true)mInfoTitle = Bump Mapping;mInfoDescription = Shows how to use

9、 the dot product blending operation and normalization cube map to achieve a bump mapping effect. Tangent space computations made through the guide of the tutorial on bump mapping from http:/users.ox.ac.uk/univ1234 by paul.bakeruniv.ox.ac.uk.;mInfoThumbnail = thumb_bump.png;mInfoCategory = Lighting;m

10、InfoHelp = Left click and drag anywhere in the scene to look around. Let go again to show cursor and access widgets. Use WASD keys to move.;StringVector getRequiredPlugins()StringVector names;names.push_back(Cg Program Manager);return names;void testCapabilities(const RenderSystemCapabilities* caps)

11、if (!caps-hasCapability(RSC_VERTEX_PROGRAM) | !(caps-hasCapability(RSC_FRAGMENT_PROGRAM) OGRE_EXCEPT(Exception:ERR_NOT_IMPLEMENTED, Your graphics card does not support vertex and fragment programs, so you cannot run this sample. Sorry!, Dot3BumpSample:testCapabilities); if (!GpuProgramManager:getSin

12、gleton().isSyntaxSupported(arbfp1) &!GpuProgramManager:getSingleton().isSyntaxSupported(ps_2_0)OGRE_EXCEPT(Exception:ERR_NOT_IMPLEMENTED, Your card does not support shader model 2, so you cannot run this sample. Sorry!, Dot3BumpSample:testCapabilities);bool frameRenderingQueued(const FrameEvent& evt

13、)if (mMoveLights)/ rotate the light pivotsmLightPivot1-roll(Degree(evt.timeSinceLastFrame * 30);mLightPivot2-roll(Degree(evt.timeSinceLastFrame * 10);return SdkSample:frameRenderingQueued(evt); / dont forget the parent class updates!void itemSelected(SelectMenu* menu)if (menu = mMeshMenu)/ change to

14、 the selected entitymObjectNode-detachAllObjects();mObjectNode-attachObject(mSceneMgr-getEntity(mMeshMenu-getSelectedItem();/ remember which material is currently selectedint index = std:max(0, mMaterialMenu-getSelectionIndex();/ update the material menus optionsmMaterialMenu-setItems(mPossibilitiesmMeshMenu-getSelectedItem();mMaterialMenu-selectItem(index); / select the material with the saved indexelse/ set the selected material for the active mesh(Entity*)mObjectNode-getAttachedObject(0)-setMaterialName(menu-getSelectedItem();void checkBoxToggled(CheckBox* box)if (Str

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号