﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Richard He-文章分类-D3D</title><link>http://www.cppblog.com/richardhe/category/8497.html</link><description>学无止境!永远学下去!</description><language>zh-cn</language><lastBuildDate>Mon, 13 Oct 2008 01:49:04 GMT</lastBuildDate><pubDate>Mon, 13 Oct 2008 01:49:04 GMT</pubDate><ttl>60</ttl><item><title>D3D中的渲染到纹理</title><link>http://www.cppblog.com/richardhe/articles/63853.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Mon, 13 Oct 2008 01:15:00 GMT</pubDate><guid>http://www.cppblog.com/richardhe/articles/63853.html</guid><wfw:comment>http://www.cppblog.com/richardhe/comments/63853.html</wfw:comment><comments>http://www.cppblog.com/richardhe/articles/63853.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/richardhe/comments/commentRss/63853.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/richardhe/services/trackbacks/63853.html</trackback:ping><description><![CDATA[渲染到纹理是D3D中的一项高级技术。一方面，它很简单，另一方面它很强大并能产生很多特殊效果。
比如说发光效果，环境映射，阴影映射，都可以通过它来实现。渲染到纹理只是渲染到表面的一个延伸。我们只需再加些东西就可以了。首先，我们要创造一个纹
理，并且做好一些防范措施。第二步我们就可以把适当的场景渲染到我们创建的纹理上了。然后，我们把这个纹理用在最后的渲染上。<br>　　?main.cpp<br>　　首先我们得声明所需要的对象。当然我们需要一张用来渲染的纹理。此外，我们还需要两个Surface对象。一个是用来存储后台缓冲区，一个用来当纹理的渲染对象。后面我再详细介绍它们。另外我们还需要两个矩阵，一个是用来当纹理的投影矩阵，另一个是存储原来的矩阵。<br>　　LPDIRECT3DTEXTURE9 pRenderTexture = NULL;<br>　　LPDIRECT3DSURFACE9 pRenderSurface = NULL,pBackBuffer = NULL;<br>　　D3DXMATRIX matProjection,matOldProjection;<br>
现在我们来创建纹理。前两个参数是纹理的宽度和高度，第三个参数是纹理的多级渐进纹理序列参数，在这里是设为1，第四个参数非常重要而且必须设为
D3DUSAGE_RENDERTARGET，表明我们所创建的纹理是用来渲染的。剩下的参数就是指纹理格式，顶点缓冲区的内存位置，和一个指向纹理的指
针。当纹理是用来当渲染对象时，顶点缓冲区的内存位置必须设为D3D_DEFAILT。<br>　　g_App.GetDevice()-&gt;CreateTexture(256,256,1,D3DUSAGE_RENDERTARGET,D3DFMT_R5G6B5,D3DPOOL_DEFAULT,&amp;pRenderTexture,NULL);<br>
为了访问纹理内存对象，我们需要一个Surface对象，因为D3D中的纹理是用这样的一个Surface来存储纹理数据的。为了得到纹理表面的
Surface,我们需要调用方法GetSurfaceLevel() 。第一个参数我们设为0，第二个参数为一个指向surface对象的指针。<br>　　pRenderTexture-&gt;GetSurfaceLevel(0,&amp;pRenderSurface);<br>　　下一步就是创建一个适合纹理维数的投影矩阵，因为纹理的横纵比和后台缓冲区的不一样。<br>　　D3DXMatrixPerspectiveFovLH(&amp;matProjection,D3DX_PI / 4.0f,1,1,100);<br>　　在我们的循环渲染之前，我们必须保存后台缓冲区和它的投影矩阵。<br>　　g_App.GetDevice()-&gt;GetTransform(D3DTS_PROJECTION,&amp;matOldProjection);<br>　　g_App.GetDevice()-&gt;GetRenderTarget(0,&amp;pBackBuffer);<br>
渲染循环函数可以分为两个部分。第一部分是渲染到纹理的过程。因此，渲染对象必须设为纹理表面。然后我们就可以把东西渲染到这个对象上了。渲染到另一个
表面上和正常地渲染到后台缓冲区差不多。只有一点不同，那就是先不调用Prensent（）函数，因为纹理上的内容并不需要显示在屏幕上。象平时一样，我
们先要重置表面颜色缓冲区，并且调用BeginSence()和EndSence()方法。为了能够适当的渲染，我们必须设置和纹理表面相符的投影矩阵。
否则最后的图象可能被扭曲<br>　　//render-to-texture<br>　　g_App.GetDevice()-&gt;SetRenderTarget(0,pRenderSurface); //set new render target<br>　　g_App.GetDevice()-&gt;Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_X#646464,1.0f,0); //clear texture<br>　　g_App.GetDevice()-&gt;BeginScene();<br>　　g_App.GetDevice()-&gt;SetTexture(0,pPyramideTexture);<br>　　D3DXMatrixRotationY(&amp;matRotationY,fRotation);<br>　　D3DXMatrixTranslation(&amp;matTranslation,0.0f,0.0f,5.0f);<br>　　g_App.GetDevice()-&gt;SetTransform(D3DTS_WORLD,&amp;(matRotationY * matTranslation));<br>　　g_App.GetDevice()-&gt;SetTransform(D3DTS_PROJECTION,&amp;matProjection); //set projection matrix<br>　　g_App.GetDevice()-&gt;SetStreamSource(0,pTriangleVB,0,sizeof(D3DVERTEX));<br>　　g_App.GetDevice()-&gt;DrawPrimitive(D3DPT_TRIANGLELIST,0,4);<br>　　g_App.GetDevice()-&gt;EndScene();<br>　　渲染循环的第二部分就是渲染最后场景的过程（也就是显示到屏幕上的过程）。渲染对象重新设为后台缓冲区，投影矩阵重新设为原来的投影矩阵。由于纹理已经准备好了，所以它和纹理层0相关联。<br>　　//render scene with texture<br>　　g_App.GetDevice()-&gt;SetRenderTarget(0,pBackBuffer); //set back buffer<br>　　g_App.GetDevice()-&gt;Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_X#000000,1.0f,0);<br>　　g_App.GetDevice()-&gt;BeginScene();<br>　　g_App.GetDevice()-&gt;SetTexture(0,pRenderTexture); //set rendered texture<br>　　g_App.GetDevice()-&gt;SetTransform(D3DTS_WORLD,&amp;matTranslation);<br>　　g_App.GetDevice()-&gt;SetTransform(D3DTS_PROJECTION,&amp;matOldProjection); //restore projection matrix<br>　　g_App.GetDevice()-&gt;SetStreamSource(0,pQuadVB,0,sizeof(D3DVERTEX));<br>　　g_App.GetDevice()-&gt;DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);<br>　　g_App.GetDevice()-&gt;EndScene();<br>　　g_App.GetDevice()-&gt;Present(NULL,NULL,NULL,NULL);<br>　　最后我们通过调用Release()方法释放Surface对象。<br>　　pRenderSurface-&gt;Release();<br>　　pRenderSurface = NULL;<br>　　pBackBuffer-&gt;Release();<br>　　pBackBuffer = NULL;<br>　　渲染到纹理能让你做很多事情，但是你必须注意一些限制。首先深度缓冲区必须总是大于或等于渲染对象的大小。此外，渲染对象和深度缓冲区的格式必须一致。<img src ="http://www.cppblog.com/richardhe/aggbug/63853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/richardhe/" target="_blank">RichardHe</a> 2008-10-13 09:15 <a href="http://www.cppblog.com/richardhe/articles/63853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏中汉字显示的实现与技巧</title><link>http://www.cppblog.com/richardhe/articles/63851.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Mon, 13 Oct 2008 01:12:00 GMT</pubDate><guid>http://www.cppblog.com/richardhe/articles/63851.html</guid><wfw:comment>http://www.cppblog.com/richardhe/comments/63851.html</wfw:comment><comments>http://www.cppblog.com/richardhe/articles/63851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/richardhe/comments/commentRss/63851.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/richardhe/services/trackbacks/63851.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 游戏中汉字显示的实现与技巧[ZZ]作者：炎龙工作室 千里马肝版本：v1.0最后更新日期：2002-3-30绪言在游戏中，因为我们是中国人麻，通常都需要显示汉字，比方说交待剧情。而对于文字的显示，英文的显示要较其简单得多，因为只有26个字母，就算再加一些标点、符号什么的，用一张位图，就可以足以显示所有的单词了，而相关实现技巧，也比较轻松。而中文的显示方法，要复杂得...&nbsp;&nbsp;<a href='http://www.cppblog.com/richardhe/articles/63851.html'>阅读全文</a><img src ="http://www.cppblog.com/richardhe/aggbug/63851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/richardhe/" target="_blank">RichardHe</a> 2008-10-13 09:12 <a href="http://www.cppblog.com/richardhe/articles/63851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>