void RenderFrameDX10(void) { Vector4 vClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 取得呼叫GutCreateGraphicsDeviceDX10時所產生的D3D10物件 ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); //frame buffer ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); //depth/stencil buffer IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); // front/back buffer g_pDevice->ClearRenderTargetView(pRenderTargetView, &vClearColor[0]); g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH|D3D10_CLEAR_STENCIL, 1.0f, 0); Matrix4x4 camera_matrix = g_Control.GetCameraMatrix(); Matrix4x4 view_matrix = g_Control.GetViewMatrix(); Matrix4x4 world_matrix = g_Control.GetObjectMatrix(); g_Model_DX10.SetLight(0, g_Lights[0]); g_Model_DX10.SetLight(1, g_Lights[1]); g_Model_DX10.EnableLighting(true); g_Model_DX10.SetProjectionMatrix(g_proj_matrix); g_Model_DX10.SetWorldMatrix(world_matrix); g_Model_DX10.SetViewMatrix(view_matrix); g_Model_DX10.SetInvViewMatrix(camera_matrix); g_Model_DX10.UpdateMatrix(); g_Model_DX10.Render(); // 等待硬體掃結束, 然後才更新畫面 pSwapChain->Present(1, 0); }
void RenderFrameDX10(void) { Vector4 vClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 取得呼叫GutCreateGraphicsDeviceDX10時所產生的D3D10物件 ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); //frame buffer ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); //depth/stencil buffer IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); // front/back buffer // 清除顏色 g_pDevice->ClearRenderTargetView(pRenderTargetView, (float *)&vClearColor); // 清除Depth/Stencil buffer g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0); // /* sModelLight light; light.vPosition = g_Lights[0].m_Position; light.vDirection = g_Lights[0].m_Direction; light.vDiffuse = g_Lights[0].m_Diffuse; light.vSpecular = g_Lights[0].m_Specular; */ //g_Heightmap.Render(g_Control.GetObjectMatrix(), g_Control.GetViewMatrix(), g_proj_matrix, &light); g_Heightmap.Render(g_Control.GetObjectMatrix(), g_Control.GetViewMatrix(), g_proj_matrix); // 等待硬體掃結束, 然後才更新畫面 pSwapChain->Present(1, 0); }
void RenderFrameDX10(void) { int w, h; GutGetWindowSize(w, h); Vector4 vClearColor(0.0f, 0.0f, 0.0f, 0.0f); UINT stride = sizeof(Vertex_VT); UINT offset = 0; ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); //frame buffer ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); //depth/stencil buffer D3D10_VIEWPORT vp = {0, 0, w, h, 0.0f, 1.0f}; g_pDevice->RSSetViewports(1, &vp); g_pDevice->OMSetRenderTargets(1, &pRenderTargetView, NULL); // 設定Shader g_pDevice->VSSetShader(g_pBlurVS); g_pDevice->PSSetShader(g_pRGBAPixelShader); // 設定vertex shader讀取參數的記憶體位罝 g_pDevice->VSSetConstantBuffers(0, 1, &g_pVSConstantBuffer); // 設定vertex資料格式 g_pDevice->IASetInputLayout(g_pVertexLayout); // 設定三角形頂點索引值資料排列是triangle strip g_pDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); g_pDevice->PSSetShaderResources(0, 1, &g_pTexture); g_pDevice->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, &offset); g_pDevice->Draw(4, 0); if ( g_bPosteffect ) { ID3D10ShaderResourceView *pRSView = NULL; pRSView = BrightnessImage(g_pTexture, &g_ImageInfo); pRSView = BlurImage(pRSView, &g_ImageInfo); g_pDevice->OMSetRenderTargets(1, &pRenderTargetView, NULL); g_pDevice->RSSetViewports(1, &vp); float dummy[] = {0,0,0,0}; g_pDevice->OMSetBlendState(g_pAddBlend, dummy, 0xffffffff); // 設定Shader g_pDevice->VSSetShader(g_pBlurVS); g_pDevice->PSSetShader(g_pRGBAPixelShader); // 設定vertex shader讀取參數的記憶體位罝 g_pDevice->VSSetConstantBuffers(0, 1, &g_pVSConstantBuffer); // 設定vertex資料格式 g_pDevice->IASetInputLayout(g_pVertexLayout); // 設定三角形頂點索引值資料排列是triangle strip g_pDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); g_pDevice->PSSetShaderResources(0, 1, &pRSView); g_pDevice->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, &offset); g_pDevice->Draw(4, 0); g_pDevice->OMSetBlendState(g_pNoBlend, dummy, 0xffffffff); } // 等待硬體掃結束, 然後才更新畫面 IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); pSwapChain->Present(1, 0); }
void RenderFrameDX10(void) { Vector4 vClearColor(0.0f, 0.0f, 0.0f, 0.0f); UINT stride = sizeof(Vector4); UINT offset = 0; // 取得呼叫GutCreateGraphicsDeviceDX10時所產生的D3D10物件 ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); //frame buffer ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); //depth/stencil buffer IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); // front/back buffer // 清除顏色 g_pDevice->ClearRenderTargetView(pRenderTargetView, (float *)&vClearColor); // 清除Depth/Stencil buffer g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0); // 設定vertex shader g_pDevice->VSSetShader(g_pVertexShader); // 設定pixel shader g_pDevice->PSSetShader(g_pPixelShader); // 設定vertex shader讀取參數的記憶體位罝 g_pDevice->VSSetConstantBuffers(0, 1, &g_pConstantBuffer); // 設定vertex資料格式 g_pDevice->IASetInputLayout(g_pVertexLayout); // 設定vertex buffer g_pDevice->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, &offset); // 設定要畫線 g_pDevice->IASetPrimitiveTopology( D3D10_PRIMITIVE_TOPOLOGY_LINELIST ); // 畫線 g_pDevice->Draw(16, 0); // 更新畫面 pSwapChain->Present(0, 0); }
void RenderFrameDX10(void) { Matrix4x4 view_matrix = g_Control.GetViewMatrix(); Matrix4x4 world_matrix = g_Control.GetObjectMatrix(); Vector4 vClearColor(0.0f, 0.0f, 0.0f, 0.0f); UINT stride = sizeof(Vertex_VT); UINT offset = 0; ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); g_pDevice->OMSetRenderTargets(1, &g_pRTView[FULLSIZE], pDepthStencilView); g_pDevice->ClearRenderTargetView(g_pRTView[FULLSIZE], &vClearColor[0]); g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH|D3D10_CLEAR_STENCIL, 1.0f, 0); SetViewport(FULLSIZE); CGutModel_DX10::SetViewMatrix(view_matrix); CGutModel_DX10::SetWorldMatrix(world_matrix); CGutModel_DX10::SetProjectionMatrix(g_proj_matrix); CGutModel_DX10::UpdateMatrix(); g_Model_DX10.Render(); ConvertToLuminance(); Average(); AdaptiveLuminance(); AutoExposure(); if ( g_iMode & 0x01 ) { g_pDevice->OMSetRenderTargets(1, &pRenderTargetView, pDepthStencilView); SetViewport(FULLSIZE); float x = -1.0f; float y = -1.0f; float w = 0.2f; float h = 0.2f; DrawImage(g_pSRView[LUMINANCE_CURRENT], x, y, w, h); x+=w; DrawImage(g_pSRView[LUMINANCE_PREVIOUS], x, y, w, h); x+=w; } // 等待硬體掃結束, 然後才更新畫面 IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); pSwapChain->Present(1, 0); }
void RenderFrameDX10(void) { Vector4 vClearColor(0.0f, 0.0f, 0.0f, 0.0f); // frame buffer ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); // depth/stencil buffer ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); // front/back buffer IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); // 清除顏色 g_pDevice->ClearRenderTargetView(pRenderTargetView, (float *)&vClearColor); // 清除Depth/Stencil buffer g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0); // 取得轉換矩陣 Matrix4x4 view_matrix = g_Control.GetViewMatrix(); Matrix4x4 world_matrix = g_Control.GetObjectMatrix(); Matrix4x4 ident_matrix = Matrix4x4::IdentityMatrix(); CGutModel_DX10::SetProjectionMatrix(g_proj_matrix); CGutModel_DX10::SetViewMatrix(view_matrix); // 畫出茶具組 { g_pDevice->OMSetDepthStencilState(NULL, 1); CGutModel_DX10::SetWorldMatrix(world_matrix); CGutModel_DX10::UpdateMatrix(); g_Model_DX10.Render(); } // stencil pass, 在stencil buffer里標出光源照射到的像素 { g_pDevice->OMSetDepthStencilState(g_pZStencil_Mask, 1); CGutModel_DX10::SetWorldMatrix(ident_matrix); CGutModel_DX10::UpdateMatrix(); CGutModel_DX10::SetMaterialOverwrite(&g_material_stencilpass); g_SpotLightModel_DX10.Render(); } // 畫出被光線照射到的區域 { g_pDevice->OMSetDepthStencilState(g_pZStencil_Test, 1); CGutModel_DX10::SetMaterialOverwrite(&g_material_spotlightpass); g_SpotLightModel_DX10.Render(); } // 畫出光柱圓錐 { g_pDevice->OMSetDepthStencilState(NULL, 1); CGutModel_DX10::SetMaterialOverwrite(NULL); g_SpotLightModel_DX10.Render(); } // 等待硬體掃結束, 然後才更新畫面. pSwapChain->Present(1, 0); }
void RenderFrameDX10(void) { Vector4 vClearColor(0.0f, 0.0f, 0.0f, 0.0f); UINT stride = sizeof(Vertex_VCN); UINT offset = 0; // 取得呼叫GutCreateGraphicsDeviceDX10時所產生的D3D10物件 ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); //frame buffer ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); //depth/stencil buffer IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); // front/back buffer // 清除顏色 g_pDevice->ClearRenderTargetView(pRenderTargetView, (float *)&vClearColor); // 清除Depth/Stencil buffer g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0); // 設定vertex shader g_pDevice->VSSetShader(g_pVertexShader); // 設定pixel shader g_pDevice->PSSetShader(g_pPixelShader); // 設定vertex shader讀取參數的記憶體位罝 g_pDevice->VSSetConstantBuffers(0, 1, &g_pConstantBuffer); // 設定vertex資料格式 g_pDevice->IASetInputLayout(g_pVertexLayout); // 設定vertex buffer g_pDevice->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, &offset); // 設定index buffer g_pDevice->IASetIndexBuffer(g_pIndexBuffer, DXGI_FORMAT_R16_UINT, 0); // 設定三角形頂點索引值資料排列是triangle strip g_pDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); // 計算矩陣 Matrix4x4 view_proj_matrix = g_view_matrix * g_proj_matrix; Matrix4x4 world_view_proj_matrix = g_world_matrix * view_proj_matrix; // 設定shader參數 Matrix4x4 *pConstData; g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); *pConstData = world_view_proj_matrix; g_pConstantBuffer->Unmap(); // 更新頂點資料 Vertex_VCN *pVertex; g_pVertexBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pVertex ); memcpy(pVertex, g_pGridVertices, sizeof(Vertex_VCN) * g_iNumGridVertices); g_pVertexBuffer->Unmap(); // 更新索引值陣列 unsigned short *pIndex; g_pIndexBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pIndex ); memcpy(pIndex, g_pGridIndices, sizeof(unsigned short) * g_iNumGridIndices); g_pIndexBuffer->Unmap(); // 畫出格子 g_pDevice->DrawIndexed(g_iNumGridIndices, 0, 0); // 等待硬體掃描結束, 然後才更新畫面 pSwapChain->Present(1, 0); }
void RenderFrameDX10(void) { Vector4 vClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 取得主畫面 ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); g_pDevice->ClearRenderTargetView(pRenderTargetView, (float *)&vClearColor); g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0); g_pDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_LINESTRIP); ID3D10EffectTechnique *g_pShader = NULL; switch(g_iMode) { default: case 1: g_pShader = g_pDrawCurveFX->GetTechniqueByName("SinCurve"); break; case 2: { g_pShader = g_pDrawCurveFX->GetTechniqueByName("ZCurve"); Vector4 vNearFar(1.0f, 100.0f, 0.0f, 0.0f); Matrix4x4 proj_matrix = GutMatrixPerspectiveRH_DirectX(45.0f, 1.0f, vNearFar[0], vNearFar[1]); //Matrix4x4 proj_matrix = GutMatrixOrthoRH_DirectX(10.0f, 10.0f, vNearFar[0], vNearFar[1]); //Matrix4x4 proj_matrix = GutMatrixOrthoRH_OpenGL(10.0f, 10.0f, vNearFar[0], vNearFar[1]); //Matrix4x4 proj_matrix = GutMatrixPerspectiveRH_OpenGL(45.0f, 1.0f, vNearFar[0], vNearFar[1]); ID3D10EffectMatrixVariable *pMatrix = g_pDrawCurveFX->GetVariableByName("proj_matrix")->AsMatrix(); ID3D10EffectVectorVariable *pNearFarPlane = g_pDrawCurveFX->GetVariableByName("NearFarPlane")->AsVector(); pMatrix->SetMatrix(&proj_matrix[0][0]); pNearFarPlane->SetFloatVector(&vNearFar[0]); break; } } g_pShader->GetPassByIndex(0)->Apply(0); g_pDevice->Draw(2, 0); IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); pSwapChain->Present(1, 0); }
void RenderFrameDX10(void) { // 取得呼叫GutCreateGraphicsDeviceDX10時所產生的D3D10物件 ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); // 清除晝面 Vector4 vClearColor(0.0f, 0.0f, 0.0f, 0.0f); g_pDevice->ClearRenderTargetView(pRenderTargetView, (float *)&vClearColor); g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0); // 畫出文字 g_Font.Render(); // 等待硬體掃結束, 然後才更新畫面 IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); // front/back buffer pSwapChain->Present(1, 0); }
void RenderFrameDX10(void) { Vector4 vClearColor(0.0f, 0.0f, 0.0f, 0.0f); UINT stride = sizeof(Vertex_VC); UINT offset = 0; // 取得呼叫GutCreateGraphicsDeviceDX10時所產生的D3D10物件 ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); //frame buffer ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); //depth/stencil buffer IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); // front/back buffer // 清除顏色 g_pDevice->ClearRenderTargetView(pRenderTargetView, (float *)&vClearColor); // 清除Depth/Stencil buffer g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0); // 設定vertex shader g_pDevice->VSSetShader(g_pVertexShader); // 設定pixel shader g_pDevice->PSSetShader(g_pPixelShader); // 設定vertex shader讀取參數的記憶體位罝 g_pDevice->VSSetConstantBuffers(0, 1, &g_pConstantBuffer); // 設定vertex資料格式 g_pDevice->IASetInputLayout(g_pVertexLayout); // 設定vertex buffer g_pDevice->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, &offset); // 設定index buffer g_pDevice->IASetIndexBuffer(g_pIndexBuffer, DXGI_FORMAT_R16_UINT, 0); // 設定要畫線 g_pDevice->IASetPrimitiveTopology( D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST ); // 設定座標轉換矩陣 Matrix4x4 world_view_proj_matrix = g_object_matrix * g_view_proj_matrix; // 設定shader參數 Matrix4x4 *pConstData; g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); *pConstData = world_view_proj_matrix; g_pConstantBuffer->Unmap(); // 畫面 g_pDevice->DrawIndexed(18, 0, 0); // 等待硬體掃結束, 然後才更新畫面 pSwapChain->Present(1, 0); }
void RenderFrameDX10(void) { Vector4 vClearColor(0.0f, 0.0f, 0.0f, 0.0f); UINT stride = sizeof(Vertex_VT); UINT offset = 0; // 取得呼叫GutCreateGraphicsDeviceDX10時所產生的D3D10物件 ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); //frame buffer ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); //depth/stencil buffer IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); // front/back buffer int w, h; GutGetWindowSize(w, h); D3D10_RECT rect = {0, 0, w, h/2}; g_pDevice->RSSetScissorRects(1, &rect); // 清除顏色 g_pDevice->ClearRenderTargetView(pRenderTargetView, (float *)&vClearColor); // 清除Depth/Stencil buffer g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0); // 設定vertex shader g_pDevice->VSSetShader(g_pVertexShader); // 設定pixel shader g_pDevice->PSSetShader(g_pPixelShader); // 設定vertex shader讀取參數的記憶體位罝 g_pDevice->VSSetConstantBuffers(0, 1, &g_pConstantBuffer); // 套用貼圖 g_pDevice->PSSetShaderResources(0, 1, &g_pTexture); // 設定vertex資料格式 g_pDevice->IASetInputLayout(g_pVertexLayout); // 設定vertex buffer g_pDevice->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, &offset); // 設定三角形頂點索引值資料排列是triangle strip g_pDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); // 計算矩陣 Matrix4x4 view_proj_matrix = g_view_matrix * g_proj_matrix; Matrix4x4 world_view_proj_matrix = g_world_matrix * view_proj_matrix; // 更新shader參數 Matrix4x4 *pConstData; g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); *pConstData = world_view_proj_matrix; g_pConstantBuffer->Unmap(); // 畫出格子 g_pDevice->Draw(4, 0); // 等待硬體掃結束, 然後才更新畫面 pSwapChain->Present(1, 0); }
void RenderFrameDX10(void) { Vector4 vClearColor(0.0f, 0.0f, 0.0f, 0.0f); UINT stride = sizeof(Vertex_VT); UINT offset = 0; // `取得呼叫GutCreateGraphicsDeviceDX10時所產生的D3D10物件` ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); // front/back buffer IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); // `清除顏色` g_pDevice->ClearRenderTargetView(pRenderTargetView, (float *)&vClearColor); // `清除Depth/Stencil buffer` g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0); // `設定vertex shader` g_pDevice->VSSetShader(g_pVertexShader); // `設定pixel shader` g_pDevice->PSSetShader(g_pPixelShader); // `設定vertex shader讀取參數的記憶體位罝` g_pDevice->VSSetConstantBuffers(0, 1, &g_pConstantBuffer); // `套用貼圖` g_pDevice->PSSetShaderResources(0, 1, &g_pTexture); // `設定vertex資料格式` g_pDevice->IASetInputLayout(g_pVertexLayout); // `設定vertex buffer` g_pDevice->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, &offset); // `設定三角形頂點索引值資料排列是triangle strip` g_pDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); // `計算矩陣` Matrix4x4 view_proj_matrix = g_view_matrix * g_proj_matrix; Matrix4x4 world_view_proj_matrix = g_world_matrix * view_proj_matrix; // `更新shader參數` Matrix4x4 *pConstData; g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); pConstData[0] = world_view_proj_matrix; pConstData[1] = g_texture_matrix; g_pConstantBuffer->Unmap(); // `畫出矩形` g_pDevice->Draw(4, 0); // `等待硬體掃結束, 然後才更新畫面.` pSwapChain->Present(1, 0); }
void RenderFrameDX10(void) { Vector4 vClearColor(0.0f); Vector4 vObjectColor(0.0f, 1.0f, 0.0f); ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); //frame buffer ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); //depth/stencil buffer g_pDevice->ClearRenderTargetView(pRenderTargetView, &vClearColor[0]); g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH|D3D10_CLEAR_STENCIL, 1.0f, 0); // background image DrawImage(g_pTexture); // refraction Matrix4x4 view_matrix = g_Control.GetViewMatrix(); Matrix4x4 world_matrix = g_Control.GetObjectMatrix(); Matrix4x4 wvp_matrix = world_matrix * view_matrix * g_proj_matrix; Matrix4x4 wv_matrix = world_matrix * view_matrix; ID3D10EffectTechnique *pShader = g_pRefractionFX->GetTechniqueByName("Refraction"); ID3D10EffectShaderResourceVariable *texture_param = g_pRefractionFX->GetVariableByName("BackgroundImage")->AsShaderResource(); ID3D10EffectMatrixVariable *wvpmatrix_param = g_pRefractionFX->GetVariableByName("wvp_matrix")->AsMatrix(); ID3D10EffectMatrixVariable *wvmatrix_param = g_pRefractionFX->GetVariableByName("wv_matrix")->AsMatrix(); ID3D10EffectVectorVariable *color_param = g_pRefractionFX->GetVariableByName("object_color")->AsVector(); texture_param->SetResource(g_pTexture); wvpmatrix_param->SetMatrix( (float *)&wvp_matrix ); wvmatrix_param->SetMatrix( (float *)&wv_matrix ); color_param->SetFloatVector( (float *)&vObjectColor ); pShader->GetPassByIndex(0)->Apply(0); g_pDevice->IASetInputLayout(g_pRefractionLayout); g_Model_DX10.Render(SUBMIT_CULLFACE); // 等待硬體掃結束, 然後才更新畫面 IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); pSwapChain->Present(1, 0); }
void RenderFrameDX10(void) { Vector4 vClearColor(0.4f, 0.4f, 0.4f, 1.0f); // 取得呼叫GutCreateGraphicsDeviceDX10時所產生的D3D10物件 ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); //frame buffer ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); //depth/stencil buffer // 清除畫面 g_pDevice->ClearRenderTargetView(pRenderTargetView, (float *)&vClearColor); g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0); // 設定shader g_pDevice->VSSetShader(g_pVertexShader); g_pDevice->PSSetShader(g_pPixelShader); // 設定vertex shader讀取參數的記憶體位罝 g_pDevice->VSSetConstantBuffers(0, 1, &g_pConstantBuffer); // 更新shader常數參數 Matrix4x4 view_matrix = g_Control.GetViewMatrix(); Matrix4x4 object_matrix = g_Control.GetObjectMatrix(); Matrix4x4 *pShaderConstant; g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pShaderConstant ); pShaderConstant[0] = object_matrix * view_matrix * g_proj_matrix; pShaderConstant[1] = object_matrix; g_pConstantBuffer->Unmap(); // 設定vertex資料格式 g_pDevice->IASetInputLayout(g_pVertexLayout); // 設定index buffer & vertex buffer g_pDevice->IASetIndexBuffer(g_pIndexBuffer, DXGI_FORMAT_R16_UINT, 0); UINT stride = sizeof(CompressedVertex); UINT offset = 0; g_pDevice->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, &offset); // 設定三角形頂點索引值資料排列是triangle strip g_pDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST); // 畫出球 g_pDevice->DrawIndexed(g_iNumSphereIndices, 0, 0); // 等待硬體掃結束, 然後才更新畫面 IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); // front/back buffer pSwapChain->Present(1, 0); }
static void AutoExposure(void) { ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); ID3D10EffectTechnique *pShader = g_pExposureFX->GetTechniqueByName("AutoExposure"); ID3D10EffectShaderResourceVariable *pImage0_var = g_pExposureFX->GetVariableByName("Image0")->AsShaderResource(); ID3D10EffectShaderResourceVariable *pImage1_var = g_pExposureFX->GetVariableByName("Image1")->AsShaderResource(); ID3D10EffectVectorVariable *pMulClamp_var = g_pExposureFX->GetVariableByName("vMultiplierClamp")->AsVector(); ID3D10EffectVectorVariable *pMiddle_var = g_pExposureFX->GetVariableByName("vMiddleGray")->AsVector(); Vector4 vMiddleGray(0.5f); Vector4 vMultiplierClamp(0.2f, 3.0f, 0.0f, 0.0f); pImage0_var->SetResource(g_pSRView[FULLSIZE]); pImage1_var->SetResource(g_pSRView[LUMINANCE_PREVIOUS]); pMulClamp_var->SetFloatVector( (float*)&vMultiplierClamp[0] ); pMiddle_var->SetFloatVector( (float*)&vMiddleGray[0] ); g_pDevice->OMSetRenderTargets(1, &pRenderTargetView, NULL); SetViewport(FULLSIZE); pShader->GetPassByIndex(0)->Apply(0); DrawFullScreenQuad(); }
void RenderFrameDX10(void) { Vector4 vClearColor(0.0f, 0.0f, 0.0f, 0.0f); // frame buffer ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); // depth/stencil buffer ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); // front/back buffer IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); Matrix4x4 ident_matrix; ident_matrix.Identity(); Matrix4x4 view_matrix = g_Control.GetViewMatrix(); Matrix4x4 world_matrix = g_Control.GetObjectMatrix(); Matrix4x4 world_view_proj_matrix = world_matrix * view_matrix * g_proj_matrix; // 清除顏色 g_pDevice->ClearRenderTargetView(pRenderTargetView, (float *)&vClearColor); // 清除Depth/Stencil buffer g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0); // 畫出茶壼, 并更新 Stencil Buffer. { g_pDevice->OMSetDepthStencilState(g_pZStencil_Incr, 0); CGutModel_DX10::SetProjectionMatrix(g_proj_matrix); CGutModel_DX10::SetViewMatrix(view_matrix); CGutModel_DX10::SetWorldMatrix(world_matrix); CGutModel_DX10::UpdateMatrix(); g_Model_DX10.Render(); } // 套用 Shader { UINT stride = sizeof(Vertex_V); UINT offset = 0; // 設定Shader g_pDevice->VSSetShader(g_pVertexShader); g_pDevice->PSSetShader(g_pPixelShader); // 設定Shader讀取參數的記憶體位罝 g_pDevice->VSSetConstantBuffers(0, 1, &g_pConstantBuffer); g_pDevice->PSSetConstantBuffers(0, 1, &g_pConstantBuffer); // 設定vertex資料格式 g_pDevice->IASetInputLayout(g_pVertexLayout); // 設定Vertex Buffer g_pDevice->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, &offset); // 設定三角形頂點索引值資料排列是triangle strip g_pDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); } ShaderConstant *pConstData = NULL; // 用綠色標示出只更新1次的像素 { // 設定shader參數 g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); pConstData->m_wvp_matrix = ident_matrix; pConstData->m_color.Set(0,1,0,1); g_pConstantBuffer->Unmap(); // 畫出看板 g_pDevice->OMSetDepthStencilState(g_pZStencil_Test, 1); g_pDevice->Draw(4, 0); } // 用藍色標示出更新2次的像素 { // 設定shader參數 g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); pConstData->m_wvp_matrix = ident_matrix; pConstData->m_color.Set(0,0,1,1); g_pConstantBuffer->Unmap(); // 畫出看板 g_pDevice->OMSetDepthStencilState(g_pZStencil_Test, 2); g_pDevice->Draw(4, 0); } // 用紅色標示出更新3次的像素 { // 設定shader參數 g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); pConstData->m_wvp_matrix = ident_matrix; pConstData->m_color.Set(1,0,0,1); g_pConstantBuffer->Unmap(); // 畫出看板 g_pDevice->OMSetDepthStencilState(g_pZStencil_Test, 3); g_pDevice->Draw(4, 0); } // 用白色標示出更新超過3次的像素 { // 設定shader參數 g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); pConstData->m_wvp_matrix = ident_matrix; pConstData->m_color.Set(1,1,1,1); g_pConstantBuffer->Unmap(); // 畫出看板 g_pDevice->OMSetDepthStencilState(g_pZStencil_Less, 3); g_pDevice->Draw(4, 0); } // 等待硬體掃結束, 然後才更新畫面. pSwapChain->Present(1, 0); }
void RenderFrameDX10(void) { Vector4 vClearColor(0.0f, 0.0f, 0.0f, 0.0f); UINT stride = sizeof(Vertex_VC); UINT offset = 0; // 取得呼叫GutCreateGraphicsDeviceDX10時所產生的D3D10物件 ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); //frame buffer ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); //depth/stencil buffer IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); // front/back buffer // 清除顏色 g_pDevice->ClearRenderTargetView(pRenderTargetView, (float *)&vClearColor); // 清除Depth/Stencil buffer g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0); // 設定vertex shader g_pDevice->VSSetShader(g_pVertexShader); // 設定pixel shader g_pDevice->PSSetShader(g_pPixelShader); // 設定vertex shader讀取參數的記憶體位罝 g_pDevice->VSSetConstantBuffers(0, 1, &g_pConstantBuffer); // 設定vertex資料格式 g_pDevice->IASetInputLayout(g_pVertexLayout); // 設定index buffer g_pDevice->IASetIndexBuffer(g_pSphereIndexBuffer, DXGI_FORMAT_R16_UINT, 0); // 設定三角形頂點索引值資料排列是triangle strip g_pDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST); // 計算出一個可以轉換到鏡頭座標系的矩陣 Matrix4x4 view_matrix = GutMatrixLookAtRH(g_eye, g_lookat, g_up); Matrix4x4 view_proj_matrix = view_matrix * g_proj_matrix; Matrix4x4 world_view_proj_matrix; // sun world_view_proj_matrix = g_sun_matrix * view_proj_matrix; // 設定shader參數 Matrix4x4 *pConstData; g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); *pConstData = world_view_proj_matrix; g_pConstantBuffer->Unmap(); // g_pDevice->IASetVertexBuffers(0, 1, &g_pSunVertexBuffer, &stride, &offset); g_pDevice->DrawIndexed(g_iNumSphereIndices, 0, 0); // earth world_view_proj_matrix = g_earth_matrix * view_proj_matrix; // 設定shader參數 g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); *pConstData = world_view_proj_matrix; g_pConstantBuffer->Unmap(); // g_pDevice->IASetVertexBuffers(0, 1, &g_pEarthVertexBuffer, &stride, &offset); g_pDevice->DrawIndexed(g_iNumSphereIndices, 0, 0); // moon world_view_proj_matrix = g_moon_matrix * view_proj_matrix; // 設定shader參數 g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); *pConstData = world_view_proj_matrix; g_pConstantBuffer->Unmap(); // g_pDevice->IASetVertexBuffers(0, 1, &g_pMoonVertexBuffer, &stride, &offset); g_pDevice->DrawIndexed(g_iNumSphereIndices, 0, 0); // 等待硬體掃結束, 然後才更新畫面 pSwapChain->Present(1, 0); }
void RenderFrameDX10(void) { Vector4 vClearColor(0.4f, 0.4f, 0.4f, 1.0f); // frame buffer ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); // depth/stencil buffer ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); // front/back buffer IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); // `清除顏色` g_pDevice->ClearRenderTargetView(pRenderTargetView, (float *)&vClearColor); // `清除`Depth/Stencil buffer g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0); Vector4 camera_lookat(0.0f, 0.0f, 0.0f); int w, h; GutGetWindowSize(w, h); Matrix4x4 view_matrix; Matrix4x4 ortho_proj = GutMatrixOrthoRH_DirectX(20.0f, 20.0f, 0.1f, 100.0f); // `前視圖` { D3D10_VIEWPORT vp = {0, 0, w/2, h/2, 0.0f, 1.0f}; g_pDevice->RSSetViewports(1, &vp); // view matrix Vector4 camera_pos(0.0f, -20.0f, 0.0f); Vector4 camera_up(0.0f, 0.0f, 1.0f); view_matrix = GutMatrixLookAtRH(camera_pos, camera_lookat, camera_up); // render objects RenderSolarSystemDX10(view_matrix, ortho_proj); } // `上視圖` { D3D10_VIEWPORT vp = {w/2, 0, w/2, h/2, 0.0f, 1.0f}; g_pDevice->RSSetViewports(1, &vp); // view matrix Vector4 camera_pos(0.0f, 0.0f, 20.0f); Vector4 camera_up(0.0f, 1.0f, 0.0f); view_matrix = GutMatrixLookAtRH(camera_pos, camera_lookat, camera_up); // render objects RenderSolarSystemDX10(view_matrix, ortho_proj); } // `右視圖` { D3D10_VIEWPORT vp = {0, h/2, w/2, h/2, 0.0f, 1.0f}; g_pDevice->RSSetViewports(1, &vp); // view matrix Vector4 camera_pos(20.0f, 0.0f, 0.0f); Vector4 camera_up(0.0f, 0.0f, 1.0f); view_matrix = GutMatrixLookAtRH(camera_pos, camera_lookat, camera_up); // render objects RenderSolarSystemDX10(view_matrix, ortho_proj); } // `使用者視角` { D3D10_VIEWPORT vp = {w/2, h/2, w/2, h/2, 0.0f, 1.0f}; g_pDevice->RSSetViewports(1, &vp); // view matrix Matrix4x4 view_matrix = g_Control.GetViewMatrix(); Matrix4x4 object_matrix = g_Control.GetObjectMatrix(); view_matrix = object_matrix * view_matrix; // render objects RenderSolarSystemDX10(view_matrix, g_proj_matrix); } // `畫邊線` { UINT stride = sizeof(Vertex_VC); UINT offset = 0; D3D10_VIEWPORT vp = {0, 0, w, h, 0.0f, 1.0f}; g_pDevice->RSSetViewports(1, &vp); // `設定`vertex shader g_pDevice->VSSetShader(g_pVertexShader); // `設定`pixel shader g_pDevice->PSSetShader(g_pPixelShader); // `設定vertex shader讀取參數的記憶體位置` g_pDevice->VSSetConstantBuffers(0, 1, &g_pConstantBuffer); Matrix4x4 *pConstData; g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); pConstData->Identity(); g_pConstantBuffer->Unmap(); g_pDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_LINELIST); g_pDevice->IASetVertexBuffers(0, 1, &g_pBorderVertexBuffer, &stride, &offset); g_pDevice->Draw(4, 0); } // `等待硬體掃結束, 然後才更新畫面.` pSwapChain->Present(1, 0); }
void RenderFrameDX10(void) { UINT stride = sizeof(Vertex_VT); UINT offset = 0; // 取得呼叫GutCreateGraphicsDeviceDX10時所產生的D3D10物件 ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); //frame buffer ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); //depth/stencil buffer IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); // front/back buffer // 設定vertex shader讀取參數的記憶體位罝 g_pDevice->VSSetConstantBuffers(0, 1, &g_pConstantBuffer); // 設定pixel shader讀取參數的記憶體位罝 g_pDevice->PSSetConstantBuffers(0, 1, &g_pConstantBuffer); // 套用貼圖 // 設定vertex shader g_pDevice->VSSetShader(g_pVertexShader); // 設定pixel shader g_pDevice->PSSetShader(g_pPixelShader); // 設定vertex資料格式 g_pDevice->IASetInputLayout(g_pVertexLayout); // 設定三角形頂點索引值資料排列是triangle strip g_pDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); FLOAT dummy[4]; { g_pDevice->OMSetBlendState(NULL, dummy, 0xffffffff); g_pDevice->OMSetDepthStencilState(g_pDepthStencilState_ZDisable, 0); // 設定vertex buffer g_pDevice->IASetVertexBuffers(0, 1, &g_pVertexBufferFullScreen, &stride, &offset); // 套用第1張貼圖 g_pDevice->PSSetShaderResources(0, 1, &g_pTexture0); // 計算矩陣 Matrix4x4 world_view_proj_matrix; world_view_proj_matrix.Identity(); // 更新shader參數 Matrix4x4 *pConstData; g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); *pConstData = world_view_proj_matrix; g_pConstantBuffer->Unmap(); // 畫出格子 g_pDevice->Draw(4, 0); } { g_pDevice->OMSetBlendState(g_pBlendState, dummy, 0xffffffff); g_pDevice->OMSetDepthStencilState(NULL, 0); // 設定vertex buffer g_pDevice->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, &offset); Vertex_VT *pVertices = NULL; g_pVertexBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pVertices ); memcpy(pVertices, g_Quad, sizeof(g_Quad)); g_pVertexBuffer->Unmap(); // 套用第1張貼圖 g_pDevice->PSSetShaderResources(0, 1, &g_pTexture1); // 計算矩陣 Matrix4x4 view_matrix = GutMatrixLookAtRH(g_eye, g_lookat, g_up); Matrix4x4 world_view_proj_matrix = g_world_matrix * view_matrix * g_proj_matrix; // 更新shader參數 Matrix4x4 *pConstData; g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); *pConstData = world_view_proj_matrix; g_pConstantBuffer->Unmap(); // 畫出格子 g_pDevice->Draw(4, 0); } // 等待硬體掃結束, 然後才更新畫面 pSwapChain->Present(1, 0); }
void RenderFrameDX10(void) { Vector4 vColorDarkBlue(0.0f, 0.0f, 0.5f, 1.0f); Vector4 vColorBlue(0.0f, 0.0f, 0.8f, 1.0f); Vector4 vPlane(0.0f, 0.0f, 1.0f, -g_mirror_z); D3D10_VIEWPORT mainVP, VP; // `取得呼叫GutCreateGraphicsDeviceDX10時所產生的D3D10物件` ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); // front/back buffer IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); // `在動態貼圖中畫出鏡射的茶壼` { UINT nViewports = 1; g_pDevice->RSGetViewports(&nViewports, &mainVP); // new rendertarget viewport size VP.TopLeftX = VP.TopLeftY = 0; VP.Width = VP.Height = 512; VP.MinDepth = 0.0f; VP.MaxDepth = 1.0f; ID3D10ShaderResourceView *null_views[4] = {NULL, NULL, NULL, NULL}; g_pDevice->PSSetShaderResources(0, 4, null_views); // `使用代表動態貼圖的`RenderTarget g_pDevice->OMSetRenderTargets(1, &g_pRGBAView, g_pDepthStencilView); // g_pDevice->RSSetViewports(1, &VP); // `清除顏色` g_pDevice->ClearRenderTargetView(g_pRGBAView, (float *)&vColorDarkBlue); // `清除`Depth/Stencil buffer g_pDevice->ClearDepthStencilView(g_pDepthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0); // `畫鏡射的茶壼` RenderModelDX10(true, &vPlane); } // `在主Framebuffer中畫出正常的茶壼` { // `使用主`framebuffer g_pDevice->OMSetRenderTargets(1, &pRenderTargetView, pDepthStencilView); // g_pDevice->RSSetViewports(1, &mainVP); // `清除顏色` g_pDevice->ClearRenderTargetView(pRenderTargetView, (float *)&vColorBlue); // `清除`Depth/Stencil buffer g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0); // `畫茶壼` RenderModelDX10(false, &vPlane); } // `在主framebuffer中畫出鏡面` { UINT stride = sizeof(Vertex_VT); UINT offset = 0; // `設定`vertex shader g_pDevice->VSSetShader(g_pVertexShader); // `設定`pixel shader g_pDevice->PSSetShader(g_pPixelShader); // `設定`Shader Constants g_pDevice->VSSetConstantBuffers(0, 1, &g_pVSConstBuffer); // `設定vertex資料格式` g_pDevice->IASetInputLayout(g_pVertexLayout); // `設定三角形頂點索引值資料排列是triangle strip` g_pDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); // Vertex Buffer g_pDevice->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, &offset); // `計算`texture matrix Matrix4x4 uv_offset_matrix; uv_offset_matrix.Scale_Replace(0.5f, -0.5f, 1.0f); uv_offset_matrix[3].Set(0.5f, 0.5f, 0.0f, 1.0f); Matrix4x4 texture_matrix = g_mirror_view_matrix * g_proj_matrix * uv_offset_matrix; Vertex_VT *pVertices = NULL; g_pVertexBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pVertices); for ( int i=0; i<4; i++ ) { Vector4 vPosition = g_Quad[i].m_Position; Vector4 vTexcoord = vPosition * texture_matrix; vTexcoord /= vTexcoord.GetW(); pVertices[i].m_Position = vPosition; pVertices[i].m_Texcoord = vTexcoord; } g_pVertexBuffer->Unmap(); // `計算矩陣` Matrix4x4 view_matrix = g_Control.GetViewMatrix(); Matrix4x4 wvp_matrix = view_matrix * g_proj_matrix; // `更新shader參數` Matrix4x4 *pConstData; g_pVSConstBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); *pConstData = wvp_matrix; g_pVSConstBuffer->Unmap(); // `套用第1張貼圖` g_pDevice->PSSetShaderResources(0, 1, &g_pTextureView); g_pDevice->PSSetSamplers(0, 1, &g_pSamplerState); // `畫出格子` g_pDevice->Draw(4, 0); } // `等待硬體掃結束, 然後才更新畫面.` pSwapChain->Present(1, 0); }
void RenderFrameDX10(void) { Vector4 vClearColor(0.0f, 0.0f, 0.0f, 0.0f); UINT stride = sizeof(Vertex_VC); UINT offset = 0; // 取得呼叫GutCreateGraphicsDeviceDX10時所產生的D3D10物件 ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); //frame buffer ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); //depth/stencil buffer IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); // front/back buffer // 清除顏色 g_pDevice->ClearRenderTargetView(pRenderTargetView, (float *)&vClearColor); // 清除Depth/Stencil buffer g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0); // 設定vertex shader g_pDevice->VSSetShader(g_pVertexShader); // 設定pixel shader g_pDevice->PSSetShader(g_pPixelShader); // 設定vertex shader讀取參數的記憶體位罝 g_pDevice->VSSetConstantBuffers(0, 1, &g_pConstantBuffer); // 設定vertex資料格式 g_pDevice->IASetInputLayout(g_pVertexLayout); // 設定index buffer g_pDevice->IASetIndexBuffer(g_pSphereIndexBuffer, DXGI_FORMAT_R16_UINT, 0); // 設定三角形頂點索引值資料排列是triangle strip g_pDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST); // 計算出一個可以轉換到鏡頭座標系的矩陣 D3DXMATRIX temp_matrix; D3DXMATRIX view_matrix, view_proj_matrix, world_view_proj_matrix; D3DXMatrixLookAtRH(&view_matrix, (D3DXVECTOR3 *)&g_eye, (D3DXVECTOR3 *)&g_lookat, (D3DXVECTOR3 *)&g_up); D3DXMatrixMultiply(&view_proj_matrix, &view_matrix, &g_proj_matrix); // 太陽, 帶入滑鼠的旋轉控制 D3DXMATRIX sun_matrix, sun_ry, sun_rx; D3DXMatrixRotationX(&sun_rx, g_fRotate_X); D3DXMatrixRotationY(&sun_ry, g_fRotate_Y); D3DXMatrixMultiply(&sun_matrix, &sun_ry, &sun_rx); D3DXMatrixMultiply(&world_view_proj_matrix, &sun_matrix, &view_proj_matrix); // 設定shader參數 D3DXMATRIX *pConstData; g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); *pConstData = world_view_proj_matrix; g_pConstantBuffer->Unmap(); // g_pDevice->IASetVertexBuffers(0, 1, &g_pSunVertexBuffer, &stride, &offset); g_pDevice->DrawIndexed(g_iNumSphereIndices, 0, 0); // 水星 float mercury_rotate_y = 2.0f * MATH_PI * (g_simulation_days / days_a_year_mercury); D3DXMATRIX mercury_matrix, mercury_translate, mercury_rotate; D3DXMatrixRotationY(&mercury_rotate, mercury_rotate_y); D3DXMatrixTranslation(&mercury_translate, mercury_to_sun_distance, 0.0f, 0.0f); D3DXMatrixMultiply(&temp_matrix, &mercury_translate, &mercury_rotate); D3DXMatrixMultiply(&mercury_matrix, &temp_matrix, &sun_matrix); D3DXMatrixMultiply(&world_view_proj_matrix, &mercury_matrix, &view_proj_matrix); // 設定shader參數 g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); *pConstData = world_view_proj_matrix; g_pConstantBuffer->Unmap(); g_pDevice->IASetVertexBuffers(0, 1, &g_pMoonVertexBuffer, &stride, &offset); g_pDevice->DrawIndexed(g_iNumSphereIndices, 0, 0); // 金星 float venus_rotate_y = 2.0f * MATH_PI * (g_simulation_days / days_a_year_venus); D3DXMATRIX venus_matrix, venus_rotate, venus_translate; D3DXMatrixRotationY(&venus_rotate, venus_rotate_y); D3DXMatrixTranslation(&venus_translate, venus_to_sun_distance, 0.0f, 0.0f); D3DXMatrixMultiply(&temp_matrix, &venus_translate, &venus_rotate); D3DXMatrixMultiply(&venus_matrix, &temp_matrix, &sun_matrix); D3DXMatrixMultiply(&world_view_proj_matrix, &venus_matrix, &view_proj_matrix); // 設定shader參數 g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); *pConstData = world_view_proj_matrix; g_pConstantBuffer->Unmap(); g_pDevice->IASetVertexBuffers(0, 1, &g_pMoonVertexBuffer, &stride, &offset); g_pDevice->DrawIndexed(g_iNumSphereIndices, 0, 0); // 地球 float earth_rotate_y = 2.0f * MATH_PI * (g_simulation_days / days_a_year); D3DXMATRIX earth_matrix, earth_rotate, earth_translate; D3DXMatrixRotationY(&earth_rotate, earth_rotate_y); D3DXMatrixTranslation(&earth_translate, earth_to_sun_distance, 0.0f, 0.0f); D3DXMatrixMultiply(&temp_matrix, &earth_translate, &earth_rotate); D3DXMatrixMultiply(&earth_matrix, &temp_matrix, &sun_matrix); D3DXMatrixMultiply(&world_view_proj_matrix, &earth_matrix, &view_proj_matrix); // 設定shader參數 g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); *pConstData = world_view_proj_matrix; g_pConstantBuffer->Unmap(); g_pDevice->IASetVertexBuffers(0, 1, &g_pEarthVertexBuffer, &stride, &offset); g_pDevice->DrawIndexed(g_iNumSphereIndices, 0, 0); // 月亮 float moon_rotate_y = 2.0f * MATH_PI * (g_simulation_days / days_a_month); D3DXMATRIX moon_matrix, moon_rotate, moon_translate; D3DXMatrixRotationY(&moon_rotate, moon_rotate_y); D3DXMatrixTranslation(&moon_translate, moon_to_earth_distance, 0.0f, 0.0f); D3DXMatrixMultiply(&temp_matrix, &moon_translate, &moon_rotate); D3DXMatrixMultiply(&moon_matrix, &temp_matrix, &earth_matrix); D3DXMatrixMultiply(&world_view_proj_matrix, &moon_matrix, &view_proj_matrix); // 設定shader參數 g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); *pConstData = world_view_proj_matrix; g_pConstantBuffer->Unmap(); g_pDevice->IASetVertexBuffers(0, 1, &g_pMoonVertexBuffer, &stride, &offset); g_pDevice->DrawIndexed(g_iNumSphereIndices, 0, 0); // 等待硬體掃結束, 然後才更新畫面 pSwapChain->Present(1, 0); }
void RenderFrameDX10(void) { Vector4 vColorDarkBlue(0.0f, 0.0f, 0.5f, 1.0f); Vector4 vColorBlue(0.0f, 0.0f, 0.8f, 1.0f); Vector4 vPlane(0.0f, 0.0f, 1.0f, -g_mirror_z); D3D10_VIEWPORT mainVP, VP; // 取得呼叫GutCreateGraphicsDeviceDX10時所產生的D3D10物件 ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); //frame buffer ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); //depth/stencil buffer IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); // front/back buffer // 在動態貼圖中畫出鏡射的茶壼 { UINT nViewports = 1; g_pDevice->RSGetViewports(&nViewports, &mainVP); // new rendertarget viewport size VP.TopLeftX = VP.TopLeftY = 0; VP.Width = VP.Height = 512; VP.MinDepth = 0.0f; VP.MaxDepth = 1.0f; ID3D10ShaderResourceView *null_views[4] = {NULL, NULL, NULL, NULL}; g_pDevice->PSSetShaderResources(0, 4, null_views); // 使用代表動態貼圖的RenderTarget g_pDevice->OMSetRenderTargets(1, &g_pRGBAView, g_pDepthStencilView); // g_pDevice->RSSetViewports(1, &VP); // 清除顏色 g_pDevice->ClearRenderTargetView(g_pRGBAView, (float *)&vColorDarkBlue); // 清除Depth/Stencil buffer g_pDevice->ClearDepthStencilView(g_pDepthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0); // 畫鏡射的茶壼 RenderModelDX10(true, &vPlane); } // 在主Framebuffer中畫出正常的茶壼 { // 使用主framebuffer g_pDevice->OMSetRenderTargets(1, &pRenderTargetView, pDepthStencilView); // g_pDevice->RSSetViewports(1, &mainVP); // 清除顏色 g_pDevice->ClearRenderTargetView(pRenderTargetView, (float *)&vColorBlue); // 清除Depth/Stencil buffer g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0); // 畫茶壼 RenderModelDX10(false, &vPlane); } // 在主framebuffer中畫出鏡面 { UINT stride = sizeof(Vertex_V); UINT offset = 0; // 設定vertex shader g_pDevice->VSSetShader(g_pVertexShader); // 設定pixel shader g_pDevice->PSSetShader(g_pPixelShader); // 設定Shader Constants g_pDevice->VSSetConstantBuffers(0, 1, &g_pVSConstBuffer); // 設定vertex資料格式 g_pDevice->IASetInputLayout(g_pVertexLayout); // 設定三角形頂點索引值資料排列是triangle strip g_pDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); // Vertex Buffer g_pDevice->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, &offset); // 計算texture matrix Matrix4x4 uv_offset_matrix; uv_offset_matrix.Scale_Replace(0.5f, -0.5f, 1.0f); uv_offset_matrix[3].Set(0.5f, 0.5f, 0.0f, 1.0f); Matrix4x4 texture_matrix = g_mirror_view_matrix * g_proj_matrix * uv_offset_matrix; // 計算矩陣 Matrix4x4 view_matrix = g_Control.GetViewMatrix(); Matrix4x4 wvp_matrix = view_matrix * g_proj_matrix; // 更新shader參數 Matrix4x4 *pConstData; g_pVSConstBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); pConstData[0] = wvp_matrix; pConstData[1] = texture_matrix; g_pVSConstBuffer->Unmap(); // 套用第1張貼圖 g_pDevice->PSSetShaderResources(0, 1, &g_pTextureView); // 畫出鏡面 g_pDevice->Draw(4, 0); } // 等待硬體掃結束, 然後才更新畫面 pSwapChain->Present(1, 0); }
void RenderFrameDX10(void) { Vector4 vClearColor(0.0f, 0.0f, 0.0f, 0.0f); float fDummy[4] = {0,0,0,0}; UINT stride = sizeof(Vertex_VT); UINT offset = 0; //frame buffer ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); //depth/stencil buffer ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); // front/back buffer chain IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); // 清除顏色 g_pDevice->ClearRenderTargetView(pRenderTargetView, (float *)&vClearColor); // 清除Depth/Stencil buffer g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0); // 設定vertex shader g_pDevice->VSSetShader(g_pVertexShader); // 設定pixel shader g_pDevice->PSSetShader(g_pPixelShader); // 設定vertex shader讀取參數的記憶體位罝 g_pDevice->VSSetConstantBuffers(0, 1, &g_pConstantBuffer); // 設定vertex資料格式 g_pDevice->IASetInputLayout(g_pVertexLayout); // 設定vertex buffer g_pDevice->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, &offset); // 設定三角形頂點索引值資料排列是triangle strip g_pDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); // 畫墻壁 { Matrix4x4 IdentityMatrix; IdentityMatrix.Identity(); // 更新shader參數 Matrix4x4 *pConstData; g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); *pConstData = IdentityMatrix; g_pConstantBuffer->Unmap(); // 把混色關閉 g_pDevice->OMSetBlendState(NULL, fDummy, 0xff); // 把墻壁所填充的像素 Stencil 值設定 1, 最後一個參數是 Stencil 參考值. g_pDevice->OMSetDepthStencilState(g_pStencilState_Replace, 1); // 套用貼圖 g_pDevice->PSSetShaderResources(0, 1, &g_pTexture0); // 畫出墻壁 g_pDevice->Draw(4, 0); } // 畫手電筒光源 { // 計算矩陣 //Matrix4x4 view_proj_matrix = g_view_matrix * g_proj_matrix; Matrix4x4 world_view_proj_matrix = g_world_matrix * g_view_matrix * g_proj_matrix; // 更新shader參數 Matrix4x4 *pConstData; g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); *pConstData = world_view_proj_matrix; g_pConstantBuffer->Unmap(); // 使用加色混色 g_pDevice->OMSetBlendState(g_pBlendState, fDummy, 0xff); // 把墻壁所填充的像素Stencil值設定1 if ( g_bStencil ) g_pDevice->OMSetDepthStencilState(g_pStencilState_Test, 1); else g_pDevice->OMSetDepthStencilState(NULL, 1); // 套用貼圖 g_pDevice->PSSetShaderResources(0, 1, &g_pTexture1); // 畫出光點 g_pDevice->Draw(4, 0); } // 等待硬體掃結束, 然後才更新畫面. pSwapChain->Present(1, 0); }
void RenderFrameDX10(void) { static int frameCount = 0; Vector4 vClearColor(0.0f, 0.0f, 0.0f, 0.0f); UINT stride = sizeof(Vertex_VC); UINT offset = 0; // 取得呼叫GutCreateGraphicsDeviceDX10時所產生的D3D10物件 ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); //frame buffer ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); //depth/stencil buffer IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); // front/back buffer // 清除顏色 g_pDevice->ClearRenderTargetView(pRenderTargetView, (float *)&vClearColor); // 清除Depth/Stencil buffer g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0); // 設定vertex shader g_pDevice->VSSetShader(g_pVertexShader); // 設定pixel shader g_pDevice->PSSetShader(g_pPixelShader); // 設定vertex shader讀取參數的記憶體位罝 g_pDevice->VSSetConstantBuffers(0, 1, &g_pConstantBuffer); // 設定vertex資料格式 g_pDevice->IASetInputLayout(g_pVertexLayout); // 設定index buffer g_pDevice->IASetIndexBuffer(g_pSphereIndexBuffer, DXGI_FORMAT_R16_UINT, 0); // 設定三角形頂點索引值資料排列是triangle strip g_pDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST); // 計算出一個可以轉換到鏡頭座標系的矩陣 Vector4 eye(0.0f, 0.0f, 15.0f); Matrix4x4 view_matrix = g_Control.GetViewMatrix(); Matrix4x4 world_matrix = g_Control.GetObjectMatrix(); Matrix4x4 view_proj_matrix = world_matrix * view_matrix * g_proj_matrix; Matrix4x4 world_view_proj_matrix; // sun world_view_proj_matrix = g_sun_matrix * view_proj_matrix; // 設定shader參數 Matrix4x4 *pConstData; g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); *pConstData = world_view_proj_matrix; g_pConstantBuffer->Unmap(); // g_pDevice->IASetVertexBuffers(0, 1, &g_pSunVertexBuffer, &stride, &offset); g_pDevice->DrawIndexed(g_iNumSphereIndices, 0, 0); int submit = frameCount % 0x01; int query = (frameCount+1) % 0x01; g_pOcclusionQuery[submit]->Begin(); // earth world_view_proj_matrix = g_earth_matrix * view_proj_matrix; // 設定shader參數 g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); *pConstData = world_view_proj_matrix; g_pConstantBuffer->Unmap(); // g_pDevice->IASetVertexBuffers(0, 1, &g_pEarthVertexBuffer, &stride, &offset); g_pDevice->DrawIndexed(g_iNumSphereIndices, 0, 0); g_pOcclusionQuery[submit]->End(); if ( frameCount ) { int num_loops = 0; UINT64 num_samples_passed = 0; // 去檢查前一個畫面的Occlusion Query結果 ID3D10Query *pQuery = g_pOcclusionQuery[query]; while( pQuery->GetData(&num_samples_passed, 8, D3DGETDATA_FLUSH)==S_FALSE ) { // 結果可能還沒出來, 要再查詢一次 num_loops++; } printf("Earth %s, queried %05d times\r", num_samples_passed ? "visible" : "disapper", num_loops); } // moon world_view_proj_matrix = g_moon_matrix * view_proj_matrix; // 設定shader參數 g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData ); *pConstData = world_view_proj_matrix; g_pConstantBuffer->Unmap(); // g_pDevice->IASetVertexBuffers(0, 1, &g_pMoonVertexBuffer, &stride, &offset); g_pDevice->DrawIndexed(g_iNumSphereIndices, 0, 0); // 等待硬體掃結束, 然後才更新畫面 pSwapChain->Present(1, 0); frameCount++; }