青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當自強而不息

高級紋理映射技術(4)

發(fā)光映射

發(fā)光映射(glowing mapping)與黑暗映射正好相反,它對于模擬那些具有獨立于基礎貼圖的發(fā)光部分的物體很有用,比如模擬發(fā)光二極管、按鈕、建筑物內(nèi)的燈光、太空船上的燈光等。發(fā)光映射應僅影響基礎貼圖上的發(fā)光區(qū)域,而不影響其他部分。因此需要對發(fā)光效果做加法,而不是做乘法。

pd3dDevice->SetTexture(0, g_base_texture);
pd3dDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);
pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);

pd3dDevice->SetTexture(1, g_dark_texture);
pd3dDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 0);
pd3dDevice->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
pd3dDevice->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT);
pd3dDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_ADD);

運行效果:

 

細節(jié)映射

如果要模擬一塊粗糙的石灰泥墻壁,可以通過細節(jié)映射(detail mapping)來實現(xiàn)。實現(xiàn)過程是:將基礎貼圖(也就是第一張紋理)的顏色未經(jīng)修改便作為第二個紋理操作階段中的第二個參數(shù),然后通過D3DTOP_ADDSIGNED將灰色的細節(jié)紋理與基礎貼圖相加。這個操作本質(zhì)上是做了一個加法,只是使用了有符號的顏色值來代替平時使用的無符號值。在對兩張紋理的像素顏色進行D3DTOP_ADDSIGNED操作時,它將參數(shù)的每個成分相加后再減去偏移量0.5,從而使有效值域變?yōu)?0.5 ~ 0.5。對一些比較舊的顯卡,當其不能支持D3DTOP_ADDSIGNED操作時,可以使用D3DTOP_MODULATE2X代替D3DTOP_ADDSIGNED操作進行模擬。

在細節(jié)貼圖中較亮的灰色紋理元素會使基礎貼圖變得更亮,而較暗的灰色紋理元素會使基礎貼圖變得更暗。由此可使物體呈現(xiàn)出粗糙的表面,從而使之看上去更為真實。示例代碼如下:

pd3dDevice->SetTexture(0, g_base_texture);
pd3dDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);
pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
pd3dDevice->SetTexture(1, g_detail_texture);
pd3dDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 0);
pd3dDevice->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
pd3dDevice->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT);
hr = pd3dDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_ADDSIGNED);
if(FAILED(hr))
pd3dDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE2X);

物體紋理

細節(jié)紋理

 

運行效果:

 

主程序:

#include "dxstdafx.h"
#include 
"resource.h"

#pragma warning(disable : 
4127 4995 4996)

#define release_com(p)    do { if(p) { (p)->Release(); (p) = NULL; } } while(0)

struct sCustomVertex
{
    
float x, y, z;
    
float u, v;
};

#define D3DFVF_CUSTOM_VERTEX    (D3DFVF_XYZ | D3DFVF_TEX1)

#define IDC_TOGGLE_FULLSCREEN        1
#define IDC_TOGGLE_REF                2
#define IDC_CHANGE_DEVICE            3

#define BLEND_DARK                    1
#define BLEND_DARK_ANIM                2
#define BLEND_TEXTURE_DIFFUSE        3
#define BLEND_DARK_DIFFUSE            4
#define BLEND_GLOW                    5
#define BLEND_DETAIL                6

#define BLEND_INFO_DARK                L"Dark Blend"
#define BLEND_INFO_DARK_ANIM        L"Dark Blend Animation"
#define BLEND_INFO_TEXTURE_DIFFUSE    L"Blend Texture and Vertex Diffuse Color"
#define BLEND_INFO_DARK_DIFFUSE        L"Blend Texture and Vertex Diffuse Color and Dark"
#define BLEND_INFO_GLOW                L"Glow Mapping"
#define BLEND_INFO_DETAIL            L"Detail Mapping"

const D3DXCOLOR FONT_COLOR(0.85f0.85f0.85f1.0f);

CDXUTDialogResourceManager    g_dlg_resource_manager;
CD3DSettingsDlg                g_settings_dlg;
CDXUTDialog                    g_button_dlg;

IDirect3DVertexBuffer9
*        g_vertex_buffer;
IDirect3DTexture9
*            g_base_texture;
IDirect3DTexture9
*            g_dark_texture;
IDirect3DTexture9
*            g_detail_texture;

ID3DXFont
*        g_font;
ID3DXSprite
*    g_text_sprite;
bool            g_show_help = true;
D3DLIGHT9        g_light;
D3DMATERIAL9    g_material;
int                g_blend_flag = BLEND_DARK;
WCHAR            g_blend_info[
128= BLEND_INFO_DARK;

//--------------------------------------------------------------------------------------
// Rejects any devices that aren't acceptable by returning false
//--------------------------------------------------------------------------------------
bool CALLBACK IsDeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, 
                                  D3DFORMAT BackBufferFormat, 
bool bWindowed, void* pUserContext )
{
    
// Typically want to skip backbuffer formats that don't support alpha blending

    IDirect3D9
* pD3D = DXUTGetD3DObject(); 

    
if( FAILED( pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal, pCaps->DeviceType, AdapterFormat, 
                    D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING, D3DRTYPE_TEXTURE, BackBufferFormat ) ) )
        
return false;

    
// check whether device support multi textures render
    if(pCaps->MaxTextureBlendStages <= 1)
        
return false;

    
return true;
}


//--------------------------------------------------------------------------------------
// Before a device is created, modify the device settings as needed.
//--------------------------------------------------------------------------------------
bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, const D3DCAPS9* pCaps, void* pUserContext )
{
    
// If video card does not support hardware vertex processing, then uses sofaware vertex processing.
    if((pCaps->DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) == 0)
        pDeviceSettings
->BehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING;

    
static bool is_first_time = true;

    
if(is_first_time)
    {
        is_first_time 
= false;

        
// if using reference device, then pop a warning message box.
        if(pDeviceSettings->DeviceType == D3DDEVTYPE_REF)
            DXUTDisplaySwitchingToREFWarning();
    }

    
return true;
}


//--------------------------------------------------------------------------------------
// Create any D3DPOOL_MANAGED resources here 
//--------------------------------------------------------------------------------------
HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, 
                                 
const D3DSURFACE_DESC* pBackBufferSurfaceDesc, 
                                 
void* pUserContext )
{
    HRESULT    hr;

    V_RETURN(g_dlg_resource_manager.OnCreateDevice(pd3dDevice));
    V_RETURN(g_settings_dlg.OnCreateDevice(pd3dDevice));

    D3DXCreateFont(pd3dDevice, 
180, FW_BOLD, 1, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY,
                   DEFAULT_PITCH 
| FF_DONTCARE, L"Arial"&g_font);

    V_RETURN(D3DXCreateTextureFromFile(pd3dDevice, L
"wall.bmp",    &g_base_texture));
    V_RETURN(D3DXCreateTextureFromFile(pd3dDevice, L
"dark.bmp",    &g_dark_texture));
    V_RETURN(D3DXCreateTextureFromFile(pd3dDevice, L
"detail.bmp",  &g_detail_texture));

    
// create vertex buffer and fill data

    sCustomVertex vertices[] 
=     
    {
        { 
-3.0f-3.0f,  0.0f,  0.0f1.0f},
        { 
-3.0f,  3.0f,  0.0f,  0.0f0.0f},
        {  
3.0f-3.0f,  0.0f,  1.0f1.0f},
        {  
3.0f,  3.0f,  0.0f,  1.0f0.0f}
    };

    pd3dDevice
->CreateVertexBuffer(sizeof(vertices), 0, D3DFVF_CUSTOM_VERTEX, D3DPOOL_MANAGED, &g_vertex_buffer, NULL);

    
void* ptr;
    g_vertex_buffer
->Lock(0sizeof(vertices), (void**)&ptr, 0);
    memcpy(ptr, vertices, 
sizeof(vertices));
    g_vertex_buffer
->Unlock();

    
return S_OK;
}


//--------------------------------------------------------------------------------------
// Create any D3DPOOL_DEFAULT resources here 
//--------------------------------------------------------------------------------------
HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice, 
                                
const D3DSURFACE_DESC* pBackBufferSurfaceDesc, 
                                
void* pUserContext )
{
    HRESULT hr;

    V_RETURN(g_dlg_resource_manager.OnResetDevice());
    V_RETURN(g_settings_dlg.OnResetDevice());
    V_RETURN(g_font
->OnResetDevice());
    V_RETURN(D3DXCreateSprite(pd3dDevice, 
&g_text_sprite));

    
// set dialog position and size

    g_button_dlg.SetLocation(pBackBufferSurfaceDesc
->Width - 1700);
    g_button_dlg.SetSize(
170170);

    
// setup view matrix

    D3DXMATRIX mat_view;
    D3DXVECTOR3 eye(
0.0f0.0f-10.0f);
    D3DXVECTOR3  at(
0.0f0.0f,  0.0f);
    D3DXVECTOR3  up(
0.0f1.0f,  0.0f);

    D3DXMatrixLookAtLH(
&mat_view, &eye, &at, &up);
    pd3dDevice
->SetTransform(D3DTS_VIEW, &mat_view);

    
// set projection matrix
    D3DXMATRIX mat_proj;
    
float aspect = (float)pBackBufferSurfaceDesc->Width / pBackBufferSurfaceDesc->Height;
    D3DXMatrixPerspectiveFovLH(
&mat_proj, D3DX_PI/4, aspect, 1.0f100.0f);
    pd3dDevice
->SetTransform(D3DTS_PROJECTION, &mat_proj);

    
// setup light

    ZeroMemory(
&g_light, sizeof(D3DLIGHT9));

    g_light.Type      
= D3DLIGHT_DIRECTIONAL;
    g_light.Diffuse.r 
= 0.5f;
    g_light.Diffuse.g 
= 0.5f;
    g_light.Diffuse.b 
= 0.5f;

    D3DXVECTOR3 light_dir(
0010);
    D3DXVec3Normalize((D3DXVECTOR3
*&g_light.Direction, &light_dir);

    
// setup material

    ZeroMemory(
&g_material, sizeof(D3DMATERIAL9));

    g_material.Ambient.r 
= 1.0f;
    g_material.Ambient.g 
= 1.0f;
    g_material.Ambient.b 
= 1.0f;
    g_material.Ambient.a 
= 1.0f;
    g_material.Diffuse.r 
= 0.7f;
    g_material.Diffuse.g 
= 0.7f;
    g_material.Diffuse.b 
= 0.7f;
    g_material.Diffuse.a 
= 0.5f;

    
// set texture sample method
    pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
    pd3dDevice
->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
    pd3dDevice
->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
    pd3dDevice
->SetSamplerState(1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);

    
return S_OK;
}

//--------------------------------------------------------------------------------------
// Release resources created in the OnResetDevice callback here 
//--------------------------------------------------------------------------------------
void CALLBACK OnLostDevice( void* pUserContext )
{
    g_dlg_resource_manager.OnLostDevice();
    g_settings_dlg.OnLostDevice();
    g_font
->OnLostDevice();

    release_com(g_text_sprite);
}


//--------------------------------------------------------------------------------------
// Release resources created in the OnCreateDevice callback here
//--------------------------------------------------------------------------------------
void CALLBACK OnDestroyDevice( void* pUserContext )
{
    g_dlg_resource_manager.OnDestroyDevice();
    g_settings_dlg.OnDestroyDevice();    

    release_com(g_font);
    release_com(g_vertex_buffer);
    release_com(g_base_texture);
    release_com(g_dark_texture);
    release_com(g_detail_texture);
}

//--------------------------------------------------------------------------------------
// Handle updates to the scene
//--------------------------------------------------------------------------------------
void CALLBACK OnFrameMove( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{
    HRESULT hr 
= S_OK;

    
if(g_blend_flag == BLEND_DARK)
    {
        pd3dDevice
->SetTexture(0, g_base_texture);
        pd3dDevice
->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX,    0);
        pd3dDevice
->SetTextureStageState(0, D3DTSS_COLORARG1,        D3DTA_TEXTURE);
        pd3dDevice
->SetTextureStageState(0, D3DTSS_COLOROP,            D3DTOP_SELECTARG1);

        pd3dDevice
->SetTexture(1, g_dark_texture);
        pd3dDevice
->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX,    0);
        pd3dDevice
->SetTextureStageState(1, D3DTSS_COLORARG1,        D3DTA_TEXTURE);
        pd3dDevice
->SetTextureStageState(1, D3DTSS_COLORARG2,        D3DTA_CURRENT);
        pd3dDevice
->SetTextureStageState(1, D3DTSS_COLOROP,            D3DTOP_MODULATE);

        wcscpy(g_blend_info, BLEND_INFO_DARK);
    }
    
else if(g_blend_flag == BLEND_DARK_ANIM)
    {
        pd3dDevice
->SetTexture(0, g_base_texture);
        pd3dDevice
->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX,    0);
        pd3dDevice
->SetTextureStageState(0, D3DTSS_COLORARG1,        D3DTA_TEXTURE);
        pd3dDevice
->SetTextureStageState(0, D3DTSS_COLOROP,            D3DTOP_SELECTARG1);

        pd3dDevice
->SetTexture(1, g_dark_texture);
        pd3dDevice
->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX,    0);
        pd3dDevice
->SetTextureStageState(1, D3DTSS_COLORARG1,        D3DTA_TEXTURE);
        pd3dDevice
->SetTextureStageState(1, D3DTSS_COLORARG2,        D3DTA_CURRENT);

        
static double last_time = 0.0f;
        
double interval = fTime - last_time;

        
if(interval < 0.5f)
            pd3dDevice
->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE);
        
else if(interval > 0.5f && interval < 1.0f)
            pd3dDevice
->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE2X);
        
else if(interval > 1.0f && interval < 1.5f)
            pd3dDevice
->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE4X);
        
else if(interval > 1.5f)
            last_time 
= fTime;

        wcscpy(g_blend_info, BLEND_INFO_DARK_ANIM);
    }
    
else if(g_blend_flag == BLEND_TEXTURE_DIFFUSE)
    {
        pd3dDevice
->SetRenderState(D3DRS_LIGHTING, TRUE);
        pd3dDevice
->SetRenderState(D3DRS_AMBIENT,  0x00808080);
        pd3dDevice
->SetLight(0&g_light);
        pd3dDevice
->LightEnable(0, TRUE);
        pd3dDevice
->SetMaterial(&g_material);

        pd3dDevice
->SetTexture(0, g_base_texture);
        pd3dDevice
->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX,    0);
        pd3dDevice
->SetTextureStageState(0, D3DTSS_COLORARG1,        D3DTA_TEXTURE);
        pd3dDevice
->SetTextureStageState(0, D3DTSS_COLORARG2,        D3DTA_DIFFUSE);
        pd3dDevice
->SetTextureStageState(0, D3DTSS_COLOROP,            D3DTOP_ADD);
        pd3dDevice
->SetTextureStageState(1, D3DTSS_COLOROP,            D3DTOP_DISABLE);
        
        wcscpy(g_blend_info, BLEND_INFO_TEXTURE_DIFFUSE);
    }
    
else if(g_blend_flag == BLEND_DARK_DIFFUSE)
    {
        pd3dDevice
->SetRenderState(D3DRS_LIGHTING, TRUE);
        pd3dDevice
->SetRenderState(D3DRS_AMBIENT,  0x0080FFFF);
        pd3dDevice
->SetLight(0&g_light);
        pd3dDevice
->LightEnable(0, TRUE);
        pd3dDevice
->SetMaterial(&g_material);

        pd3dDevice
->SetTexture(0, g_base_texture);
        pd3dDevice
->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX,    0);
        pd3dDevice
->SetTextureStageState(0, D3DTSS_COLORARG1,        D3DTA_TEXTURE);
        pd3dDevice
->SetTextureStageState(0, D3DTSS_COLORARG2,        D3DTA_DIFFUSE);
        pd3dDevice
->SetTextureStageState(0, D3DTSS_COLOROP,            D3DTOP_MODULATE);
        
        pd3dDevice
->SetTexture(1, g_dark_texture);
        pd3dDevice
->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX,    0);
        pd3dDevice
->SetTextureStageState(1, D3DTSS_COLORARG1,        D3DTA_TEXTURE);
        pd3dDevice
->SetTextureStageState(1, D3DTSS_COLORARG2,        D3DTA_CURRENT);
        pd3dDevice
->SetTextureStageState(1, D3DTSS_COLOROP,            D3DTOP_MODULATE);

        wcscpy(g_blend_info, BLEND_INFO_DARK_DIFFUSE);
    }
    
else if(g_blend_flag == BLEND_GLOW)
    {
        pd3dDevice
->SetTexture(0, g_base_texture);
        pd3dDevice
->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX,    0);
        pd3dDevice
->SetTextureStageState(0, D3DTSS_COLORARG1,        D3DTA_TEXTURE);        
        pd3dDevice
->SetTextureStageState(0, D3DTSS_COLOROP,            D3DTOP_SELECTARG1);

        pd3dDevice
->SetTexture(1, g_dark_texture);
        pd3dDevice
->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX,    0);
        pd3dDevice
->SetTextureStageState(1, D3DTSS_COLORARG1,        D3DTA_TEXTURE);
        pd3dDevice
->SetTextureStageState(1, D3DTSS_COLORARG2,        D3DTA_CURRENT);
        pd3dDevice
->SetTextureStageState(1, D3DTSS_COLOROP,            D3DTOP_ADD);

        wcscpy(g_blend_info, BLEND_INFO_GLOW);        
    }
    
else if(g_blend_flag == BLEND_DETAIL)
    {
        pd3dDevice
->SetTexture(0, g_base_texture);
        pd3dDevice
->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX,    0);
        pd3dDevice
->SetTextureStageState(0, D3DTSS_COLORARG1,        D3DTA_TEXTURE);        
        pd3dDevice
->SetTextureStageState(0, D3DTSS_COLOROP,            D3DTOP_SELECTARG1);

        pd3dDevice
->SetTexture(1, g_detail_texture);
        pd3dDevice
->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX,    0);
        pd3dDevice
->SetTextureStageState(1, D3DTSS_COLORARG1,        D3DTA_TEXTURE);
        pd3dDevice
->SetTextureStageState(1, D3DTSS_COLORARG2,        D3DTA_CURRENT);

        hr 
= pd3dDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_ADDSIGNED);

        
if(FAILED(hr))
            pd3dDevice
->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE2X);

        wcscpy(g_blend_info, BLEND_INFO_DETAIL);
    }
}

//--------------------------------------------------------------------------------------
// Render the helper information
//--------------------------------------------------------------------------------------
void RenderText()
{
    CDXUTTextHelper text_helper(g_font, g_text_sprite, 
20);
    
    text_helper.Begin();

    
// show frame and device states
    text_helper.SetInsertionPos(55);
    text_helper.SetForegroundColor(FONT_COLOR);
    text_helper.DrawTextLine( DXUTGetFrameStats(
true) );
    text_helper.DrawTextLine( DXUTGetDeviceStats() );

    
// show other simple information
    text_helper.SetForegroundColor( D3DXCOLOR(1.0f1.0f1.0f1.0f) );
    text_helper.DrawTextLine(g_blend_info);

    
// show helper information
    
    
const D3DSURFACE_DESC* surface_desc = DXUTGetBackBufferSurfaceDesc();

    
if(g_show_help)
    {
        text_helper.SetInsertionPos(
10, surface_desc->Height - 18 * 10);
        text_helper.SetForegroundColor(FONT_COLOR);
        text_helper.DrawTextLine(L
"Controls (F1 to hide):");
        
        text_helper.SetInsertionPos(
40, surface_desc->Height - 18 * 9);
        text_helper.DrawTextLine(L
"Quit: ESC");

        text_helper.DrawTextLine(L
"");
        text_helper.DrawTextLine(L
"1: Dark Blend");
        text_helper.DrawTextLine(L
"2: Dark Blend Animation");
        text_helper.DrawTextLine(L
"3: Blend Texture and Vertex Diffuse Color");
        text_helper.DrawTextLine(L
"4: Blend Texture and Vertex Diffuse Color and Dark");
        text_helper.DrawTextLine(L
"5: Glow Mapping");
        text_helper.DrawTextLine(L
"6: Detail Mapping");        
    }
    
else
    {
        text_helper.SetInsertionPos(
10, surface_desc->Height - 15 * 4);
        text_helper.SetForegroundColor( D3DXCOLOR(
1.0f1.0f1.0f1.0f) );
        text_helper.DrawTextLine(L
"Press F1 for help");
    }

    text_helper.End();
}

//--------------------------------------------------------------------------------------
// Render the scene 
//--------------------------------------------------------------------------------------
void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{
    HRESULT hr;

    
if(g_settings_dlg.IsActive())
    {
        g_settings_dlg.OnRender(fElapsedTime);
        
return;
    }

    
// Clear the render target and the zbuffer 
    V( pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0326480), 1.0f0) );

    
// Render the scene
    if( SUCCEEDED( pd3dDevice->BeginScene() ) )
    {
        pd3dDevice
->SetStreamSource(0, g_vertex_buffer, 0sizeof(sCustomVertex));
        pd3dDevice
->SetFVF(D3DFVF_CUSTOM_VERTEX);
        pd3dDevice
->DrawPrimitive(D3DPT_TRIANGLESTRIP, 02);

        RenderText();

        V(g_button_dlg.OnRender(fElapsedTime));

        V( pd3dDevice
->EndScene() );
    }
}


//--------------------------------------------------------------------------------------
// Handle messages to the application 
//--------------------------------------------------------------------------------------
LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, 
                          
bool* pbNoFurtherProcessing, void* pUserContext )
{
    
*pbNoFurtherProcessing = g_dlg_resource_manager.MsgProc(hWnd, uMsg, wParam, lParam);
    
if(*pbNoFurtherProcessing)
        
return 0;

    
if(g_settings_dlg.IsActive())
    {
        g_settings_dlg.MsgProc(hWnd, uMsg, wParam, lParam);
        
return 0;
    }

    
*pbNoFurtherProcessing = g_button_dlg.MsgProc(hWnd, uMsg, wParam, lParam);
    
if(*pbNoFurtherProcessing)
        
return 0;

    
return 0;
}


//--------------------------------------------------------------------------------------
// Handle keybaord event
//--------------------------------------------------------------------------------------
void CALLBACK OnKeyboardProc(UINT charater, bool is_key_down, bool is_alt_down, void* user_context)
{
    
if(is_key_down)
    {
        
switch(charater)
        {
        
case VK_F1:
            g_show_help 
= !g_show_help;
            
break;
        
case 49:    // press key "1"
            g_blend_flag = BLEND_DARK;
            
break;
        
case 50:    // press key "2"
            g_blend_flag = BLEND_DARK_ANIM;
            
break;
        
case 51:    // press key "3"
            g_blend_flag = BLEND_TEXTURE_DIFFUSE;
            
break;
        
case 52:    // press key "4"
            g_blend_flag = BLEND_DARK_DIFFUSE;
            
break;
        
case 53:    // press key "5"
            g_blend_flag = BLEND_GLOW;
            
break;
        
case 54:    // press key "6"
            g_blend_flag = BLEND_DETAIL;
            
break;
        }
    }
}

//--------------------------------------------------------------------------------------
// Handle events for controls
//--------------------------------------------------------------------------------------
void CALLBACK OnGUIEvent(UINT eventint control_id, CDXUTControl* control, void* user_context)
{
    
switch(control_id)
    {
    
case IDC_TOGGLE_FULLSCREEN:
        DXUTToggleFullScreen();
        
break;

    
case IDC_TOGGLE_REF:
        DXUTToggleREF();
        
break;

    
case IDC_CHANGE_DEVICE:
        g_settings_dlg.SetActive(
true);
        
break;
    }
}

//--------------------------------------------------------------------------------------
// Initialize dialogs
//--------------------------------------------------------------------------------------
void InitDialogs()
{
    g_settings_dlg.Init(
&g_dlg_resource_manager);
    g_button_dlg.Init(
&g_dlg_resource_manager);

    g_button_dlg.SetCallback(OnGUIEvent);

    
int x = 35, y = 10, width = 125, height = 22;

    g_button_dlg.AddButton(IDC_TOGGLE_FULLSCREEN, L
"Toggle full screen", x, y,         width, height);
    g_button_dlg.AddButton(IDC_TOGGLE_REF,          L
"Toggle REF (F3)",     x, y += 24, width, height);
    g_button_dlg.AddButton(IDC_CHANGE_DEVICE,      L
"Change device (F2)", x, y += 24, width, height, VK_F2);    
}

//--------------------------------------------------------------------------------------
// Initialize everything and go into a render loop
//--------------------------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
    
// Enable run-time memory check for debug builds.
#if defined(DEBUG) | defined(_DEBUG)
    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF 
| _CRTDBG_LEAK_CHECK_DF );
#endif

    
// Set the callback functions
    DXUTSetCallbackDeviceCreated( OnCreateDevice );
    DXUTSetCallbackDeviceReset( OnResetDevice );
    DXUTSetCallbackDeviceLost( OnLostDevice );
    DXUTSetCallbackDeviceDestroyed( OnDestroyDevice );
    DXUTSetCallbackMsgProc( MsgProc );
    DXUTSetCallbackFrameRender( OnFrameRender );
    DXUTSetCallbackFrameMove( OnFrameMove );
    DXUTSetCallbackKeyboard(OnKeyboardProc);
   
    
// TODO: Perform any application-level initialization here
    InitDialogs();

    
// Initialize DXUT and create the desired Win32 window and Direct3D device for the application
    DXUTInit( truetruetrue ); // Parse the command line, handle the default hotkeys, and show msgboxes
    DXUTSetCursorSettings( truetrue ); // Show the cursor and clip it when in full screen
    DXUTCreateWindow( L"Texture Color Blend" );
    DXUTCreateDevice( D3DADAPTER_DEFAULT, 
true640480, IsDeviceAcceptable, ModifyDeviceSettings );

    
// Start the render loop
    DXUTMainLoop();

    
// TODO: Perform any application-level cleanup here

    
return DXUTGetExitCode();
}

 

 

下載示例工程


posted on 2008-05-20 14:47 lovedday 閱讀(1622) 評論(1)  編輯 收藏 引用

評論

# re: 高級紋理映射技術(4) 2008-05-20 15:45 w2001

寫得很好!向博主學習!  回復  更多評論   


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導航

統(tǒng)計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产欧美高清| 欧美日韩国产综合一区二区| 亚洲精品日韩精品| 久久中文在线| 久久影院午夜片一区| 国产亚洲成精品久久| 亚洲午夜精品久久久久久浪潮| 日韩午夜免费| 欧美日本国产一区| 99re6这里只有精品| 中日韩在线视频| 欧美日韩在线电影| 99伊人成综合| 亚洲欧美日韩精品久久久久| 国产精品免费网站在线观看| 亚洲嫩草精品久久| 久久精品视频免费播放| 精品不卡一区| 欧美大片在线观看一区二区| 亚洲第一精品夜夜躁人人爽| 亚洲人午夜精品免费| 欧美日韩aaaaa| 日韩小视频在线观看专区| 亚洲综合国产激情另类一区| 国产精品亚洲综合天堂夜夜 | 亚洲国产精品嫩草影院| 美女在线一区二区| 亚洲日本中文字幕免费在线不卡| av成人免费| 国产精品久久久久久久久免费桃花 | 欧美在线综合| 依依成人综合视频| 欧美成年人视频网站欧美| 亚洲激情网站| 亚洲免费在线看| 国产日韩欧美一区| 久久视频国产精品免费视频在线| 欧美激情一区三区| 亚洲一区一卡| 好吊一区二区三区| 欧美精品一区在线发布| 亚洲欧美日韩国产一区二区| 欧美xxx成人| 一区二区三区日韩在线观看| 国产三级欧美三级日产三级99| 久久亚洲风情| 在线视频免费在线观看一区二区| 久久久久久久久久久久久久一区| 亚洲精品欧洲| 亚洲欧美日韩视频一区| 亚洲大胆人体视频| 欧美一区二区观看视频| 亚洲国产乱码最新视频| 欧美视频官网| 久久天堂精品| 亚洲深夜影院| 欧美国产一区二区三区激情无套| 亚洲你懂的在线视频| 亚洲春色另类小说| 国产精品视频一二三| 女仆av观看一区| 欧美影院在线播放| 一本久久综合亚洲鲁鲁| 蜜桃久久精品一区二区| 午夜欧美理论片| 亚洲毛片在线| 激情校园亚洲| 国产伦精品免费视频 | 一本一本久久a久久精品综合麻豆| 久久久久久色| 亚洲欧美不卡| 一区二区三区国产在线观看| 亚洲国产aⅴ天堂久久| 国产日韩欧美一区二区三区四区| 欧美久久视频| 美女主播一区| 久久久之久亚州精品露出| 亚洲免费一在线| 一区二区三区四区在线| 亚洲经典三级| 嫩草成人www欧美| 欧美在线一级va免费观看| 亚洲午夜精品一区二区三区他趣 | 国产精品久久一卡二卡| 欧美精彩视频一区二区三区| 久久一区精品| 久久久久国色av免费观看性色| 亚洲伊人网站| 亚洲婷婷在线| 一区二区三区高清| 99精品福利视频| 日韩视频一区二区在线观看 | 黑丝一区二区| 国产中文一区二区三区| 国产乱理伦片在线观看夜一区| 欧美午夜精品理论片a级大开眼界| 欧美国产一区二区| 欧美高清视频一区| 欧美激情亚洲自拍| 欧美另类在线观看| 欧美日韩国产综合视频在线观看中文| 欧美黄污视频| 欧美日韩国产va另类| 欧美日韩国产一级| 欧美视频你懂的| 国产精品毛片在线看| 国产精品免费网站| 国产亚洲福利| 激情亚洲一区二区三区四区| 樱花yy私人影院亚洲| 亚洲激情黄色| 日韩性生活视频| 亚洲图中文字幕| 欧美一区二区在线免费播放| 久久久精品网| 欧美激情亚洲一区| 91久久在线| 亚洲一区二区在线视频 | 在线视频欧美一区| 亚洲一区三区在线观看| 欧美在线播放高清精品| 久久久天天操| 亚洲成色999久久网站| 日韩小视频在线观看专区| 亚洲影视在线播放| 久久久国产午夜精品| 欧美福利视频一区| 国产精品久久波多野结衣| 国产一区二区在线观看免费| 亚洲福利精品| 亚洲午夜羞羞片| 欧美一级在线播放| 蜜桃av一区| 99精品国产在热久久婷婷| 午夜影院日韩| 欧美激情欧美狂野欧美精品| 国产精品视频专区| 亚洲国产毛片完整版| 亚洲自拍电影| 免费在线观看日韩欧美| 一本在线高清不卡dvd| 久久久99精品免费观看不卡| 欧美剧在线免费观看网站| 国产日韩精品视频一区| 亚洲日本成人女熟在线观看| 午夜一区二区三区在线观看| 欧美激情精品久久久六区热门| 亚洲一区激情| 欧美国产视频一区二区| 国产一本一道久久香蕉| 一本色道久久综合狠狠躁篇的优点 | 久久久亚洲精品一区二区三区| 亚洲国产精品久久久久秋霞不卡 | 欧美福利在线观看| 亚洲天堂av综合网| 欧美+日本+国产+在线a∨观看| 国产精品美女午夜av| 91久久精品国产91久久| 欧美伊人影院| 99视频一区二区三区| 欧美超级免费视 在线| 国产在线观看一区| 亚洲免费视频成人| 亚洲日本欧美| 久久天堂av综合合色| 国产日韩精品久久久| 亚洲一区二区av电影| 亚洲激情在线| 麻豆精品视频在线观看| 国产亚洲在线观看| 亚洲欧美中文日韩v在线观看| 亚洲高清在线精品| 久久久www成人免费精品| 国产欧美日韩综合| 小嫩嫩精品导航| 中文国产一区| 欧美午夜宅男影院在线观看| 亚洲伦理网站| 亚洲国产成人av| 免费在线观看日韩欧美| 亚洲国产高清自拍| 免费视频一区| 久久久精品一区| 国产一区视频在线看| 欧美在线短视频| 亚洲尤物在线| 国产免费观看久久| 欧美一级二区| 午夜精品剧场| 国产午夜久久| 久久久亚洲高清| 久久久久国产一区二区三区| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 久久久久欧美| 韩国v欧美v日本v亚洲v| 久久久免费观看视频| 久久精品夜色噜噜亚洲a∨| 国外精品视频| 中文在线资源观看网站视频免费不卡| 亚洲国产合集|