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

天行健 君子當(dāng)自強(qiáng)而不息

高級(jí)紋理映射技術(shù)(6)

對(duì)一些特殊的應(yīng)用需要對(duì)紋理坐標(biāo)進(jìn)行處理,主要包括紋理坐標(biāo)自動(dòng)生成和紋理坐標(biāo)變換。下圖顯示了紋理坐標(biāo)的來(lái)源、處理過(guò)程以及到達(dá)光柵處理器的過(guò)程。

 

紋理坐標(biāo)自動(dòng)生成

在Direct3D程序中,不僅可以在模型載入階段或渲染階段指定物體的紋理坐標(biāo),還可以通過(guò)Direct3D渲染引擎自動(dòng)生成紋理坐標(biāo),用于諸如環(huán)境映射等特殊的視覺效果。與手動(dòng)設(shè)置紋理坐標(biāo)相比,紋理坐標(biāo)自動(dòng)生成在Direct3D坐標(biāo) 變換和光照流水線中完成,執(zhí)行速度更快。

Direct3D系統(tǒng)可以使用經(jīng)過(guò)變換的攝像機(jī)空間頂點(diǎn)位置坐標(biāo)、法線信息來(lái)生成紋理坐標(biāo)。如果使用紋理坐標(biāo)自動(dòng)生成,那么在頂點(diǎn)中就可以不用包含紋理坐標(biāo)數(shù)據(jù),從而可以降低圖形渲染時(shí)的數(shù)據(jù)傳輸量。紋理坐標(biāo)自動(dòng)生成主要用于產(chǎn)生一些特殊效果,在大多數(shù)情況下還是手工為每個(gè)頂點(diǎn)指定紋理坐標(biāo)。

通過(guò)調(diào)用SetTextureStageState()并將第二個(gè)參數(shù)設(shè)置為D3DTSS_TEXCOORDINDEX來(lái)控制Direct3D系統(tǒng)如何自動(dòng)生成紋理坐標(biāo)。

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.

其中第三個(gè)參數(shù)可以設(shè)為下列列表中的成員:

D3DTSS_TCI

Driver texture coordinate capability flags.

#define Value Description
D3DTSS_TCI_PASSTHRU 0x00000000L Use the specified texture coordinates contained within the vertex format. This value resolves to zero.
D3DTSS_TCI_CAMERASPACENORMAL 0x00010000L Use the vertex normal, transformed to camera space, as the input texture coordinates for this stage's texture transformation.
D3DTSS_TCI_CAMERASPACEPOSITION 0x00020000L Use the vertex position, transformed to camera space, as the input texture coordinates for this stage's texture transformation.
D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR 0x00030000L Use the reflection vector, transformed to camera space, as the input texture coordinate for this stage's texture transformation. The reflection vector is computed from the input vertex position and normal vector.
D3DTSS_TCI_SPHEREMAP 0x00040000L Use the specified texture coordinates for sphere mapping.

These constants are used by D3DTSS_TEXCOORDINDEX.

D3DTSS_TEXCOORDINDEX用于指定特定紋理層使用頂點(diǎn)中的第幾組紋理坐標(biāo),但如果指定了上表中的成員值,Direct3D將忽略頂點(diǎn)中的紋理坐標(biāo),轉(zhuǎn)而使用自動(dòng)生成的紋理坐標(biāo)。

D3DTSS_TEXTURETRANSFORMFLAGS用來(lái)控制生成的紋理坐標(biāo)的輸出,在大多數(shù)情況下紋理坐標(biāo)是二維的,即將D3DTSS_TEXTURETRANSFORMFLAGS設(shè)置為D3DTTFF_COUNT2。但當(dāng)繪制線段或三維紋理時(shí),紋理坐標(biāo)可能是一維或三維的。

D3DTSS_TEXTURETRANSFORMFLAGS
Member of the D3DTEXTURETRANSFORMFLAGS enumerated type that controls the transformation of texture coordinates for this texture stage. The default value is D3DTTFF_DISABLE.

輸出的紋理坐標(biāo)維數(shù)由枚舉類型D3DTSS_TEXTURETRANSFORMFLAGS指定,其定義如下:

Defines texture coordinate transformation values.

typedef enum D3DTEXTURETRANSFORMFLAGS
{
D3DTTFF_DISABLE = 0,
D3DTTFF_COUNT1 = 1,
D3DTTFF_COUNT2 = 2,
D3DTTFF_COUNT3 = 3,
D3DTTFF_COUNT4 = 4,
D3DTTFF_PROJECTED = 256,
D3DTTFF_FORCE_DWORD = 0x7fffffff,
} D3DTEXTURETRANSFORMFLAGS, *LPD3DTEXTURETRANSFORMFLAGS;

Constants

D3DTTFF_DISABLE
Texture coordinates are passed directly to the rasterizer.
D3DTTFF_COUNT1
The rasterizer should expect 1D texture coordinates. This value is used by fixed function vertex processing; it should be set to 0 when using a programmable vertex shader.
D3DTTFF_COUNT2
The rasterizer should expect 2D texture coordinates. This value is used by fixed function vertex processing; it should be set to 0 when using a programmable vertex shader.
D3DTTFF_COUNT3
The rasterizer should expect 3D texture coordinates. This value is used by fixed function vertex processing; it should be set to 0 when using a programmable vertex shader.
D3DTTFF_COUNT4
The rasterizer should expect 4D texture coordinates. This value is used by fixed function vertex processing; it should be set to 0 when using a programmable vertex shader.
D3DTTFF_PROJECTED
This flag is honored by the fixed function pixel pipeline, as well as the programmable pixel pipeline in versions ps_1_1 to ps_1_3. When texture projection is enabled for a texture stage, all four floating point values must be written to the corresponding texture register. Each texture coordinate is divided by the last element before being passed to the rasterizer. For example, if this flag is specified with the D3DTTFF_COUNT3 flag, the first and second texture coordinates are divided by the third coordinate before being passed to the rasterizer.
D3DTTFF_FORCE_DWORD
Forces this enumeration to compile to 32 bits in size. Without this value, some compilers would allow this enumeration to compile to a size other than 32 bits. This value is not used.

Remarks

Texture coordinates can be transformed using a 4 x 4 matrix before the results are passed to the rasterizer. The texture coordinate transforms are set by calling IDirect3DDevice9::SetTextureStageState, and by passing in the D3DTSS_TEXTURETRANSFORMFLAGS texture stage state and one of the values from D3DTEXTURETRANSFORMFLAGS. For more information about texture transforms, see Texture Coordinate Transformations (Direct3D 9).

首先,我們定義頂點(diǎn)結(jié)構(gòu)和格式:

struct sCustomVertex
{
float x, y, z;
};
#define D3DFVF_CUSTOM_VERTEX	D3DFVF_XYZ

接著生成頂點(diǎn)數(shù)據(jù),頂點(diǎn)數(shù)據(jù)中沒有包含紋理坐標(biāo):

// create vertex buffer and fill data
sCustomVertex vertices[] = 	
{
{ -1.0f, -1.0f, 0.0f},
{ -1.0f, 1.0f, 0.0f},
{ 1.0f, -1.0f, 0.0f},
{ 1.0f, 1.0f, 0.0f}
};
pd3dDevice->CreateVertexBuffer(sizeof(vertices), 0, D3DFVF_CUSTOM_VERTEX, D3DPOOL_MANAGED, &g_vertex_buffer, NULL);
void* ptr;
g_vertex_buffer->Lock(0, sizeof(vertices), (void**)&ptr, 0);
memcpy(ptr, vertices, sizeof(vertices));
g_vertex_buffer->Unlock();

然后讓Direct3D自動(dòng)生成紋理坐標(biāo):

// create texture coordinate using vertex position in camera space
pd3dDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION);
pd3dDevice->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);

運(yùn)行效果:

若設(shè)置D3DTSS_TEXCOORDINDEX為以下D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR,則效果為:

若設(shè)置D3DTSS_TEXCOORDINDEX為以下D3DTSS_TCI_SPHEREMAP,則效果為:

 

主程序:

#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)

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

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

#define D3DFVF_CUSTOM_VERTEX    D3DFVF_XYZ

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

CDXUTDialogResourceManager    g_dlg_resource_manager;
CD3DSettingsDlg                g_settings_dlg;
CDXUTDialog                    g_button_dlg;

IDirect3DVertexBuffer9
*        g_vertex_buffer;
IDirect3DTexture9
*            g_texture;

ID3DXFont
*        g_font;
ID3DXSprite
*    g_text_sprite;
bool            g_show_help;

//--------------------------------------------------------------------------------------
// 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;

    
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
"texture.jpg",    &g_texture));
    
    
// create vertex buffer and fill data

    sCustomVertex vertices[] 
=     
    {
        { 
-1.0f-1.0f,  0.0f},
        { 
-1.0f,  1.0f,  0.0f},
        {  
1.0f-1.0f,  0.0f},
        {  
1.0f,  1.0f,  0.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 world matrix
    D3DXMATRIX mat_world;
    D3DXMatrixIdentity(
&mat_world);
    pd3dDevice
->SetTransform(D3DTS_WORLD, &mat_world);

    
// setup view matrix

    D3DXMATRIX mat_view;
    D3DXVECTOR3 eye(
0.0f0.0f-3.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);

    pd3dDevice
->SetRenderState(D3DRS_LIGHTING, FALSE);

    
// set texture color blend method, disalbe alpha blend.

    pd3dDevice
->SetTexture(0, g_texture);    
    pd3dDevice
->SetTextureStageState(0, D3DTSS_COLORARG1,        D3DTA_TEXTURE);    
    pd3dDevice
->SetTextureStageState(0, D3DTSS_COLOROP,            D3DTOP_SELECTARG1);    
    pd3dDevice
->SetTextureStageState(0, D3DTSS_ALPHAOP,            D3DTOP_DISABLE);

    
// create texture coordinate using vertex position in camera space 
    pd3dDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX,            D3DTSS_TCI_CAMERASPACEPOSITION);
    
//pd3dDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX,            D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR);
    
//pd3dDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX,            D3DTSS_TCI_SPHEREMAP);    
    pd3dDevice->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS,    D3DTTFF_COUNT2);

    
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);
}

//--------------------------------------------------------------------------------------
// 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(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(L
"Texture Coordinate Automatic Generate");

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

    
if(g_show_help)
    {
        text_helper.SetInsertionPos(
10, surface_desc->Height - 18 * 5);
        text_helper.SetForegroundColor(FONT_COLOR);
        text_helper.DrawTextLine(L
"Controls (F1 to hide):");
        
        text_helper.SetInsertionPos(
40, surface_desc->Height - 18 * 4);
        text_helper.DrawTextLine(L
"Quit: 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"Texture Color And Alpha 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 18:47 lovedday 閱讀(3680) 評(píng)論(1)  編輯 收藏 引用

評(píng)論

# re: 高級(jí)紋理映射技術(shù)(6) 2011-07-20 10:49 王聰

D3DTSS_TCI 中的tci可以理解 成texturecoord constant index嗎?  回復(fù)  更多評(píng)論   


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


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(178)

3D游戲編程相關(guān)鏈接

搜索

最新評(píng)論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲在线日韩| 亚洲国产另类 国产精品国产免费| 新狼窝色av性久久久久久| 亚洲区中文字幕| 亚洲国产精品一区| 亚洲国产裸拍裸体视频在线观看乱了中文| 狂野欧美激情性xxxx| 久久香蕉国产线看观看av| 久久久99免费视频| 久久午夜av| 亚洲黄色一区二区三区| 日韩视频在线一区二区三区| 一本色道**综合亚洲精品蜜桃冫 | 亚洲精品国产精品国自产在线| 欧美日韩视频免费播放| 欧美日本一道本| 国产精品区一区| 激情综合在线| 夜夜嗨av一区二区三区| 欧美亚洲视频一区二区| 美女精品国产| 一本色道久久加勒比88综合| 欧美一级欧美一级在线播放| 久久亚洲精品伦理| 欧美午夜视频在线| 一区二区三区在线观看视频| 日韩午夜视频在线观看| 欧美在线观看视频在线| 欧美激情性爽国产精品17p| 中国成人亚色综合网站| 老司机免费视频一区二区| 欧美午夜电影一区| 亚洲日本中文字幕| 久久久久久久性| 一本久久青青| 免费亚洲一区| 一区二区三区在线免费观看| 亚洲肉体裸体xxxx137| 国产精品实拍| 最新国产の精品合集bt伙计| 欧美在线免费看| 日韩一级裸体免费视频| 久久蜜桃资源一区二区老牛| 国产精品福利久久久| 亚洲国产一二三| 久久精品在线播放| 在线综合亚洲欧美在线视频| 欧美大胆a视频| 激情综合网激情| 欧美永久精品| 99pao成人国产永久免费视频| 一区二区三区免费看| 欧美国产精品| 国内一区二区三区| 欧美尤物巨大精品爽| 亚洲国产欧美一区二区三区久久| 一区二区三区视频在线| 美女免费视频一区| 国产精品久久久久久亚洲调教| 黄色成人免费观看| 香蕉视频成人在线观看| 亚洲经典自拍| 久久av红桃一区二区小说| 欧美刺激性大交免费视频| 亚洲一区区二区| 欧美日韩在线高清| 亚洲激情专区| 久久久亚洲影院你懂的| 99精品免费视频| 免费久久精品视频| 影音先锋一区| 久久亚洲高清| 欧美在线观看日本一区| 免费观看久久久4p| 国产一区二区黄| 欧美一区二区三区精品| 一区二区电影免费在线观看| 免费在线亚洲| 亚洲电影免费观看高清完整版| 久久精品亚洲| 在线视频亚洲一区| 牛牛影视久久网| 国产一区在线看| 欧美在线你懂的| 性欧美video另类hd性玩具| 欧美精品一区二区蜜臀亚洲| 在线观看中文字幕亚洲| 麻豆精品一区二区综合av| 久久av在线| 影音先锋国产精品| 欧美凹凸一区二区三区视频| 久久尤物电影视频在线观看| 在线成人av| 久久精品国产第一区二区三区最新章节| 99视频精品| 国产精品外国| 欧美一区二区三区免费视| 欧美精品1区2区3区| 国产视频久久久久久久| 免费的成人av| 欧美午夜精品久久久久久人妖| 久久久噜噜噜久久久| 国产精品国产a| 一卡二卡3卡四卡高清精品视频| 亚洲最新视频在线播放| 欧美三级小说| 欧美中文字幕不卡| 一区二区不卡在线视频 午夜欧美不卡在| 亚洲图片激情小说| 亚洲第一页中文字幕| 原创国产精品91| 欧美亚州在线观看| 在线视频亚洲一区| 久久久久久久999| 亚洲三级免费电影| 国产一区二区av| 欧美日韩精品免费看| 久久综合久久综合这里只有精品| 一区二区三区高清视频在线观看| 久久综合影视| 噜噜噜躁狠狠躁狠狠精品视频| 激情综合五月天| 欧美日本三级| 牛人盗摄一区二区三区视频| 欧美中文字幕在线| 久久久精品视频成人| 欧美伊人久久久久久久久影院 | 亚洲一区二区精品在线观看| 亚洲国产婷婷香蕉久久久久久| 国产精品不卡在线| 欧美精品xxxxbbbb| 久久嫩草精品久久久精品| 一区二区免费在线观看| 最新日韩在线| 亚洲黄色成人| 伊人久久婷婷| 国产精品极品美女粉嫩高清在线 | 欧美激情精品久久久久久黑人| 久久综合伊人| 亚洲桃花岛网站| 日韩视频在线你懂得| 亚洲国产裸拍裸体视频在线观看乱了中文 | 影音先锋亚洲精品| 亚洲深夜福利网站| 欧美一级黄色录像| 男人的天堂亚洲在线| 亚洲欧美国产高清va在线播| 欧美日韩在线一二三| 欧美日韩视频在线观看一区二区三区 | 久久精品视频播放| 欧美在线视频二区| 久久亚洲私人国产精品va媚药| 麻豆91精品| 中文网丁香综合网| 亚洲欧美日韩一区二区| 欧美黄免费看| 亚洲电影毛片| 久久精品国产成人| 精品福利免费观看| 裸体歌舞表演一区二区| 亚洲韩国青草视频| 午夜性色一区二区三区免费视频| 欧美影院久久久| 欧美日韩中文字幕在线| 狠狠色香婷婷久久亚洲精品| 亚洲字幕一区二区| 亚洲另类视频| 欧美日韩亚洲成人| 先锋影音一区二区三区| 亚洲午夜av在线| 久热精品视频在线| 久久精品久久综合| 国模精品娜娜一二三区| 欧美在线视频不卡| 一本色道久久综合狠狠躁篇的优点| 久久精品国产欧美亚洲人人爽| 欧美日韩精品| 在线一区欧美| 中日韩男男gay无套| 国产精品高清在线| 久久精品一本| 欧美国产欧美亚州国产日韩mv天天看完整| 亚洲高清视频在线| 香蕉久久精品日日躁夜夜躁| 国产精品成人一区二区网站软件| 亚洲激情在线视频| 最新国产成人在线观看| 欧美日本精品一区二区三区| 欧美一区二区三区视频在线| 久久精品首页| 亚洲免费视频一区二区| 欧美高清在线播放| 国产精品爱啪在线线免费观看| 欧美在线电影| 久久综合影音| 久久av老司机精品网站导航| 久久精品国产99精品国产亚洲性色 | 亚洲天堂免费观看| 久久xxxx精品视频| 国产麻豆9l精品三级站|