SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW) 
这个函数的作用是可以不对3D模型中我们看不到的那一面进行处理~,但是在下面的那个例子里,创建了一个3D的茶壶模型,在茶壶旋转的时候,茶壶的外表面可以看到只有面对我们的这一面才被渲染,可是我发现,当茶壶的壶把和壶嘴转到背对我们这一面的时候,仍然被渲染了~,我不明白这是为什么,那位大哥能帮忙解释一下,多谢~ #include "d3dx9.h" IDirect3DDevice9* Device = 0;  const int Width  = 640; 
const int Height = 480; ID3DXMesh* Teapot = 0; int EnterMsgLoop( bool (*ptr_display)(float timeDelta) ) 

MSG msg; 
::ZeroMemory(&msg, sizeof(MSG)); static float lastTime = (float)timeGetTime();  while(msg.message != WM_QUIT) 

if(::PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) 

::TranslateMessage(&msg); 
::DispatchMessage(&msg); 

else 
        { 
float currTime  = (float)timeGetTime(); 
float timeDelta = (currTime - lastTime)*0.001f; ptr_display(timeDelta); lastTime = currTime; 
        } 
    } 
    return msg.wParam; 
} bool Setup() 

D3DXCreateTeapot(Device, &Teapot, 0); D3DXVECTOR3 position(0.0f, 0.0f, -3.0f); 
D3DXVECTOR3 target(0.0f, 0.0f, 0.0f); 
D3DXVECTOR3 up(0.0f, 1.0f, 0.0f); 
    D3DXMATRIX V; 
D3DXMatrixLookAtLH(&V, &position, &target, &up); 
Device->SetTransform(D3DTS_VIEW, &V); D3DXMATRIX proj; 
D3DXMatrixPerspectiveFovLH( 
&proj, 
D3DX_PI * 0.5f, // 90 - degree 
(float)Width / (float)Height, 
1.0f, 
1000.0f); 
Device->SetTransform(D3DTS_PROJECTION, &proj); 
Device->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); 
Device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); 
return true; 

void Cleanup() 

Teapot->Release(); 
} bool Display(float timeDelta) 

if(Device) 

D3DXMATRIX Ry; 
static float y = 0.0f; 
D3DXMatrixRotationY(&Ry, y); y += timeDelta; 
if(y >= 6.28f) 
y = 0.0f; Device->SetTransform(D3DTS_WORLD, &Ry); Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0); Device->BeginScene(); Teapot->DrawSubset(0); Device->EndScene(); Device->Present(0, 0, 0, 0); 

return true; 
} LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 

switch( msg ) 

case WM_DESTROY: 
::PostQuitMessage(0); 
break; case WM_KEYDOWN: 
if( wParam == VK_ESCAPE ) 
::DestroyWindow(hwnd); 
break; 

return ::DefWindowProc(hwnd, msg, wParam, lParam); 
} bool InitD3D(HINSTANCE hInstance, int width, int height, bool windowed, D3DDEVTYPE deviceType, IDirect3DDevice9** device) 

WNDCLASS wc; wc.style         = CS_HREDRAW | CS_VREDRAW; 
wc.lpfnWndProc   = WndProc;  
wc.cbClsExtra    = 0; 
wc.cbWndExtra    = 0; 
wc.hInstance     = hInstance; 
wc.hIcon         = LoadIcon(0, IDI_APPLICATION); 
wc.hCursor       = LoadCursor(0, IDC_ARROW); 
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 
wc.lpszMenuName  = 0; 
wc.lpszClassName = "Direct3D9App"; if( !RegisterClass(&wc) )  

::MessageBox(0, "RegisterClass() - FAILED", 0, 0); 
return false; 
} HWND hwnd = 0; 
hwnd = ::CreateWindow("Direct3D9App", "Direct3D9App",  
WS_EX_TOPMOST, 
0, 0, width, height, 
0/*parent hwnd*/, 0 /* menu */, hInstance, 0 /*extra*/);  if( !hwnd ) 

::MessageBox(0, "CreateWindow() - FAILED", 0, 0); 
return false; 
} ::ShowWindow(hwnd, SW_SHOW); 
::UpdateWindow(hwnd); HRESULT hr = 0; 
IDirect3D9* d3d9 = 0; 
    d3d9 = Direct3DCreate9(D3D_SDK_VERSION);     if( !d3d9 ) 

::MessageBox(0, "Direct3DCreate9() - FAILED", 0, 0); 
return false; 
} D3DCAPS9 caps; 
d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps); int vp = 0; 
if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT ) 
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING; 
else 
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; D3DPRESENT_PARAMETERS d3dpp; 
d3dpp.BackBufferWidth            = width; 
d3dpp.BackBufferHeight           = height; 
d3dpp.BackBufferFormat           = D3DFMT_A8R8G8B8; 
d3dpp.BackBufferCount            = 1; 
d3dpp.MultiSampleType            = D3DMULTISAMPLE_NONE; 
d3dpp.MultiSampleQuality         = 0; 
d3dpp.SwapEffect                 = D3DSWAPEFFECT_DISCARD;  
d3dpp.hDeviceWindow              = hwnd; 
d3dpp.Windowed                   = windowed; 
d3dpp.EnableAutoDepthStencil     = true;  
d3dpp.AutoDepthStencilFormat     = D3DFMT_D24S8; 
d3dpp.Flags                      = 0; 
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; 
d3dpp.PresentationInterval       = D3DPRESENT_INTERVAL_IMMEDIATE; hr = d3d9->CreateDevice( 
D3DADAPTER_DEFAULT, 
deviceType, 
hwnd, 
vp, 
    &d3dpp, 
    device); if( FAILED(hr) ) 

d3dpp.AutoDepthStencilFormat = D3DFMT_D16; hr = d3d9->CreateDevice( 
D3DADAPTER_DEFAULT, 
deviceType, 
hwnd, 
vp, 
&d3dpp, 
device); if(FAILED(hr)) 

d3d9->Release(); 
::MessageBox(0, "Create Device FAILED", 0, 0); 
return false; 

} d3d9->Release(); // done with d3d9 object return true; 

int WINAPI WinMain(HINSTANCE hinstance, 
   HINSTANCE prevInstance,  
   PSTR cmdLine, 
   int showCmd) 

if(!InitD3D(hinstance, 
Width, Height, true, D3DDEVTYPE_HAL, &Device)) 

::MessageBox(0, "InitD3D() - FAILED", 0, 0); 
return 0; 
} if(!Setup()) 

::MessageBox(0, "Setup() - FAILED", 0, 0); 
return 0; 
} EnterMsgLoop( Display ); Cleanup(); Device->Release(); return 0; 
}