bool GutSetDefaultStatesDX10(void) { // sampler state / texture filter { D3D10_SAMPLER_DESC desc; GutSetDX10DefaultSamplerDesc(desc); desc.Filter = D3D10_FILTER_MIN_MAG_MIP_LINEAR; desc.AddressU = D3D10_TEXTURE_ADDRESS_WRAP; desc.AddressV = D3D10_TEXTURE_ADDRESS_WRAP; desc.AddressW = D3D10_TEXTURE_ADDRESS_WRAP; g_pd3dDevice->CreateSamplerState(&desc, &g_pSamplerState); for ( int i=0; i<4; i++ ) { g_pd3dDevice->PSSetSamplers(i, 1, &g_pSamplerState); } } // rasterizer state { D3D10_RASTERIZER_DESC desc; GutSetDX10DefaultRasterizerDesc(desc); desc.CullMode = D3D10_CULL_BACK; desc.FrontCounterClockwise = true; if ( D3D_OK != g_pd3dDevice->CreateRasterizerState(&desc, &g_pCull) ) return false; g_pd3dDevice->RSSetState(g_pCull); } return true; }
bool InitResourceDX10(void) { g_pDevice = GutGetGraphicsDeviceDX10(); ID3D10Blob *pVSCode = NULL; // 載入Vertex Shader g_pVertexShader = GutLoadVertexShaderDX10_HLSL("../../shaders/texture_alphatest_dx10.hlsl", "VS", "vs_4_0", &pVSCode); if ( NULL==g_pVertexShader ) return false; // 載入Pixel Shader g_pPixelShader = GutLoadPixelShaderDX10_HLSL("../../shaders/texture_alphatest_dx10.hlsl", "PS", "ps_4_0"); if ( NULL==g_pPixelShader ) return false; g_pTexture0 = GutLoadTexture_DX10("../../textures/brickwall_broken.tga"); g_pTexture1 = GutLoadTexture_DX10("../../textures/spotlight_effect.tga"); if ( g_pTexture0==NULL || g_pTexture1==NULL ) return false; // 設定Vertex資料格式 D3D10_INPUT_ELEMENT_DESC layout[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 }, { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0 } }; if ( D3D_OK != g_pDevice->CreateInputLayout( layout, sizeof(layout)/sizeof(D3D10_INPUT_ELEMENT_DESC), pVSCode->GetBufferPointer(), pVSCode->GetBufferSize(), &g_pVertexLayout ) ) return false; SAFE_RELEASE(pVSCode); D3D10_BUFFER_DESC cbDesc; // vertex buffer { cbDesc.ByteWidth = sizeof(Vertex_VT) * 4; cbDesc.Usage = D3D10_USAGE_DYNAMIC ; cbDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER; cbDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; cbDesc.MiscFlags = 0; D3D10_SUBRESOURCE_DATA subDesc; ZeroMemory(&subDesc, sizeof(subDesc)); subDesc.pSysMem = g_Quad; // 配置一塊可以存放Vertex的記憶體, 也就是Vertex Buffer. if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, &subDesc, &g_pVertexBuffer ) ) return false; } // 配置Shader參數的記憶體空間 { cbDesc.ByteWidth = sizeof(Matrix4x4); cbDesc.Usage = D3D10_USAGE_DYNAMIC; cbDesc.BindFlags = D3D10_BIND_CONSTANT_BUFFER; cbDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; cbDesc.MiscFlags = 0; if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, NULL, &g_pConstantBuffer ) ) return false; } // rasterizer state物件 { D3D10_RASTERIZER_DESC desc; GutSetDX10DefaultRasterizerDesc(desc); desc.CullMode = D3D10_CULL_NONE; desc.FrontCounterClockwise = true; if ( D3D_OK != g_pDevice->CreateRasterizerState(&desc, &g_pRasterizerState) ) return false; g_pDevice->RSSetState(g_pRasterizerState); } // depth stencil state { D3D10_DEPTH_STENCIL_DESC desc; GutSetDX10DefaultDepthStencilDesc(desc); desc.DepthEnable = FALSE; desc.DepthWriteMask = D3D10_DEPTH_WRITE_MASK_ZERO; desc.DepthFunc = D3D10_COMPARISON_ALWAYS; desc.StencilEnable = TRUE; desc.StencilReadMask = 0xff; desc.StencilWriteMask = 0xff; desc.FrontFace.StencilFailOp = D3D10_STENCIL_OP_KEEP; desc.FrontFace.StencilDepthFailOp = D3D10_STENCIL_OP_KEEP; desc.FrontFace.StencilPassOp = D3D10_STENCIL_OP_REPLACE; desc.FrontFace.StencilFunc = D3D10_COMPARISON_ALWAYS; desc.BackFace = desc.FrontFace; // 這個設定用來設定像素的stencil值 g_pDevice->CreateDepthStencilState(&desc, &g_pStencilState_Replace); desc.FrontFace.StencilFunc = D3D10_COMPARISON_EQUAL; desc.BackFace = desc.FrontFace; // 這個設定用來做stencil test測試 g_pDevice->CreateDepthStencilState(&desc, &g_pStencilState_Test); } // blend state { D3D10_BLEND_DESC desc; GutSetDX10DefaultBlendDesc(desc); desc.BlendEnable[0] = TRUE; desc.SrcBlend = D3D10_BLEND_ONE; desc.DestBlend = D3D10_BLEND_ONE; desc.BlendOp = D3D10_BLEND_OP_ADD; desc.SrcBlendAlpha = D3D10_BLEND_ONE; desc.DestBlendAlpha = D3D10_BLEND_ONE; desc.BlendOpAlpha = D3D10_BLEND_OP_ADD; g_pDevice->CreateBlendState(&desc, &g_pBlendState); } // sampler state / texture filter { D3D10_SAMPLER_DESC desc; GutSetDX10DefaultSamplerDesc(desc); desc.Filter = D3D10_FILTER_MIN_MAG_MIP_LINEAR; desc.AddressU = D3D10_TEXTURE_ADDRESS_WRAP; desc.AddressV = D3D10_TEXTURE_ADDRESS_WRAP; desc.AddressW = D3D10_TEXTURE_ADDRESS_WRAP; g_pDevice->CreateSamplerState(&desc, &g_pSamplerState); for ( int i=0; i<4; i++ ) { g_pDevice->PSSetSamplers(i, 1, &g_pSamplerState); } } // 計算投影矩陣 g_view_matrix = GutMatrixLookAtRH(g_eye, g_lookat, g_up); g_proj_matrix = GutMatrixOrthoRH_DirectX(g_fOrthoWidth, g_fOrthoHeight, 0.1f, 100.0f); return true; }