• D3D渲染到纹理


    代码
    //=============================================================================
    // Desc: 纹理影射基础
    //=============================================================================

    #include 
    <d3dx9.h>

    //-----------------------------------------------------------------------------
    // Desc: 全局变量
    //-----------------------------------------------------------------------------
    LPDIRECT3D9             g_pD3D       = NULL;    //Direct3D对象
    LPDIRECT3DDEVICE9       g_pd3dDevice = NULL;    //Direct3D设备对象
    LPDIRECT3DVERTEXBUFFER9 g_pVB        = NULL;    //顶点缓冲区对象
    LPDIRECT3DTEXTURE9      g_pTexture   = NULL;    //纹理对象

    LPDIRECT3DTEXTURE9      g_pRender2Tex 
    = NULL;
    LPDIRECT3DSURFACE9      g_pRenderSur 
    = NULL;
    LPDIRECT3DSURFACE9      g_pBackupSur 
    = NULL;

    //-----------------------------------------------------------------------------
    // Desc: 顶点结构
    //-----------------------------------------------------------------------------
    struct CUSTOMVERTEX
    {
        FLOAT x, y, z;    
    //顶点位置  
        FLOAT u,v ;          //顶点纹理坐标
    };
    #define D3DFVF_CUSTOMVERTEX   (D3DFVF_XYZ|D3DFVF_TEX1)


    //-----------------------------------------------------------------------------
    // Desc: 设置变换矩阵
    //-----------------------------------------------------------------------------
    VOID SetupMatrices()
    {
        
    //创建并设置世界矩阵
        D3DXMATRIXA16 matWorld;
        D3DXMatrixIdentity( 
    &matWorld );
        g_pd3dDevice
    ->SetTransform( D3DTS_WORLD, &matWorld );

        
    //创建并设置观察矩阵
        D3DXVECTOR3 vEyePt( 0.0f0.0f-10 );
        D3DXVECTOR3 vLookatPt( 
    0.0f0.0f0.0f );
        D3DXVECTOR3 vUpVec( 
    0.0f1.0f0.0f );
        D3DXMATRIXA16 matView;
        D3DXMatrixLookAtLH( 
    &matView, &vEyePt, &vLookatPt, &vUpVec );
        g_pd3dDevice
    ->SetTransform( D3DTS_VIEW, &matView );

        
    //创建并设置投影矩阵
        D3DXMATRIXA16 matProj;
        D3DXMatrixPerspectiveFovLH( 
    &matProj, D3DX_PI/41.0f1.0f100.0f );
        g_pd3dDevice
    ->SetTransform( D3DTS_PROJECTION, &matProj );
    }


    //-----------------------------------------------------------------------------
    // Desc: 初始化Direct3D
    //-----------------------------------------------------------------------------
    HRESULT InitD3D( HWND hWnd )
    {
        
    //创建Direct3D对象, 该对象用于创建Direct3D设备对象
        if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
            
    return E_FAIL;

        
    //设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象
        D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory( 
    &d3dpp, sizeof(d3dpp) );
        d3dpp.Windowed 
    = TRUE;
        d3dpp.SwapEffect 
    = D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat 
    = D3DFMT_X8R8G8B8;

        
    //创建Direct3D设备对象
        if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                          D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                          
    &d3dpp, &g_pd3dDevice ) ) )
        {
            
    return E_FAIL;
        }

        
    //禁用照明效果
        g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE ); 

        
    //设置变换矩阵
        SetupMatrices();

        HRESULT hr 
    = g_pd3dDevice->CreateTexture(256,256,1,D3DUSAGE_RENDERTARGET,
            D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, 
    &g_pRender2Tex, NULL);
        
    if (FAILED(hr))
        {
            
    return E_FAIL;
        }
        g_pRender2Tex
    ->GetSurfaceLevel(0&g_pRenderSur);
        
        
    return S_OK;
    }


    //-----------------------------------------------------------------------------
    // Desc: 创建场景图形
    //-----------------------------------------------------------------------------
    HRESULT InitGriphics()
    {
        
    //创建纹理对象
        if( FAILED( D3DXCreateTextureFromFile( g_pd3dDevice, L"texture.jpg"&g_pTexture ) ) )
        {
           MessageBox(NULL, L
    "创建纹理失败", L"Texture.exe", MB_OK);
           
    return E_FAIL;
        }

        
    //顶点数据
        CUSTOMVERTEX g_Vertices[] =
        {
            { 
    -3,   -3,  0.0f,  0.0f1.0f},   
            { 
    -3,    3,  0.0f,  0.0f0.0f},    
            {  
    3,   -3,  0.0f,  1.0f1.0f},    
            {  
    3,    3,  0.0f,  1.0f0.0f }

        };
        
        
    //创建顶点缓冲区
        if( FAILED( g_pd3dDevice->CreateVertexBuffer( 4*sizeof(CUSTOMVERTEX),
                                                     
    0, D3DFVF_CUSTOMVERTEX,
                                                     D3DPOOL_MANAGED, 
    &g_pVB,NULL ) ) )
        {
            
    return E_FAIL;
        }

        
    //填充顶点缓冲区
        VOID* pVertices;
        
    if( FAILED( g_pVB->Lock( 0sizeof(g_Vertices), (void**)&pVertices, 0 ) ) )
            
    return E_FAIL;
        memcpy( pVertices, g_Vertices, 
    sizeof(g_Vertices) );
        g_pVB
    ->Unlock();

        
    return S_OK;
    }


    //-----------------------------------------------------------------------------
    // Desc: 释放创建的对象
    //-----------------------------------------------------------------------------
    VOID Cleanup()
    {
        
    //释放纹理对象
        if( g_pTexture != NULL )
            g_pTexture
    ->Release();

        
    //释放顶点缓冲区对象
        if( g_pVB != NULL )        
            g_pVB
    ->Release();

        
    //释放Direct3D设备对象
        if( g_pd3dDevice != NULL ) 
            g_pd3dDevice
    ->Release();

        
    //释放Direct3D对象
        if( g_pD3D != NULL )       
            g_pD3D
    ->Release();
    }


    //-----------------------------------------------------------------------------
    // Desc: 渲染图形 
    //-----------------------------------------------------------------------------
    VOID Render()
    {
        
    //清空后台缓冲区
        g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(4550170), 1.0f0 );
        
        
    //开始在后台缓冲区绘制图形
        if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
        {
            g_pd3dDevice
    ->GetRenderTarget(0&g_pBackupSur);
            g_pd3dDevice
    ->SetRenderTarget(0, g_pRenderSur);

            
    /*RTT*/
            g_pd3dDevice
    ->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(000), 1.0f0 );
            g_pd3dDevice
    ->SetTexture( 0, g_pTexture ); //设置纹理
            g_pd3dDevice->SetStreamSource( 0, g_pVB, 0sizeof(CUSTOMVERTEX) );
            g_pd3dDevice
    ->SetFVF( D3DFVF_CUSTOMVERTEX );
            g_pd3dDevice
    ->DrawPrimitive( D3DPT_TRIANGLESTRIP, 02);

            D3DXSaveTextureToFileA(
    "tt.tga", D3DXIFF_TGA, g_pRender2Tex, NULL);

            
    /*真是场景*/
            g_pd3dDevice
    ->SetRenderTarget(0, g_pBackupSur);

            g_pd3dDevice
    ->SetTexture( 0, g_pTexture ); //设置纹理
            g_pd3dDevice->SetStreamSource( 0, g_pVB, 0sizeof(CUSTOMVERTEX) );
            g_pd3dDevice
    ->SetFVF( D3DFVF_CUSTOMVERTEX );
            g_pd3dDevice
    ->DrawPrimitive( D3DPT_TRIANGLESTRIP, 02);


            
    //结束在后台缓冲区绘制图形
            g_pd3dDevice->EndScene();
        }

        
    //将在后台缓冲区绘制的图形提交到前台缓冲区显示
        g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
    }


    //-----------------------------------------------------------------------------
    // Desc: 消息处理
    //-----------------------------------------------------------------------------
    LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
    {
        
    switch( msg )
        {
        
    case WM_DESTROY:
            Cleanup();
            PostQuitMessage( 
    0 );
            
    return 0;
        }

        
    return DefWindowProc( hWnd, msg, wParam, lParam );
    }



    //-----------------------------------------------------------------------------
    // Desc: 入口函数
    //-----------------------------------------------------------------------------
    INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
    {

        
    //注册窗口类
        WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L0L,
                          GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                           L
    "ClassName", NULL };
        RegisterClassEx( 
    &wc );

        
    //创建窗口
        HWND hWnd = CreateWindow(  L"ClassName", L"纹理影射基础",
                                  WS_OVERLAPPEDWINDOW, 
    200100800600,
                                  GetDesktopWindow(), NULL, wc.hInstance, NULL );

        
    //初始化Direct3D
        if( SUCCEEDED( InitD3D( hWnd ) ) )
        {
            
    //创建场景图形
            if( SUCCEEDED( InitGriphics() ) )
            {
                
    //显示窗口
                ShowWindow( hWnd, SW_SHOWDEFAULT );
                UpdateWindow( hWnd );

                
    //进入消息循环
                MSG msg;
                ZeroMemory( 
    &msg, sizeof(msg) );
                
    while( msg.message!=WM_QUIT )
                {
                    
    if( PeekMessage( &msg, NULL, 0U0U, PM_REMOVE ) )
                    {
                        TranslateMessage( 
    &msg );
                        DispatchMessage( 
    &msg );
                    }
                    
    else
                    {
                        Render();  
    //渲染图形
                    }
                }
            }
        }

        UnregisterClass(  L
    "ClassName", wc.hInstance );
        
    return 0;
    }
  • 相关阅读:
    PHP入门:在Windows中安装PHP工作环境
    Oracle数据库优化的经验总结
    引入js和css文件的总结
    PHP的加密解密字符串函数
    js+html5双人五子棋(源码下载)
    JAVA的网络编程基础概念
    asp.net的code-Behind技术
    10个调试Java的技巧
    Oracle基础 各种语句的定义格式
    CSS行高line-height的理解
  • 原文地址:https://www.cnblogs.com/lancidie/p/1848859.html
Copyright © 2020-2023  润新知