|
楼主 |
发表于 2009-3-4 09:02:47
|
显示全部楼层
设置纹理相关状态 纹理相关状态包括纹理过滤方式、纹理寻址模式、纹理阶段混合状态。因为Direct3D 9.0最多支持8层纹理贴图,所以最多存在8个纹理阶段,这些纹理相关状态需要针对每个纹理阶段分别进行设置,用于控制每个阶段纹理的相关操作。 示例程序:
#include <d3dx9.h> #pragma warning(disable : 4127) #define CLASS_NAME "GameApp" #define release_com(p) do { if(p) { (p)->Release(); (p) = NULL; } } while(0) IDirect3D9* g_d3d; IDirect3DDevice9* g_device; IDirect3DVertexBuffer9* g_vertex_buffer; IDirect3DTexture9* g_texture; struct sCustomVertex { float x, y, z; float u, v; }; #define D3DFVF_CUSTOM_VERTEX (D3DFVF_XYZ | D3DFVF_TEX1) void setup_matrices() { // build world matrix D3DXMATRIX mat_world; D3DXMatrixIdentity(&mat_world); g_device->SetTransform(D3DTS_WORLD, &mat_world); // setup view matrix D3DXVECTOR3 eye(0.0f, 0.0f, -10.0f); D3DXVECTOR3 at(0.0f, 0.0f, 0.0f); D3DXVECTOR3 up(0.0f, 1.0f, 0.0f); D3DXMATRIX mat_view; D3DXMatrixLookAtLH(&mat_view, &eye, &at, &up); g_device->SetTransform(D3DTS_VIEW, &mat_view); // setup projection matrix D3DXMATRIX mat_proj; D3DXMatrixPerspectiveFovLH(&mat_proj, D3DX_PI/4, 1.0f, 1.0f, 100.0f); g_device->SetTransform(D3DTS_PROJECTION, &mat_proj); } bool init_graphics() { if(FAILED(D3DXCreateTextureFromFile(g_device, "texture.jpg", &g_texture))) { MessageBox(NULL, "Create texture failed!", "ERROR", MB_OK); return false; } sCustomVertex vertices[] = { { -3, -3, 0.0f, 0.0f, 1.0f}, { -3, 3, 0.0f, 0.0f, 0.0f}, { 3, -3, 0.0f, 1.0f, 1.0f}, { 3, 3, 0.0f, 1.0f, 0.0f } }; g_device->CreateVertexBuffer(sizeof(vertices), 0, D3DFVF_CUSTOM_VERTEX, D3DPOOL_MANAGED, &g_vertex_buffer, NULL); void* ptr; g_vertex_buffer->Lock(0, 0, (void**)&ptr, 0); memcpy(ptr, vertices, sizeof(vertices)); g_vertex_buffer->Unlock(); return true; } bool init_d3d(HWND hwnd) { g_d3d = Direct3DCreate9(D3D_SDK_VERSION); if(g_d3d == NULL) return false; D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; if(FAILED(g_d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_device))) { return false; } if(! init_graphics()) return false; setup_matrices(); g_device->SetRenderState(D3DRS_LIGHTING, FALSE); return true; } void cleanup() { release_com(g_texture); release_com(g_vertex_buffer); release_com(g_device); release_com(g_d3d); } void render() { g_device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(5, 5, 5), 1.0f, 0); g_device->BeginScene(); g_device->SetTexture(0, g_texture); g_device->SetStreamSource(0, g_vertex_buffer, 0, sizeof(sCustomVertex)); g_device->SetFVF(D3DFVF_CUSTOM_VERTEX); g_device->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); g_device->EndScene(); g_device->resent(NULL, NULL, NULL, NULL); } LRESULT WINAPI WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_KEYDOWN: if(wParam == VK_ESCAPE) DestroyWindow(hwnd); break; case WM_DESTROY:  ostQuitMessage(0); return 0; } return DefWindowProc(hwnd, msg, wParam, lParam); } int WINAPI WinMain(HINSTANCE inst, HINSTANCE, LPSTR, INT) { WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_CLASSDC; wc.lpfnWndProc = WinProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = inst; wc.hIcon = NULL; wc.hCursor = NULL; wc.hbrBackground = NULL; wc.lpszMenuName = NULL; wc.lpszClassName = CLASS_NAME; wc.hIconSm = NULL; if(! RegisterClassEx(&wc)) return -1; HWND hwnd = CreateWindow(CLASS_NAME, "Direct3D App", WS_OVERLAPPEDWINDOW, 200, 100, 640, 480, NULL, NULL, wc.hInstance, NULL); if(hwnd == NULL) return -1; if(init_d3d(hwnd)) { ShowWindow(hwnd, SW_SHOWDEFAULT); UpdateWindow(hwnd); MSG msg; ZeroMemory(&msg, sizeof(msg)); while(msg.message != WM_QUIT) { if(PeekMessage(&msg, NULL, 0, 0, M_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } render(); } } cleanup(); UnregisterClass(CLASS_NAME, wc.hInstance); return 0; }
|
|