コード例 #1
0
ファイル: render_dx10.cpp プロジェクト: erickterri/3dlearn
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);
}
コード例 #2
0
ファイル: render_dx10.cpp プロジェクト: chenbk85/3dlearn
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);
}
コード例 #3
0
ファイル: render_dx10.cpp プロジェクト: as2120/ZNginx
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);
}
コード例 #4
0
ファイル: render_dx10.cpp プロジェクト: as2120/ZNginx
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);
}
コード例 #5
0
ファイル: render_dx10.cpp プロジェクト: chenbk85/3dlearn
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);
}
コード例 #6
0
ファイル: render_dx10.cpp プロジェクト: as2120/ZNginx
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);
}
コード例 #7
0
ファイル: render_dx10.cpp プロジェクト: erickterri/3dlearn
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);
}
コード例 #8
0
ファイル: render_dx10.cpp プロジェクト: as2120/ZNginx
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);
}
コード例 #9
0
ファイル: render_dx10.cpp プロジェクト: chenbk85/3dlearn
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);
}
コード例 #10
0
ファイル: render_dx10.cpp プロジェクト: as2120/ZNginx
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);
}
コード例 #11
0
ファイル: render_dx10.cpp プロジェクト: as2120/ZNginx
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);
}
コード例 #12
0
ファイル: render_dx10.cpp プロジェクト: chenbk85/3dlearn
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);
}
コード例 #13
0
ファイル: render_dx10.cpp プロジェクト: as2120/ZNginx
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);
}
コード例 #14
0
ファイル: render_dx10.cpp プロジェクト: as2120/ZNginx
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);
}
コード例 #15
0
ファイル: render_dx10.cpp プロジェクト: chenbk85/3dlearn
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);
}
コード例 #16
0
ファイル: render_dx10.cpp プロジェクト: chenbk85/3dlearn
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);
}
コード例 #17
0
ファイル: render_dx10.cpp プロジェクト: as2120/ZNginx
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);
}
コード例 #18
0
ファイル: render_dx10.cpp プロジェクト: as2120/ZNginx
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);
}
コード例 #19
0
ファイル: render_dx10.cpp プロジェクト: chenbk85/3dlearn
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);
}
コード例 #20
0
ファイル: render_dx10.cpp プロジェクト: chenbk85/3dlearn
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);
}
コード例 #21
0
ファイル: render_dx10.cpp プロジェクト: chenbk85/3dlearn
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);
}
コード例 #22
0
ファイル: render_dx10.cpp プロジェクト: chenbk85/3dlearn
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);
}
コード例 #23
0
ファイル: render_dx10.cpp プロジェクト: as2120/ZNginx
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++;
}