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

天行健 君子當自強而不息

高級紋理映射技術(1)

紋理映射在三維圖形程序設計中具有非常重要的作用,三維場景中的許多特殊效果都是通過紋理映射來實現的。例如通過紋理映射模擬復雜的光照效果,物體表面對周圍環境的反射效果等。

 

多層紋理映射

Direct3D最多支持8層紋理,也就是說,在一個三維物體的表面可以同時擁有1~8張不同的紋理貼圖。Direct3D能夠在一個渲染過程中把這些紋理顏色依次混合,渲染到同一個物體的表面。每一個紋理層對應0~7的索引序號,多層紋理映射能夠模擬更為真實的三維世界。例如,要顯示具有周圍景物倒影的光滑大理石地板,可以把大理石地板貼圖設置為紋理層0,把具有周圍景物倒影的貼圖設置為紋理層1,然后通過設置Direct3D多層紋理混合操作,把紋理層0和紋理層1相混合,這時繪制出的三維物體就同時具有大理石地板和景物倒影的紋理顏色。利用Direct3D多達8層的紋理混合,可以在圖形顯示系統中顯示豐富多彩的圖像。Direct3D多層紋理混合過程如下圖所示:

從上圖可以看出8層紋理是逐層混合然后輸出的,也就是說,最對需要8個階段完成紋理映射,而且每一階段都是獨立進行的,針對每一階段都需要設置相應的顏色和alpha混合方法。所以一個紋理層就相當于一個紋理階段,多層紋理映射有時也稱為多階段紋理混合。其中,是否應用紋理層0~7,即是否進行0~7紋理階段的操作,可由應用程序指定,但它們的選擇必須是順序的。也就是說,在沒有使用第n層的情況下,第n+1層不能使用。

默認情況下,第一個紋理階段操作(階段0)的默認操作是D3DTOP_MODULATE,其他紋理操作階段的默認操作是D3DTOP_DISABLE。即默認情況下Direct3D使用單層紋理映射繪制圖形,除紋理層0外,紋理層1~7都是禁用的。

在使用多層紋理映射之前,應先查詢當前設備是否支持紋理混合,以及最多能支持幾層紋理混合:

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

MaxTextureBlendStages
Maximum number of texture-blending stages supported in the fixed function pipeline. This value is the number of blenders available. In the programmable pixel pipeline, this corresponds to the number of unique texture registers used by pixel shader instructions.

為了將多層紋理映射到物體表面,需要為每層紋理指定使用的紋理坐標,各層紋理可以使用相同的紋理坐標,也可以使用不同的紋理坐標。紋理坐標包含在頂點數據中,如果需要使用不同的紋理坐標,那么在頂點數據中就需要包括多組紋理坐標,然后通過索引為每層紋理指定使用哪組紋理坐標:

pd3dDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);
pd3dDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1);

D3DTSS_TEXCOORDINDEX
Index of the texture coordinate set to use with this texture stage. You can specify up to eight sets of texture coordinates per vertex. If a vertex does not include a set of texture coordinates at the specified index, the system defaults to the u and v coordinates (0,0).

When rendering using vertex shaders, each stage's texture coordinate index must be set to its default value. The default index for each stage is equal to the stage index. Set this state to the zero-based index of the coordinate set for each vertex that this texture stage uses.

Additionally, applications can include, as logical OR with the index being set, one of the constants to request that Direct3D automatically generate the input texture coordinates for a texture transformation. For a list of all the constants, see D3DTSS_TCI.

With the exception of D3DTSS_TCI_PASSTHRU, which resolves to zero, if any of the following values is included with the index being set, the system uses the index strictly to determine texture wrapping mode. These flags are most useful when performing environment mapping.

這里指定了兩組紋理坐標:

struct sCustomVertex
{
float x, y, z;
DWORD color;
float u0, v0;
float u1, v1;
};
#define D3DFVF_CUSTOM_VERTEX	(D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX2)
sCustomVertex vertices[] = 	
{
{ -3.0f, -3.0f, 0.0f, 0xffffffff, 0.0f, 1.0f, 0.0f, 1.0f},
{ -3.0f, 3.0f, 0.0f, 0xffffffff, 0.0f, 0.0f, 0.0f, 0.0f},
{ 3.0f, -3.0f, 0.0f, 0xffffffff, 1.0f, 1.0f, 1.0f, 1.0f},
{ 3.0f, 3.0f, 0.0f, 0xffffffff, 1.0f, 0.0f, 1.0f, 0.0f}
};

這里指定的兩組紋理坐標值完全相同,你可以改變其中任何一組坐標,使兩層紋理使用不同的紋理坐標。

設置紋理層混合方法的代碼如下:

// set color blend operation and texture coordinate index for texture stage 0
pd3dDevice->SetTexture(0, g_texture_0);
pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
pd3dDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);
pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);

// set color blend operation and texture coordinate index for texture stage 1
pd3dDevice->SetTexture(1, g_texture_1);
pd3dDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_ADD);
pd3dDevice->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
pd3dDevice->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT);
pd3dDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
pd3dDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1);
pd3dDevice->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
pd3dDevice->SetSamplerState(1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);

這里先將物體的漫反射顏色和紋理層0的紋理顏色相乘,得到的結果再與紋理層1的紋理顏色相加后輸出。

該示例將物體紋理和光照紋理相混合后輸出:

物體紋理

光照紋理

運行效果圖如下:

我們可以修改頂點的紋理坐標為:

sCustomVertex vertices[] = 	
{
{ -3.0f, -3.0f, 0.0f, 0xffffffff, 0.0f, 1.0f, 1.0f, 0.0f},
{ -3.0f, 3.0f, 0.0f, 0xffffffff, 0.0f, 0.0f, 1.0f, 1.0f},
{ 3.0f, -3.0f, 0.0f, 0xffffffff, 1.0f, 1.0f, 0.0f, 0.0f},
{ 3.0f, 3.0f, 0.0f, 0xffffffff, 1.0f, 0.0f, 0.0f, 1.0f}
};

這時的運行效果圖如下:



主程序:

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

#pragma warning(disable : 
4127)

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

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

struct sCustomVertex
{
    
float x, y, z;
    DWORD color;
    
float u0, v0;
    
float u1, v1;
};

#define D3DFVF_CUSTOM_VERTEX    (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX2)

ID3DXFont
*        g_font;
ID3DXSprite
*    g_text_sprite;
bool            g_show_help = true;

CDXUTDialogResourceManager    g_dlg_resource_manager;
CD3DSettingsDlg                g_settings_dlg;
CDXUTDialog                    g_button_dlg;

IDirect3DVertexBuffer9
*        g_vertex_buffer;
IDirect3DTexture9
*            g_texture_0;
IDirect3DTexture9
*            g_texture_1;

//--------------------------------------------------------------------------------------
// 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_texture_0));
    V_RETURN(D3DXCreateTextureFromFile(pd3dDevice, L
"light.jpg"&g_texture_1));

    
// create vertex buffer and fill data

    sCustomVertex vertices[] 
=     
    {
        { 
-3.0f-3.0f,  0.0f,  0xffffffff0.0f1.0f0.0f1.0f},
        { 
-3.0f,  3.0f,  0.0f,  0xffffffff0.0f0.0f0.0f0.0f},
        {  
3.0f-3.0f,  0.0f,  0xffffffff1.0f1.0f1.0f1.0f},
        {  
3.0f,  3.0f,  0.0f,  0xffffffff1.0f0.0f1.0f0.0f}
        
        
/*
        { -3.0f, -3.0f,  0.0f,  0xffffffff, 0.0f, 1.0f, 1.0f, 0.0f},
        { -3.0f,  3.0f,  0.0f,  0xffffffff, 0.0f, 0.0f, 1.0f, 1.0f},
        {  3.0f, -3.0f,  0.0f,  0xffffffff, 1.0f, 1.0f, 0.0f, 0.0f},
        {  3.0f,  3.0f,  0.0f,  0xffffffff, 1.0f, 0.0f, 0.0f, 1.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-8.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);

    
// set color blend operation and texture coordinate index for texture stage 0
    pd3dDevice->SetTexture(0, g_texture_0);
    pd3dDevice
->SetTextureStageState(0, D3DTSS_COLOROP,        D3DTOP_MODULATE);
    pd3dDevice
->SetTextureStageState(0, D3DTSS_COLORARG1,    D3DTA_TEXTURE);
    pd3dDevice
->SetTextureStageState(0, D3DTSS_COLORARG2,    D3DTA_DIFFUSE);
    pd3dDevice
->SetTextureStageState(0, D3DTSS_ALPHAOP,        D3DTOP_DISABLE);
    pd3dDevice
->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX,    0);
    pd3dDevice
->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
    pd3dDevice
->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);

    
// set color blend operation and texture coordinate index for texture stage 1
    pd3dDevice->SetTexture(1, g_texture_1);
    pd3dDevice
->SetTextureStageState(1, D3DTSS_COLOROP,        D3DTOP_ADD);
    pd3dDevice
->SetTextureStageState(1, D3DTSS_COLORARG1,    D3DTA_TEXTURE);
    pd3dDevice
->SetTextureStageState(1, D3DTSS_COLORARG2,    D3DTA_CURRENT);
    pd3dDevice
->SetTextureStageState(1, D3DTSS_ALPHAOP,        D3DTOP_DISABLE);
    pd3dDevice
->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX,    1);
    pd3dDevice
->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
    pd3dDevice
->SetSamplerState(1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);

    pd3dDevice
->SetRenderState(D3DRS_LIGHTING, FALSE);

    
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_texture_0);
    release_com(g_texture_1);
}

//--------------------------------------------------------------------------------------
// Handle updates to the scene
//--------------------------------------------------------------------------------------
void CALLBACK OnFrameMove( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{
}

//--------------------------------------------------------------------------------------
// 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( D3DXCOLOR(
1.0f0.475f0.0f1.0f) );
    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(L
"Multi Texture Blending");

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

    
if(g_show_help)
    {
        text_helper.SetInsertionPos(
10, surface_desc->Height - 15 * 6);
        text_helper.SetForegroundColor( D3DXCOLOR(
1.0f0.475f0.0f1.0f) );
        text_helper.DrawTextLine(L
"Controls (F1 to hide):");
        
        text_helper.SetInsertionPos(
40, surface_desc->Height - 15 * 4);
        text_helper.DrawTextLine(L
"Quir: ESC");
    }
    
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(0000), 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;
        }
    }
}

//--------------------------------------------------------------------------------------
// 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"AddControl" );
    DXUTCreateDevice( D3DADAPTER_DEFAULT, 
true640480, IsDeviceAcceptable, ModifyDeviceSettings );

    
// Start the render loop
    DXUTMainLoop();

    
// TODO: Perform any application-level cleanup here

    
return DXUTGetExitCode();
}

 

在DirectX 6.0引入多紋理單元時,其中最有趣的一項特征便是它可以通過多次渲染將多張紋理映射到同一個多邊形上,因為這是通過多次渲染不同的紋理來實現的,所以該技術稱為多通道渲染(multipass rendering)。這里講的是多重紋理渲染,是指將多張紋理在一次渲染中映射到同一個多邊形上,而多通道渲染是指分多次將多張紋理映射到同一個多邊形上,前者更快,多通道渲染技術目前已經很少使用了。

 

下載示例工程


posted on 2008-05-19 18:30 lovedday 閱讀(3942) 評論(2)  編輯 收藏 引用

評論

# re: 高級紋理映射技術(1) 2008-11-10 21:03 深藍色

你好,我再看你的博客學習中,再第一層紋理用D3DTOP_MODULATE還得到顏色,不是會是黑色的嗎?兩個小于1的FLOAT相乘,不是很小,怎么會是那面墻的顏色,我用D3DTOP_ADD,就是你例子中得到的結果,這是怎么回事??  回復  更多評論   

# re: 高級紋理映射技術(1) 2013-05-03 01:05 seamanj

兄弟,貌似你第二步寫反了,經過0號紋理單元處理過后應該作為arg2而不是arg1

D3DTSS_COLORARG1
The default argument is D3DTA_TEXTURE.
D3DTSS_COLORARG2
The default argument is D3DTA_CURRENT
  回復  更多評論   


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


公告

導航

統計

常用鏈接

隨筆分類(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>
            亚洲高清在线| 91久久国产综合久久蜜月精品| 国产欧美一区二区三区视频| 一区二区三区久久网| 亚洲精品一品区二品区三品区| 久久九九久久九九| 国产在线麻豆精品观看| 亚洲欧美一区二区在线观看| 午夜精品理论片| 欧美一区二区播放| 怡红院精品视频| 亚洲国产一区视频| 欧美三日本三级三级在线播放| 亚洲一品av免费观看| 欧美午夜不卡在线观看免费| 欧美激情一区二区| 久久国产精品一区二区三区| 欧美国产一区视频在线观看| 一区二区三区.www| 亚洲免费影视| 亚洲国产成人在线| 亚洲午夜激情免费视频| 永久555www成人免费| 最新高清无码专区| 国产精品一区视频网站| 你懂的一区二区| 欧美日韩视频不卡| 玖玖综合伊人| 欧美系列电影免费观看| 老司机一区二区| 欧美日韩亚洲一区在线观看| 久久久久久久国产| 欧美精品激情在线| 久久精品欧洲| 欧美日本久久| 在线日韩欧美| 亚洲视频在线看| 亚洲区欧美区| 欧美一区二区三区视频在线观看 | 亚洲人成亚洲人成在线观看| 国产精品久久综合| 欧美二区不卡| 国产视频一区三区| 国语自产精品视频在线看一大j8 | 国产精品久久久久久久久久ktv | 久久国产视频网| 欧美精品免费视频| 麻豆免费精品视频| 国产热re99久久6国产精品| 最新日韩av| 亚洲第一在线综合网站| 午夜精品国产| 亚洲影音先锋| 欧美日韩免费一区| 欧美日韩无遮挡| 国产亚洲欧洲一区高清在线观看 | 欧美不卡一区| 好吊妞这里只有精品| 中文日韩欧美| 欧美精品福利视频| 亚洲国产天堂网精品网站| 国产一区二区三区自拍| 亚洲欧美区自拍先锋| 亚洲综合欧美日韩| 欧美色图五月天| 亚洲免费观看在线观看| aa亚洲婷婷| 在线观看欧美视频| 久久久久久网址| 久久综合五月天婷婷伊人| 国产在线观看91精品一区| 亚洲欧美日本国产专区一区| 午夜精品国产精品大乳美女| 国产精品久久久亚洲一区 | 99re66热这里只有精品4| 日韩视频中文字幕| 欧美日韩国产一区二区| 99在线观看免费视频精品观看| av成人黄色| 欧美日韩综合在线| 亚洲淫性视频| 久久精品国产99| 伊人久久噜噜噜躁狠狠躁| 久久先锋影音av| 亚洲精品国产精品乱码不99 | 久久久精品日韩| 久久天堂成人| 玉米视频成人免费看| 快播亚洲色图| 亚洲国产精品免费| 日韩一二三区视频| 久久精品视频免费| 国产精品久久久久久妇女6080| 国产精品99久久久久久宅男 | 国产亚洲精品美女| 欧美一区二区三区四区高清 | 亚洲精品久久久久久久久久久久| 一区二区国产在线观看| 国产精品系列在线| 久久先锋资源| 亚洲午夜一区二区三区| 久久女同精品一区二区| 最新亚洲视频| 国产精品尤物| 久久亚洲综合网| aⅴ色国产欧美| 久久在线免费观看| 欧美高清在线一区| 亚洲小说春色综合另类电影| 久色婷婷小香蕉久久| 夜夜嗨av一区二区三区| 国内精品久久久久久影视8| 欧美国产免费| 欧美一区1区三区3区公司| 91久久黄色| 久久免费视频在线| 亚洲在线网站| 亚洲第一在线视频| 欧美亚洲在线| 99国产精品久久久久老师| 激情一区二区| 国产精品你懂的在线欣赏| 欧美夫妇交换俱乐部在线观看| 午夜精品视频| 一区二区电影免费观看| 欧美大香线蕉线伊人久久国产精品| 亚洲伊人久久综合| 一区二区三区高清在线观看| 樱桃国产成人精品视频| 国产日韩欧美综合一区| 欧美色图五月天| 欧美另类综合| 欧美国产激情二区三区| 亚洲福利电影| 久久国产成人| 亚洲影视在线播放| 亚洲视频在线观看网站| 亚洲精品中文字幕在线| 亚洲高清视频在线| 亚洲人www| 亚洲精品1区2区| 在线日本成人| 亚洲日本成人| 亚洲精品乱码久久久久久蜜桃91| 好吊色欧美一区二区三区视频| 国产亚洲欧美一区二区三区| 国产一区二区三区四区五区美女 | 亚洲九九精品| 国产亚洲精品bt天堂精选| 国产精品久久| 国产精品久久福利| 国产精品私房写真福利视频 | 亚洲欧美日韩国产一区二区三区| 在线一区二区三区做爰视频网站| 亚洲精品美女| 一本色道88久久加勒比精品 | 亚洲欧美一区二区原创| 亚洲校园激情| 欧美在线观看日本一区| 久久人人爽人人| 欧美成人中文字幕在线| 欧美日本国产在线| 欧美性色aⅴ视频一区日韩精品| 欧美系列亚洲系列| 国产日韩精品入口| 久久狠狠婷婷| 你懂的成人av| 欧美视频一二三区| 国产亚洲综合在线| 亚洲国产精品成人综合| 一本色道精品久久一区二区三区| 亚洲一线二线三线久久久| 久久国产婷婷国产香蕉| 欧美国产亚洲精品久久久8v| 亚洲人成在线观看一区二区| 亚洲福利视频网| 国产精品一区二区三区观看| 国产一区二区三区久久久久久久久 | 亚洲国产精品久久人人爱蜜臀| 夜夜嗨av色一区二区不卡| 午夜精品久久久久久久99黑人| 免费在线欧美视频| 欧美日本亚洲韩国国产| 国产欧美日韩另类一区| 亚洲国产综合91精品麻豆| 亚洲小说欧美另类社区| 久久久免费精品| 日韩亚洲欧美成人一区| 欧美一区二区三区日韩视频| 欧美—级在线免费片| 国产美女一区二区| 亚洲精品久久视频| 久久精品成人一区二区三区 | 午夜精品久久| 欧美激情一区二区三区 | 欧美黑人在线观看| 亚洲欧美综合网| 99在线|亚洲一区二区| 美女爽到呻吟久久久久| 国产日韩在线看片|