zoukankan      html  css  js  c++  java
  • 渲染到纹理(RTT)

    2010/9/19

    Render To Texture,即渲染到纹理,简称RTT,是非常简单但是非常有用的技术,下面先说一下怎么样编写代码,再说具体的用途。

    渲染到纹理,顾名思义,就是把我们要渲染的东西渲染到一张纹理上面,而不是像我们平常那样渲染到一张平面。

    1、 首先,定义一些变量

    LPDIRECT3DTEXTURE9 pRenderTexture = NULL; //要渲染到的那张纹理
    LPDIRECT3DSURFACE9 pRenderSurface = NULL; //纹理的渲染对象

    2、 创建空的纹理

    pd3dDevice->CreateTexture(…, pRenderTexture, …);

    其中的DWORD Usage参数一定要是D3DUSAGE_RENDERTARGET,而且D3DPOOL Pool也必须为D3DPOOL_DEFAULT

    3、 获得pRenderTexture的纹理表面,因为渲染到纹理其实就是渲染到纹理的表面

    pRenderTexture->GetSurfaceLevel( 0, &pRenderSurface );

    4、 开始执行渲染到纹理(表面)的步骤

    pd3dDevice->SetRenderTarget( 0, pRenderSurface );    //设定渲染表面为纹理表面

    pd3dDevice->Clear( D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER );

    pd3dDevice->BeginScene();

    //在这里像往常那样编写渲染的代码

    pd3dDevice->EndScene();

    这样就得到了一张包含数据的纹理对象,它的内容就是在上一步中渲染出来的效果,通俗的讲就是我们程序的窗口的那张图片。然后我们就可以用那张纹理贴到别的物体上面了,步骤跟普通的纹理一样。

    还有一些要说明的:

    1、 投影矩阵中的长宽比要跟你创建的纹理的长宽比的一样,所以一般都会有一个纹理的自己的投影矩阵

    2、 在执行RTT之前要保存之前的渲染表面

    pd3dDevice->GetRenderTarget( 0, &pBackBuffer );

    3、 执行完RTT之后要重新设定渲染表面,因为之前是渲染到纹理的表面

    pd3dDevice->SetRenderTarget( 0, pBackBuffer );

    RTT能用到的地方(我现在能想到的):

    1、 实现反射的效果。通过RTT,不用执行两次一样的渲染

    2、 电视机播放效果。

  • 相关阅读:
    Python学习笔记模式匹配与正则表达式之使用和不使用正则表达式
    关于Jqury的一些杂碎
    客户端验证模型
    导航(摘)
    解决了DIV+CSS一个问题
    购买了新书《Bootstrap用户手册—设计响应式网站》及简介Bootstrap是什么
    博客园的博客页面开通了,今天!
    利用Cmake 将最新版本OBS编译成windows版本。
    C语言无法使用引用,一定要使用怎么办? ------指针的指针做参数
    linux core文件的打开和分析
  • 原文地址:https://www.cnblogs.com/littlethank/p/2288791.html
Copyright © 2011-2022 走看看