// `使用Direct3D9來繪圖` void RenderFrameDX9(void) { LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); Matrix4x4 light_projection_matrix; Matrix4x4 light_view_matrix; Matrix4x4 view_matrix = g_Control.GetViewMatrix(); Matrix4x4 world_matrix = g_Control.GetObjectMatrix(); // `開始下繪圖指令` device->BeginScene(); // `把剪影畫在動態貼圖中` if(1) { //! 设置临时framebuffer LPDIRECT3DSURFACE9 pFrameBufferBackup, pDepthBufferBackup; device->GetRenderTarget(0, &pFrameBufferBackup); pFrameBufferBackup->Release(); device->GetDepthStencilSurface(&pDepthBufferBackup); pDepthBufferBackup->Release(); LPDIRECT3DSURFACE9 pSurface; g_pTexture->GetSurfaceLevel(0, &pSurface); device->SetRenderTarget(0, pSurface); device->SetDepthStencilSurface(g_pDepthStencil); device->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_RGBA(255, 255, 255, 255), 1.0f, 0); Vector4 vLightPos = g_Light.m_Position; Vector4 vLightUp(0.0f, 1.0f, 0.0f); Vector4 vLightLookat(0.0f, 0.0f, 0.0f); // `把鏡頭放在光源的` light_projection_matrix = GutMatrixPerspectiveRH_DirectX(60.0f, 1.0f, 0.1f, 100.0f); light_view_matrix = GutMatrixLookAtRH(vLightPos, vLightLookat, vLightUp); // `設定轉換矩陣` device->SetTransform(D3DTS_PROJECTION, (D3DMATRIX *)&light_projection_matrix); device->SetTransform(D3DTS_VIEW, (D3DMATRIX *)&light_view_matrix); device->SetTransform(D3DTS_WORLD, (D3DMATRIX *)&world_matrix); D3DCOLORVALUE zero = {0.0f, 0.0f, 0.0f, 1.0f}; sModelMaterial_DX9 material; material.m_Material.Ambient = zero; material.m_Material.Emissive = zero; material.m_Material.Diffuse = zero; material.m_Material.Specular = zero; material.m_bCullFace = false; material.Submit(); device->SetRenderState(D3DRS_LIGHTING, 0); g_Model_DX9.Render(0); pSurface->Release(); device->SetRenderTarget(0, pFrameBufferBackup); device->SetDepthStencilSurface(pDepthBufferBackup); } // `把上一個步驟的結果當成貼圖來使用` { // `消除畫面` device->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_RGBA(0, 0, 150, 255), 1.0f, 0); // `設定轉換矩陣` device->SetTransform(D3DTS_PROJECTION, (D3DMATRIX *) &g_projection_matrix); device->SetTransform(D3DTS_VIEW, (D3DMATRIX *) &view_matrix); device->SetTransform(D3DTS_WORLD, (D3DMATRIX *) &world_matrix); #define DRAW_TEAPORT_FIRST 1 //! 画茶壶 if (DRAW_TEAPORT_FIRST) { SetupLightingDX9(); g_Model_DX9.Render(); } //! 设置矩形的纹理 sModelMaterial_DX9 material; material.m_pTextures[0] = g_pTexture; material.Submit(); Matrix4x4 inv_view_matrix = view_matrix; inv_view_matrix.FastInvert(); Matrix4x4 uv_offset_matrix; uv_offset_matrix.Identity(); uv_offset_matrix.Scale(0.5f, -0.5f, 0.5f); uv_offset_matrix[3].Set(0.5f, 0.5f, 0.5f, 1.0f); Matrix4x4 texture_matrix = inv_view_matrix * light_view_matrix * light_projection_matrix * uv_offset_matrix; Matrix4x4 indent_matrix = Matrix4x4::IdentityMatrix(); device->SetTransform(D3DTS_TEXTURE0, (D3DMATRIX *) &texture_matrix); device->SetTransform(D3DTS_WORLD, (D3DMATRIX *) &indent_matrix); device->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION); device->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT4 | D3DTTFF_PROJECTED ); device->SetRenderState(D3DRS_LIGHTING, FALSE); // `畫出矩形` device->SetFVF(D3DFVF_XYZ); device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, g_Quad, sizeof(Vertex_VT)); //! 关闭纹理矩阵 device->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); if (!DRAW_TEAPORT_FIRST) { //SetupLightingDX9(); device->SetTransform(D3DTS_WORLD, (D3DMATRIX *) &world_matrix); g_Model_DX9.Render(); } } // `宣告所有的繪圖指令都下完了` device->EndScene(); // `把背景backbuffer的畫面呈現出來` device->Present( NULL, NULL, NULL, NULL ); }
void ResizeWindowDX10(int width, int height) { GutResetGraphicsDeviceDX10(); float aspect = (float) height / (float) width; g_proj_matrix = GutMatrixPerspectiveRH_DirectX(g_fFovW, aspect, 0.1f, 100.0f); }
bool InitResourceDX10(void) { g_pDevice = GutGetGraphicsDeviceDX10(); ID3D10Blob *pVSCode = NULL; // shader loading { const char *shaders = "../../shaders/cubemap_photovr_dx10.hlsl"; // 載入Vertex Shader g_pVertexShader = GutLoadVertexShaderDX10_HLSL(shaders, "VS", "vs_4_0", &pVSCode); if ( NULL==g_pVertexShader ) return false; // 載入Pixel Shader g_pPixelShader = GutLoadPixelShaderDX10_HLSL(shaders, "PS", "ps_4_0"); if ( NULL==g_pPixelShader ) return false; } // 載入貼圖 { const char *texture_array[] = { "../../textures/uffizi_right.tga", "../../textures/uffizi_left.tga", "../../textures/uffizi_top.tga", "../../textures/uffizi_bottom.tga", "../../textures/uffizi_back.tga", // `右手座標系上 Z+ 為鏡頭後方.` "../../textures/uffizi_front.tga" // `右手座標系上 Z- 為鏡頭前方.` }; g_pTexture = GutLoadCubemapTexture_DX10(texture_array); } { // 設定Vertex資料格式 D3D10_INPUT_ELEMENT_DESC layout[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 }, { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0 }, }; if ( D3D_OK != g_pDevice->CreateInputLayout( layout, sizeof(layout)/sizeof(D3D10_INPUT_ELEMENT_DESC), pVSCode->GetBufferPointer(), pVSCode->GetBufferSize(), &g_pVertexLayout ) ) return false; SAFE_RELEASE(pVSCode); } D3D10_BUFFER_DESC cbDesc; D3D10_SUBRESOURCE_DATA subDesc; { // vertex buffer ZeroMemory(&cbDesc, sizeof(cbDesc)); cbDesc.ByteWidth = sizeof(Vertex_VN) * g_iNumSphereVertices; cbDesc.Usage = D3D10_USAGE_IMMUTABLE; cbDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER; // 開啟Vertex Buffer時同時把資料拷貝過去 ZeroMemory(&subDesc, sizeof(subDesc)); subDesc.pSysMem = g_pSphereVertices; // 配置Vertex Buffer. if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, &subDesc, &g_pVertexBuffer ) ) return false; } { // 設定一塊可以用來放Index的記憶體. ZeroMemory(&cbDesc, sizeof(cbDesc)); cbDesc.ByteWidth = sizeof(unsigned short) * g_iNumSphereIndices; cbDesc.Usage = D3D10_USAGE_IMMUTABLE; cbDesc.BindFlags = D3D10_BIND_INDEX_BUFFER; // 開啟Index Buffer時同時把資料拷貝過去 ZeroMemory(&subDesc, sizeof(subDesc)); subDesc.pSysMem = g_pSphereIndices; // 配置Index Buffer. if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, &subDesc, &g_pSphereIndexBuffer ) ) return false; } { ZeroMemory(&cbDesc, sizeof(cbDesc)); // 配置Shader參數的記憶體空間 cbDesc.ByteWidth = sizeof(Matrix4x4); cbDesc.Usage = D3D10_USAGE_DYNAMIC; cbDesc.BindFlags = D3D10_BIND_CONSTANT_BUFFER; cbDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; // 配置Shader Constant if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, NULL, &g_pConstantBuffer ) ) return false; } // rasterizer state物件 { D3D10_RASTERIZER_DESC rs; ZeroMemory(&rs, sizeof(rs)); rs.FillMode = D3D10_FILL_SOLID; rs.CullMode = D3D10_CULL_NONE; rs.FrontCounterClockwise = true; rs.DepthBias = 0; rs.DepthBiasClamp = 0.0f; rs.SlopeScaledDepthBias = 0.0f; rs.DepthClipEnable = false; rs.ScissorEnable = false; rs.MultisampleEnable = false; rs.AntialiasedLineEnable = false; if ( D3D_OK != g_pDevice->CreateRasterizerState(&rs, &g_pRasterizerState) ) return false; g_pDevice->RSSetState(g_pRasterizerState); } // 計算投影矩陣 g_proj_matrix = GutMatrixPerspectiveRH_DirectX(g_fFovW, 1.0f, 0.1f, 100.0f); return true; }
bool InitResourceDX10(void) { g_pDevice = GutGetGraphicsDeviceDX10(); ID3D10Blob *pVSCode = NULL; // 載入Vertex Shader. g_pVertexShader = GutLoadVertexShaderDX10_HLSL("../../shaders/vertex_transform_dx10.shader", "VS", "vs_4_0", &pVSCode); if ( NULL==g_pVertexShader ) return false; // 載入Pixel Shader. g_pPixelShader = GutLoadPixelShaderDX10_HLSL("../../shaders/vertex_transform_dx10.shader", "PS", "ps_4_0"); if ( NULL==g_pPixelShader ) return false; // 設定Vertex資料格式. D3D10_INPUT_ELEMENT_DESC layout[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 }, }; if ( D3D_OK != g_pDevice->CreateInputLayout( layout, 1, pVSCode->GetBufferPointer(), pVSCode->GetBufferSize(), &g_pVertexLayout ) ) return false; SAFE_RELEASE(pVSCode); // 設定一塊可以用來放Vertex的記憶體. D3D10_BUFFER_DESC cbDesc; cbDesc.ByteWidth = sizeof(g_vertices); cbDesc.Usage = D3D10_USAGE_DYNAMIC; cbDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER; cbDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; cbDesc.MiscFlags = 0; // 配置一塊可以存放Vertex的記憶體, 也就是Vertex Buffer. if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, NULL, &g_pVertexBuffer ) ) return false; // 把資料拷貝到顯示卡記憶體的Vertex Buffer. Vector4 *pVertexBuffer; g_pVertexBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pVertexBuffer ); memcpy(pVertexBuffer, g_vertices, sizeof(g_vertices)); g_pVertexBuffer->Unmap(); // 配置Shader讀取參數的記憶體空間. cbDesc.ByteWidth = sizeof(Matrix4x4); cbDesc.Usage = D3D10_USAGE_DYNAMIC; cbDesc.BindFlags = D3D10_BIND_CONSTANT_BUFFER; cbDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; cbDesc.MiscFlags = 0; if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, NULL, &g_pConstantBuffer ) ) return false; // 計算出一個可以轉換到鏡頭座標系的矩陣. Matrix4x4 view_matrix = GutMatrixLookAtRH(g_eye, g_lookat, g_up); Matrix4x4 projection_matrix = GutMatrixPerspectiveRH_DirectX(90.0f, 1.0f, 1.0f, 100.0f); Matrix4x4 view_projection_matrix = view_matrix * projection_matrix; // 把矩陣拷貝到shader參數區的記憶體空間. Matrix4x4 *pConstData; g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); *pConstData = view_projection_matrix; g_pConstantBuffer->Unmap(); return true; }
bool InitResourceDX10(void) { g_pDevice = GutGetGraphicsDeviceDX10(); ID3D10Blob *pVSCode = NULL; // 載入Vertex Shader g_pVertexShader = GutLoadVertexShaderDX10_HLSL("../../shaders/vertex_color_dx10.hlsl", "VS", "vs_4_0", &pVSCode); if ( NULL==g_pVertexShader ) return false; // 載入Pixel Shader g_pPixelShader = GutLoadPixelShaderDX10_HLSL("../../shaders/vertex_color_dx10.hlsl", "PS", "ps_4_0"); if ( NULL==g_pPixelShader ) return false; CGutModel_DX10::LoadDefaultShader("../../shaders/gmodel_dx10.hlsl"); for ( int i=0; i<3; i++ ) { g_Model_DX10[i].ConvertToDX10Model(&g_Models[i]); } // 設定Vertex資料格式 D3D10_INPUT_ELEMENT_DESC layout[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 }, { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0 } }; if ( D3D_OK != g_pDevice->CreateInputLayout( layout, sizeof(layout)/sizeof(D3D10_INPUT_ELEMENT_DESC), pVSCode->GetBufferPointer(), pVSCode->GetBufferSize(), &g_pVertexLayout ) ) return false; SAFE_RELEASE(pVSCode); // g_pBorderVertexBuffer = GutCreateVertexBuffer_DX10(sizeof(g_Border), g_Border); // 配置Shader讀取參數的記憶體空間 g_pConstantBuffer = GutCreateShaderConstant_DX10(sizeof(Matrix4x4)); // 計算出一個可以轉換到鏡頭座標系的矩陣 g_proj_matrix = GutMatrixPerspectiveRH_DirectX(70.0f, 1.0f, 0.1f, 100.0f); // 開?rasterizer state物件 D3D10_RASTERIZER_DESC rasterizer_state_desc; rasterizer_state_desc.FillMode = D3D10_FILL_SOLID; rasterizer_state_desc.CullMode = D3D10_CULL_BACK; rasterizer_state_desc.FrontCounterClockwise = true; rasterizer_state_desc.DepthBias = 0; rasterizer_state_desc.DepthBiasClamp = 0.0f; rasterizer_state_desc.SlopeScaledDepthBias = 0.0f; rasterizer_state_desc.DepthClipEnable = false; rasterizer_state_desc.ScissorEnable = false; rasterizer_state_desc.MultisampleEnable = false; rasterizer_state_desc.AntialiasedLineEnable = false; if ( D3D_OK != g_pDevice->CreateRasterizerState(&rasterizer_state_desc, &g_pRasterizerState) ) return false; g_pDevice->RSSetState(g_pRasterizerState); return true; }
bool InitResourceDX10(void) { g_pDevice = GutGetGraphicsDeviceDX10(); ID3D10Blob *pVSCode = NULL; // 載入Vertex Shader g_pVertexShader = GutLoadVertexShaderDX10_HLSL("../../shaders/vertex_color_dx10.hlsl", "VS", "vs_4_0", &pVSCode); if ( NULL==g_pVertexShader ) return false; // 載入Pixel Shader g_pPixelShader = GutLoadPixelShaderDX10_HLSL("../../shaders/vertex_color_dx10.hlsl", "PS", "ps_4_0"); if ( NULL==g_pPixelShader ) return false; // 設定Vertex資料格式 D3D10_INPUT_ELEMENT_DESC layout[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 }, { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0 } }; if ( D3D_OK != g_pDevice->CreateInputLayout( layout, sizeof(layout)/sizeof(D3D10_INPUT_ELEMENT_DESC), pVSCode->GetBufferPointer(), pVSCode->GetBufferSize(), &g_pVertexLayout ) ) return false; SAFE_RELEASE(pVSCode); // 設定一塊可以用來放Vertex的記憶體. D3D10_BUFFER_DESC cbDesc; cbDesc.ByteWidth = sizeof(g_vertices); cbDesc.Usage = D3D10_USAGE_IMMUTABLE; cbDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER; cbDesc.CPUAccessFlags = 0; cbDesc.MiscFlags = 0; // 開啟Vertex Buffer時同時把資料拷貝過去 D3D10_SUBRESOURCE_DATA sbDesc; sbDesc.pSysMem = g_vertices; // 配置一塊可以存放Vertex的記憶體, 也就是Vertex Buffer. if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, &sbDesc, &g_pVertexBuffer ) ) return false; // 設定一塊可以用來放Index的記憶體. cbDesc.ByteWidth = sizeof(g_indices); cbDesc.Usage = D3D10_USAGE_IMMUTABLE; cbDesc.BindFlags = D3D10_BIND_INDEX_BUFFER; cbDesc.CPUAccessFlags = 0; cbDesc.MiscFlags = 0; // 開啟Index Buffer時同時把資料拷貝過去 sbDesc.pSysMem = g_indices; // 配置一塊可以存放Index的記憶體, 也就是Index Buffer. if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, &sbDesc, &g_pIndexBuffer ) ) return false; // 配置Shader讀取參數的記憶體空間 cbDesc.ByteWidth = sizeof(Matrix4x4); cbDesc.Usage = D3D10_USAGE_DYNAMIC; cbDesc.BindFlags = D3D10_BIND_CONSTANT_BUFFER; cbDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; cbDesc.MiscFlags = 0; if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, NULL, &g_pConstantBuffer ) ) return false; // 計算出一個可以轉換到鏡頭座標系的矩陣 Matrix4x4 view_matrix = GutMatrixLookAtRH(g_eye, g_lookat, g_up); Matrix4x4 projection_matrix = GutMatrixPerspectiveRH_DirectX(90.0f, 1.0f, 1.0f, 100.0f); g_view_proj_matrix = view_matrix * projection_matrix; // 開?rasterizer state物件 D3D10_RASTERIZER_DESC rasterizer_state_desc; rasterizer_state_desc.FillMode = D3D10_FILL_SOLID; rasterizer_state_desc.CullMode = D3D10_CULL_BACK; rasterizer_state_desc.FrontCounterClockwise = true; rasterizer_state_desc.DepthBias = 0; rasterizer_state_desc.DepthBiasClamp = 0.0f; rasterizer_state_desc.SlopeScaledDepthBias = 0.0f; rasterizer_state_desc.DepthClipEnable = false; rasterizer_state_desc.ScissorEnable = false; rasterizer_state_desc.MultisampleEnable = false; rasterizer_state_desc.AntialiasedLineEnable = false; if ( D3D_OK != g_pDevice->CreateRasterizerState(&rasterizer_state_desc, &g_pRasterizerState) ) return false; g_pDevice->RSSetState(g_pRasterizerState); return true; }
bool InitResourceDX10(void) { g_pDevice = GutGetGraphicsDeviceDX10(); ID3D10Blob *pVSCode = NULL; { const char *shader = "../../shaders/texture3D_dx10.hlsl"; // 載入Vertex Shader g_pVertexShader = GutLoadVertexShaderDX10_HLSL(shader, "VS", "vs_4_0", &pVSCode); if ( NULL==g_pVertexShader ) return false; // 載入Pixel Shader g_pPixelShader = GutLoadPixelShaderDX10_HLSL(shader, "PS", "ps_4_0"); if ( NULL==g_pPixelShader ) return false; } // 載入貼圖 g_pTexture = GutLoadVolumeTexture_DX10("../../textures/CT_256x256x256.dds"); if ( NULL==g_pTexture ) return false; // 設定Vertex資料格式 D3D10_INPUT_ELEMENT_DESC layout[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 }, { "TEXCOORD", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0 } }; if ( D3D_OK != g_pDevice->CreateInputLayout( layout, sizeof(layout)/sizeof(D3D10_INPUT_ELEMENT_DESC), pVSCode->GetBufferPointer(), pVSCode->GetBufferSize(), &g_pVertexLayout ) ) return false; SAFE_RELEASE(pVSCode); D3D10_BUFFER_DESC cbDesc; D3D10_SUBRESOURCE_DATA subDesc; { // vertex buffer cbDesc.ByteWidth = sizeof(Vertex_VT) * 4; cbDesc.Usage = D3D10_USAGE_DYNAMIC ; cbDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER; cbDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; cbDesc.MiscFlags = 0; ZeroMemory(&subDesc, sizeof(subDesc)); subDesc.pSysMem = g_Quad; // 配置一塊可以存放Vertex的記憶體, 也就是Vertex Buffer. if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, &subDesc, &g_pVertexBuffer ) ) return false; } { // 配置Shader參數的記憶體空間 cbDesc.ByteWidth = sizeof(Matrix4x4) * 2; cbDesc.Usage = D3D10_USAGE_DYNAMIC; cbDesc.BindFlags = D3D10_BIND_CONSTANT_BUFFER; cbDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; cbDesc.MiscFlags = 0; if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, NULL, &g_pConstantBuffer ) ) return false; } // 計算投影矩陣 g_proj_matrix = GutMatrixPerspectiveRH_DirectX(g_fFovW, 1.0f, 0.1f, 100.0f); { // rasterizer state物件 D3D10_RASTERIZER_DESC rasterizer_state_desc; rasterizer_state_desc.FillMode = D3D10_FILL_SOLID; rasterizer_state_desc.CullMode = D3D10_CULL_NONE; rasterizer_state_desc.FrontCounterClockwise = true; rasterizer_state_desc.DepthBias = 0; rasterizer_state_desc.DepthBiasClamp = 0.0f; rasterizer_state_desc.SlopeScaledDepthBias = 0.0f; rasterizer_state_desc.DepthClipEnable = false; rasterizer_state_desc.ScissorEnable = false; rasterizer_state_desc.MultisampleEnable = false; rasterizer_state_desc.AntialiasedLineEnable = false; if ( D3D_OK != g_pDevice->CreateRasterizerState(&rasterizer_state_desc, &g_pRasterizerState) ) return false; g_pDevice->RSSetState(g_pRasterizerState); } { D3D10_SAMPLER_DESC sampler_desc; ZeroMemory(&sampler_desc, sizeof(sampler_desc)); sampler_desc.Filter = D3D10_FILTER_MIN_MAG_MIP_LINEAR; sampler_desc.AddressU = D3D10_TEXTURE_ADDRESS_WRAP; sampler_desc.AddressV = D3D10_TEXTURE_ADDRESS_WRAP; sampler_desc.AddressW = D3D10_TEXTURE_ADDRESS_WRAP; if ( D3D_OK != g_pDevice->CreateSamplerState(&sampler_desc, &g_pSamplerState) ) return false; g_pDevice->PSSetSamplers(0, 1, &g_pSamplerState); } g_view_matrix = GutMatrixLookAtRH(g_eye, g_lookat, g_up); return true; }
bool InitResourceDX10(void) { g_pDevice = GutGetGraphicsDeviceDX10(); ID3D10Blob *pVSCode = NULL; // 載入Vertex Shader g_pVertexShader = GutLoadVertexShaderDX10_HLSL("../../shaders/vertex_lighting_dx10.hlsl", "VS", "vs_4_0", &pVSCode); if ( NULL==g_pVertexShader ) return false; // 載入Pixel Shader g_pPixelShader = GutLoadPixelShaderDX10_HLSL("../../shaders/vertex_lighting_dx10.hlsl", "PS", "ps_4_0"); if ( NULL==g_pPixelShader ) return false; // 設定Vertex資料格式 D3D10_INPUT_ELEMENT_DESC layout[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 }, { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0 } }; if ( D3D_OK != g_pDevice->CreateInputLayout( layout, sizeof(layout)/sizeof(D3D10_INPUT_ELEMENT_DESC), pVSCode->GetBufferPointer(), pVSCode->GetBufferSize(), &g_pVertexLayout ) ) return false; SAFE_RELEASE(pVSCode); D3D10_BUFFER_DESC cbDesc; // vertex buffer cbDesc.ByteWidth = sizeof(Vertex_V3N3) * g_iMaxNumGridVertices; cbDesc.Usage = D3D10_USAGE_DYNAMIC ; cbDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER; cbDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; cbDesc.MiscFlags = 0; // 配置一塊可以存放Vertex的記憶體, 也就是Vertex Buffer. if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, NULL, &g_pVertexBuffer ) ) return false; // 設定一塊可以用來放Index的記憶體. cbDesc.ByteWidth = sizeof(unsigned short) * g_iMaxNumGridIndices; cbDesc.Usage = D3D10_USAGE_DYNAMIC; cbDesc.BindFlags = D3D10_BIND_INDEX_BUFFER; cbDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; cbDesc.MiscFlags = 0; // 配置一塊可以存放Index的記憶體, 也就是Index Buffer. if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, NULL, &g_pIndexBuffer ) ) return false; // 配置Shader讀取參數的記憶體空間 cbDesc.ByteWidth = sizeof(Matrix4x4) * 2; cbDesc.Usage = D3D10_USAGE_DYNAMIC; cbDesc.BindFlags = D3D10_BIND_CONSTANT_BUFFER; cbDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; cbDesc.MiscFlags = 0; if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, NULL, &g_pMatrixConstantBuffer ) ) return false; cbDesc.ByteWidth = sizeof(Light_Info) * g_iNumLights; cbDesc.Usage = D3D10_USAGE_DYNAMIC; cbDesc.BindFlags = D3D10_BIND_CONSTANT_BUFFER; cbDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; cbDesc.MiscFlags = 0; if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, NULL, &g_pLightConstantBuffer ) ) return false; // 計算投影矩陣 g_proj_matrix = GutMatrixPerspectiveRH_DirectX(g_fFovW, 1.0f, 0.1f, 100.0f); // rasterizer state物件 D3D10_RASTERIZER_DESC rasterizer_state_desc; rasterizer_state_desc.FillMode = D3D10_FILL_SOLID; rasterizer_state_desc.CullMode = D3D10_CULL_NONE; rasterizer_state_desc.FrontCounterClockwise = true; rasterizer_state_desc.DepthBias = 0; rasterizer_state_desc.DepthBiasClamp = 0.0f; rasterizer_state_desc.SlopeScaledDepthBias = 0.0f; rasterizer_state_desc.DepthClipEnable = false; rasterizer_state_desc.ScissorEnable = false; rasterizer_state_desc.MultisampleEnable = false; rasterizer_state_desc.AntialiasedLineEnable = false; if ( D3D_OK != g_pDevice->CreateRasterizerState(&rasterizer_state_desc, &g_pRasterizerState) ) return false; g_pDevice->RSSetState(g_pRasterizerState); g_view_matrix = GutMatrixLookAtRH(g_eye, g_lookat, g_up); return true; }