以文本方式查看主题 - 计算机科学论坛 (http://bbs.xml.org.cn/index.asp) -- 『 C/C++编程思想 』 (http://bbs.xml.org.cn/list.asp?boardid=61) ---- Direct3D中的雾化 (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=71431) |
-- 作者:卷积内核 -- 发布时间:1/16/2009 8:38:00 AM -- 源程序: #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; ID3DXMesh* g_mesh; struct sVertex inline float height_field(float x, float z) y += 10.0f * cosf(0.051f * x) * sinf(0.055f * x); return y; void setup_world_matrix() void setup_view_proj_matrices() D3DXVECTOR3 eye(0.0f, 30.0f, -100.0f); D3DXMATRIX mat_view; // setup projection matrix bool init_geometry() /* if(FAILED(D3DXLoadMeshFromX("seafloor.x", D3DXMESH_SYSTEMMEM, g_device, NULL, &material_buffer, NULL, D3DXMATERIAL* xmaterials = (D3DXMATERIAL*) material_buffer->GetBufferPointer(); g_mesh_materials = new D3DMATERIAL9[g_num_materials]; for(DWORD i = 0; i < g_num_materials; i++) // set ambient reflected coefficient, because .x file do not set it. g_mesh_textures[i] = NULL; if(xmaterials[i].pTextureFilename != NULL && strlen(xmaterials[i].pTextureFilename) > 0) material_buffer->Release(); // change model's height IDirect3DVertexBuffer9* vertex_buffer; sVertex* vertices; for(DWORD i = 0; i < num_vertices; i++) vertex_buffer->Unlock(); return true; bool init_d3d(HWND hwnd) if(g_d3d == NULL) D3DPRESENT_PARAMETERS d3dpp; d3dpp.Windowed = TRUE; if(FAILED(g_d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, setup_view_proj_matrices(); g_device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); g_device->SetRenderState(D3DRS_FOGCOLOR, 0xFFAA8888); void cleanup() if(g_mesh_textures) delete[] g_mesh_textures; void render() g_device->BeginScene(); setup_world_matrix(); for(DWORD i = 0; i < g_num_materials; i++) g_mesh->DrawSubset(i); g_device->Present(NULL, NULL, NULL, NULL); LRESULT WINAPI WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) switch(msg) case 49: // press key "1", enable linear fog. case 50: // press key "2", enable exp fog. case 51: // press key "3", enable exp2 fog. case VK_ESCAPE: break; case WM_DESTROY: return DefWindowProc(hwnd, msg, wParam, lParam); int WINAPI WinMain(HINSTANCE inst, HINSTANCE, LPSTR, INT) wc.cbSize = sizeof(WNDCLASSEX); if(! RegisterClassEx(&wc)) HWND hwnd = CreateWindow(CLASS_NAME, "Direct3D App", WS_OVERLAPPEDWINDOW, 200, 100, 640, 480, if(hwnd == NULL) if(init_d3d(hwnd)) MSG msg; while(msg.message != WM_QUIT) cleanup(); return 0; |
-- 作者:卷积内核 -- 发布时间:1/16/2009 8:39:00 AM -- 像素雾化示例程序 添加像素雾化效果也需要对Direct3D渲染设备进行三方面的设置:启用雾化效果、设置雾化混合因子计算公式、设置雾化参数。添加像素雾化效果和添加顶点雾化效果基本相同,唯一的区别是雾化混合因子计算公式的设置。像素雾化混合因子计算公式也是采用函数IDirect3DDevice9::SetRenderState()设置,不同的是第一个参数需要设置为D3DRS_FOGTABLEMODE。设置雾化混合因子计算公式的代码如下: case WM_KEYDOWN: switch(wParam) { case 48: // press key "0", disable fog. g_device->SetRenderState(D3DRS_FOGENABLE, FALSE); break; 示例截图: |
-- 作者:卷积内核 -- 发布时间:1/16/2009 8:40:00 AM -- 源程序: #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; ID3DXMesh* g_mesh; struct sVertex inline float height_field(float x, float z) y += 10.0f * cosf(0.051f * x) * sinf(0.055f * x); return y; void setup_world_matrix() void setup_view_proj_matrices() D3DXVECTOR3 eye(0.0f, 30.0f, -100.0f); D3DXMATRIX mat_view; // setup projection matrix bool init_geometry() /* if(FAILED(D3DXLoadMeshFromX("seafloor.x", D3DXMESH_SYSTEMMEM, g_device, NULL, &material_buffer, NULL, D3DXMATERIAL* xmaterials = (D3DXMATERIAL*) material_buffer->GetBufferPointer(); g_mesh_materials = new D3DMATERIAL9[g_num_materials]; for(DWORD i = 0; i < g_num_materials; i++) // set ambient reflected coefficient, because .x file do not set it. g_mesh_textures[i] = NULL; if(xmaterials[i].pTextureFilename != NULL && strlen(xmaterials[i].pTextureFilename) > 0) material_buffer->Release(); // change model's height IDirect3DVertexBuffer9* vertex_buffer; sVertex* vertices; for(DWORD i = 0; i < num_vertices; i++) vertex_buffer->Unlock(); return true; bool init_d3d(HWND hwnd) if(g_d3d == NULL) D3DPRESENT_PARAMETERS d3dpp; d3dpp.Windowed = TRUE; if(FAILED(g_d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, setup_view_proj_matrices(); g_device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); g_device->SetRenderState(D3DRS_FOGCOLOR, 0xFFAAAA00); void cleanup() if(g_mesh_textures) delete[] g_mesh_textures; void render() g_device->BeginScene(); setup_world_matrix(); for(DWORD i = 0; i < g_num_materials; i++) g_mesh->DrawSubset(i); g_device->Present(NULL, NULL, NULL, NULL); LRESULT WINAPI WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) switch(msg) case 49: // press key "1", enable linear fog. case 50: // press key "2", enable exp fog. case 51: // press key "3", enable exp2 fog. case VK_ESCAPE: break; case WM_DESTROY: return DefWindowProc(hwnd, msg, wParam, lParam); int WINAPI WinMain(HINSTANCE inst, HINSTANCE, LPSTR, INT) wc.cbSize = sizeof(WNDCLASSEX); if(! RegisterClassEx(&wc)) HWND hwnd = CreateWindow(CLASS_NAME, "Direct3D App", WS_OVERLAPPEDWINDOW, 200, 100, 640, 480, if(hwnd == NULL) if(init_d3d(hwnd)) MSG msg; while(msg.message != WM_QUIT) cleanup(); return 0; |
-- 作者:卷积内核 -- 发布时间:1/16/2009 8:40:00 AM -- 基于范围雾化的示例程序 要使用基于范围的雾化,首先需要检查当前硬件是否支持基于范围的雾化: // check if hardware supports range fog 雾化参数中,雾的开始距离和结束距离只对线性雾化有效,雾的浓度只对指数雾化和指数平方雾化有效。 无论顶点雾化还是像素雾化,在程序中必须设置合适的投影变换矩阵确保雾化效果正确,这在为那些不使用顶点坐标变换和光照流水线的程序中添加雾化效果造成了一定的困难,不过这种情况不多。 为了比较基于范围的雾化和不基于范围的雾化效果的不同,可以按下"R"键在基于范围的雾化和不基于范围的雾化之间进行切换。
源程序: #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; ID3DXMesh* g_mesh; struct sVertex inline float height_field(float x, float z) y += 10.0f * cosf(0.051f * x) * sinf(0.055f * x); return y; void setup_matrices() // setup view matrix D3DXVECTOR3 eye(0.0f, 30.0f, -100.0f); D3DXMATRIX mat_view; // setup projection matrix bool init_geometry() /* if(FAILED(D3DXLoadMeshFromX("seafloor.x", D3DXMESH_SYSTEMMEM, g_device, NULL, &material_buffer, NULL, D3DXMATERIAL* xmaterials = (D3DXMATERIAL*) material_buffer->GetBufferPointer(); g_mesh_materials = new D3DMATERIAL9[g_num_materials]; for(DWORD i = 0; i < g_num_materials; i++) // set ambient reflected coefficient, because .x file do not set it. g_mesh_textures[i] = NULL; if(xmaterials[i].pTextureFilename != NULL && strlen(xmaterials[i].pTextureFilename) > 0) material_buffer->Release(); // change model's height IDirect3DVertexBuffer9* vertex_buffer; sVertex* vertices; for(DWORD i = 0; i < num_vertices; i++) vertex_buffer->Unlock(); return true; bool init_d3d(HWND hwnd) if(g_d3d == NULL) D3DPRESENT_PARAMETERS d3dpp; d3dpp.Windowed = TRUE; if(FAILED(g_d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, // check if hardware supports range fog D3DCAPS9 caps; if(! (caps.RasterCaps & D3DPRASTERCAPS_FOGRANGE)) setup_matrices(); g_device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); g_device->SetRenderState(D3DRS_RANGEFOGENABLE, TRUE); void cleanup() if(g_mesh_textures) delete[] g_mesh_textures; void render() g_device->BeginScene(); for(DWORD i = 0; i < g_num_materials; i++) g_mesh->DrawSubset(i); g_device->Present(NULL, NULL, NULL, NULL); LRESULT WINAPI WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) static bool use_range_fog = true; switch(msg) case 49: // press key "1", enable linear fog. case 50: // press key "2", enable exp fog. case 51: // press key "3", enable exp2 fog. case 65 + 'R' - 'A': case VK_ESCAPE: break; case WM_DESTROY: return DefWindowProc(hwnd, msg, wParam, lParam); int WINAPI WinMain(HINSTANCE inst, HINSTANCE, LPSTR, INT) wc.cbSize = sizeof(WNDCLASSEX); if(! RegisterClassEx(&wc)) HWND hwnd = CreateWindow(CLASS_NAME, "Direct3D App", WS_OVERLAPPEDWINDOW, 200, 100, 640, 480, if(hwnd == NULL) if(init_d3d(hwnd)) MSG msg; while(msg.message != WM_QUIT) cleanup(); return 0; |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
6,617.188ms |