bool hook_dxgi(void) { pD3DCompile compile; ID3D10Blob *blob; HMODULE dxgi_module = get_system_module("dxgi.dll"); HRESULT hr; void *present_addr; void *resize_addr; if (!dxgi_module) { return false; } compile = get_compiler(); if (!compile) { hlog("hook_dxgi: failed to find d3d compiler library"); return true; } /* ---------------------- */ hr = compile(vertex_shader_string, sizeof(vertex_shader_string), "vertex_shader_string", nullptr, nullptr, "main", "vs_4_0", D3D10_SHADER_OPTIMIZATION_LEVEL1, 0, &blob, nullptr); if (FAILED(hr)) { hlog_hr("hook_dxgi: failed to compile vertex shader", hr); return true; } vertex_shader_size = (size_t)blob->GetBufferSize(); memcpy(vertex_shader_data, blob->GetBufferPointer(), blob->GetBufferSize()); blob->Release(); /* ---------------------- */ hr = compile(pixel_shader_string, sizeof(pixel_shader_string), "pixel_shader_string", nullptr, nullptr, "main", "ps_4_0", D3D10_SHADER_OPTIMIZATION_LEVEL1, 0, &blob, nullptr); if (FAILED(hr)) { hlog_hr("hook_dxgi: failed to compile pixel shader", hr); return true; } pixel_shader_size = (size_t)blob->GetBufferSize(); memcpy(pixel_shader_data, blob->GetBufferPointer(), blob->GetBufferSize()); blob->Release(); /* ---------------------- */ present_addr = get_offset_addr(dxgi_module, global_hook_info->offsets.dxgi.present); resize_addr = get_offset_addr(dxgi_module, global_hook_info->offsets.dxgi.resize); hook_init(&present, present_addr, (void*)hook_present, "IDXGISwapChain::Present"); hook_init(&resize_buffers, resize_addr, (void*)hook_resize_buffers, "IDXGISwapChain::ResizeBuffers"); rehook(&resize_buffers); rehook(&present); hlog("Hooked DXGI"); return true; }
bool CLightShader::InitializeShader(ID3D11Device* device, HWND hwnd, char* vsFilename, char* psFilename) { HRESULT result; ID3D10Blob* errorMessage; ID3D10Blob* vertexShaderBuffer; ID3D10Blob* pixelShaderBuffer; D3D11_INPUT_ELEMENT_DESC polygonLayout[3]; unsigned int numElements; D3D11_SAMPLER_DESC samplerDesc; D3D11_BUFFER_DESC matrixBufferDesc; D3D11_BUFFER_DESC cameraBufferDesc; D3D11_BUFFER_DESC lightBufferDesc; // Initialize the pointers errorMessage = 0; vertexShaderBuffer = 0; pixelShaderBuffer = 0; // Compile the vertex shader result = D3DX11CompileFromFile(vsFilename, NULL, NULL, "LightVertexShader", "vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &vertexShaderBuffer, &errorMessage, NULL); if (FAILED(result)) { if (errorMessage) OutputShaderErrorMessage(errorMessage, hwnd, vsFilename); else CLog::Write("CLightShader::InitializeShader() : could not compile the vertex shader"); return false; } // Compile the pixel shader result = D3DX11CompileFromFile(psFilename, NULL, NULL, "LightPixelShader", "ps_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &pixelShaderBuffer, &errorMessage, NULL); if (FAILED(result)) { if (errorMessage) OutputShaderErrorMessage(errorMessage, hwnd, psFilename); else CLog::Write("CLightShader::InitializeShader() : could not compile the pixel shader"); return false; } result = device->CreateVertexShader(vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), NULL, &vertexShader); if (FAILED(result)) { CLog::Write("CLightShader::InitializeShader() : could not create the vertex shader"); return false; } result = device->CreatePixelShader(pixelShaderBuffer->GetBufferPointer(), pixelShaderBuffer->GetBufferSize(), NULL, &pixelShader); if (FAILED(result)) { CLog::Write("CLightShader::InitializeShader() : could not create the pixel shader"); return false; } polygonLayout[0].SemanticName = "POSITION"; polygonLayout[0].SemanticIndex = 0; polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[0].InputSlot = 0; polygonLayout[0].AlignedByteOffset = 0; polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[0].InstanceDataStepRate = 0; polygonLayout[1].SemanticName = "TEXCOORD"; polygonLayout[1].SemanticIndex = 0; polygonLayout[1].Format = DXGI_FORMAT_R32G32_FLOAT; polygonLayout[1].InputSlot = 0; polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[1].InstanceDataStepRate = 0; polygonLayout[2].SemanticName = "NORMAL"; polygonLayout[2].SemanticIndex = 0; polygonLayout[2].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[2].InputSlot = 0; polygonLayout[2].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; polygonLayout[2].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[2].InstanceDataStepRate = 0; // Get the number of elements in the layout numElements = sizeof(polygonLayout) / sizeof(polygonLayout[0]); // Create the vertex input layout result = device->CreateInputLayout(polygonLayout, numElements, vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), &layout); if (FAILED(result)) { CLog::Write("CLightShader::InitializeShader() : could not create the input layout"); return false; } vertexShaderBuffer->Release(); vertexShaderBuffer = 0; pixelShaderBuffer->Release(); pixelShaderBuffer = 0; // Create a texture sampler description samplerDesc.Filter = Settings::TextureFilter; samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.MipLODBias = 0.0f; samplerDesc.MaxAnisotropy = 1; samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; samplerDesc.BorderColor[0] = 0; samplerDesc.BorderColor[1] = 0; samplerDesc.BorderColor[2] = 0; samplerDesc.BorderColor[3] = 0; samplerDesc.MinLOD = 0; samplerDesc.MaxLOD = D3D11_FLOAT32_MAX; result = device->CreateSamplerState(&samplerDesc, &sampleState); if (FAILED(result)) { CLog::Write("CLightShader::InitializeShader() : could not create the sampler state"); return false; } matrixBufferDesc.Usage = D3D11_USAGE_DYNAMIC; matrixBufferDesc.ByteWidth = sizeof(MatrixBufferType); matrixBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; matrixBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; matrixBufferDesc.MiscFlags = 0; matrixBufferDesc.StructureByteStride = 0; result = device->CreateBuffer(&matrixBufferDesc, NULL, &matrixBuffer); if (FAILED(result)) { CLog::Write("CLightShader::InitializeShader() : could not create the matrix buffer"); return false; } // Setup the camera buffer description cameraBufferDesc.Usage = D3D11_USAGE_DYNAMIC; cameraBufferDesc.ByteWidth = sizeof(CameraBufferType); cameraBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; cameraBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; cameraBufferDesc.MiscFlags = 0; cameraBufferDesc.StructureByteStride = 0; result = device->CreateBuffer(&cameraBufferDesc, NULL, &cameraBuffer); if (FAILED(result)) { CLog::Write("CLightShader::InitializeShader() : could not create the matrix buffer"); return false; } // Setup the description of the light dynamic buffer in the pixel shader (what the f**k does that even mean) // ByteWidth needs to be a multiple of 16. If not, CreateBuffer will fail lightBufferDesc.Usage = D3D11_USAGE_DYNAMIC; lightBufferDesc.ByteWidth = sizeof(LightBufferType); lightBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; lightBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; lightBufferDesc.MiscFlags = 0; lightBufferDesc.StructureByteStride = 0; result = device->CreateBuffer(&lightBufferDesc, NULL, &lightBuffer); if (FAILED(result)) { CLog::Write("CLightShader::InitializeShader() : could not create the light buffer"); return false; } return true; }
bool TextureShaderClass::InitializeShader(ID3D11Device* device, HWND hwnd, WCHAR* vsFilename, WCHAR* psFilename){ HRESULT hr; ID3D10Blob* errorMessage; ID3D10Blob* vertexShaderBuffer; ID3D10Blob* pixelShaderBuffer; D3D11_INPUT_ELEMENT_DESC polygonLayout[2]; unsigned int numElements; D3D11_BUFFER_DESC matrixBufferDesc; D3D11_SAMPLER_DESC samplerDesc; D3D11_BUFFER_DESC transparentBufferDesc; errorMessage = 0; vertexShaderBuffer = 0; pixelShaderBuffer = 0; hr = D3DCompileFromFile(vsFilename, NULL, NULL, "TextureVertexShader", "vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, &vertexShaderBuffer, &errorMessage); if (FAILED(hr)){ if (errorMessage){ OutputShaderErrorMessage(errorMessage, hwnd, vsFilename); } else{ MessageBox(hwnd, vsFilename, L"Missing Shader File", MB_OK); } return false; } hr = D3DCompileFromFile(psFilename, NULL, NULL, "TexturePixelShader", "ps_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, &pixelShaderBuffer, &errorMessage); if (FAILED(hr)){ if (errorMessage){ OutputShaderErrorMessage(errorMessage, hwnd, psFilename); } else{ MessageBox(hwnd, psFilename, L"Missing Shader File", MB_OK); } return false; } hr = device->CreateVertexShader(vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), NULL, &m_vertexShader); if (FAILED(hr)){ OutputErrorMessage(hwnd, hr, L"Could not create vertex shader with error: "); return false; } hr = device->CreatePixelShader(pixelShaderBuffer->GetBufferPointer(), pixelShaderBuffer->GetBufferSize(), NULL, &m_pixelShader); if (FAILED(hr)){ OutputErrorMessage(hwnd, hr, L"Could not create pixel shader with error: "); return false; } polygonLayout[0].SemanticName = "POSITION"; polygonLayout[0].SemanticIndex = 0; polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[0].InputSlot = 0; polygonLayout[0].AlignedByteOffset = 0; polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[0].InstanceDataStepRate = 0; polygonLayout[1].SemanticName = "TEXCOORD"; polygonLayout[1].SemanticIndex = 0; polygonLayout[1].Format = DXGI_FORMAT_R32G32_FLOAT; polygonLayout[1].InputSlot = 0; polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[1].InstanceDataStepRate = 0; numElements = sizeof(polygonLayout) / sizeof(polygonLayout[0]); hr = device->CreateInputLayout(polygonLayout, numElements, vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), &m_layout); if (FAILED(hr)){ OutputErrorMessage(hwnd, hr, L"Could not create input layout with error: "); return false; } vertexShaderBuffer->Release(); vertexShaderBuffer = 0; pixelShaderBuffer->Release(); pixelShaderBuffer = 0; ZeroMemory(&matrixBufferDesc, sizeof(matrixBufferDesc)); matrixBufferDesc.Usage = D3D11_USAGE_DYNAMIC; matrixBufferDesc.ByteWidth = sizeof(MatrixBufferType); matrixBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; matrixBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; matrixBufferDesc.MiscFlags = 0; matrixBufferDesc.StructureByteStride = 0; hr = device->CreateBuffer(&matrixBufferDesc, NULL, &m_matrixBuffer); if (FAILED(hr)){ OutputErrorMessage(hwnd, hr, L"Could not create matrix buffer with error: "); return false; } ZeroMemory(&transparentBufferDesc, sizeof(transparentBufferDesc)); transparentBufferDesc.Usage = D3D11_USAGE_DYNAMIC; transparentBufferDesc.ByteWidth = sizeof(PixelShaderBufferType); transparentBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; transparentBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; transparentBufferDesc.MiscFlags = 0; transparentBufferDesc.StructureByteStride = 0; hr = device->CreateBuffer(&transparentBufferDesc, NULL, &m_pixelShaderCBuffer); if (FAILED(hr)){ OutputErrorMessage(hwnd, hr, L"Could not create transparent buffer with error: "); return false; } ZeroMemory(&samplerDesc, sizeof(samplerDesc)); samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT; samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.MipLODBias = 0.0f; samplerDesc.MaxAnisotropy = 1; samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; samplerDesc.BorderColor[0] = 0; samplerDesc.BorderColor[1] = 1; samplerDesc.BorderColor[2] = 2; samplerDesc.BorderColor[3] = 3; samplerDesc.MinLOD = 0; samplerDesc.MaxLOD = D3D11_FLOAT32_MAX; hr = device->CreateSamplerState(&samplerDesc, &m_sampleState); if (FAILED(hr)){ OutputErrorMessage(hwnd, hr, L"Could not create sampler state with error: "); return false; } return true; }
bool FontShader::InitializeShader(ID3D11Device* device, HWND hwnd, WCHAR* vsFileName, WCHAR* psFileName) { HRESULT result; //Declare and initialize the pointers this function will use to null ID3D10Blob* errorMessage = nullptr; ID3D10Blob* vertexShaderBuffer = nullptr; ID3D10Blob* pixelShaderBuffer = nullptr; //Compile the vertex shader code result = D3DX11CompileFromFile(vsFileName, nullptr, nullptr, "main", "vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, nullptr, &vertexShaderBuffer, &errorMessage, nullptr); if (FAILED(result)) { if (errorMessage) { FontShader::OutputShaderErrorMessage(errorMessage, hwnd, vsFileName); } else { MessageBox(hwnd, vsFileName, L"Missing Shader File", MB_OK); } return false; } //Compile the pixel shader code result = D3DX11CompileFromFile(psFileName, nullptr, nullptr, "main", "ps_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, nullptr, &pixelShaderBuffer, &errorMessage, nullptr); if (FAILED(result)) { if (errorMessage) { FontShader::OutputShaderErrorMessage(errorMessage, hwnd, psFileName); } else { MessageBox(hwnd, psFileName, L"Missing Shader File", MB_OK); } return false; } //Create the vertex shader from the buffer result = device->CreateVertexShader(vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), nullptr, &this->m_vertexShader); if (FAILED(result)) { return false; } //Create the pixel shader from the buffer result = device->CreatePixelShader(pixelShaderBuffer->GetBufferPointer(), pixelShaderBuffer->GetBufferSize(), nullptr, &this->m_pixelShader); if (FAILED(result)) { return false; } //Create the vertex input layout description D3D11_INPUT_ELEMENT_DESC polygonLayout[2]; ZeroMemory(&polygonLayout, sizeof(D3D11_INPUT_ELEMENT_DESC) * 2); polygonLayout[0].AlignedByteOffset = 0; polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[0].InputSlot = 0; polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[0].InstanceDataStepRate = 0; polygonLayout[0].SemanticIndex = 0; polygonLayout[0].SemanticName = "POSITION"; polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; polygonLayout[1].Format = DXGI_FORMAT_R32G32_FLOAT; polygonLayout[1].InputSlot = 0; polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[1].InstanceDataStepRate = 0; polygonLayout[1].SemanticIndex = 0; polygonLayout[1].SemanticName = "TEXCOORD"; //Get a count of the element in the layout UINT numElements = sizeof(polygonLayout) / sizeof(D3D11_INPUT_ELEMENT_DESC); //Create the vertex input layout result = device->CreateInputLayout(polygonLayout, numElements, vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), &this->m_inputLayout); if (FAILED(result)) { return false; } //Release the vertex shader buffer and pixel shader buffer since they are no longer needed. vertexShaderBuffer->Release(); vertexShaderBuffer = nullptr; pixelShaderBuffer->Release(); pixelShaderBuffer = nullptr; //Setup the description of the dynamic constant buffer that is in the vertex shader D3D11_BUFFER_DESC constantBufferDesc; ZeroMemory(&constantBufferDesc, sizeof(D3D11_BUFFER_DESC)); constantBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; constantBufferDesc.ByteWidth = sizeof(ConstantBufferType); constantBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; constantBufferDesc.MiscFlags = 0; constantBufferDesc.StructureByteStride = 0; constantBufferDesc.Usage = D3D11_USAGE_DYNAMIC; //Create the constant buffer pointer so we can access the vertex shader constants buffer from within this class result = device->CreateBuffer(&constantBufferDesc, nullptr, &this->m_constantBuffer); if (FAILED(result)) { return false; } //Create a texture sampler state description D3D11_SAMPLER_DESC samplerDesc; ZeroMemory(&samplerDesc, sizeof(D3D11_SAMPLER_DESC)); samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.BorderColor[0] = 0.0f; samplerDesc.BorderColor[1] = 0.0f; samplerDesc.BorderColor[2] = 0.0f; samplerDesc.BorderColor[3] = 0.0f; samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; samplerDesc.MaxAnisotropy = 1; samplerDesc.MaxLOD = D3D11_FLOAT32_MAX; samplerDesc.MinLOD = 0.0f; samplerDesc.MipLODBias = 0.0f; //Create the texture sampler result = device->CreateSamplerState(&samplerDesc, &this->m_samplerState); if (FAILED(result)) { return false; } //Setup the description pixel constant buffer that is in the pixel shader D3D11_BUFFER_DESC pixelBufferDesc; ZeroMemory(&pixelBufferDesc, sizeof(D3D11_BUFFER_DESC)); pixelBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; pixelBufferDesc.ByteWidth = sizeof(PixelBufferType); pixelBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; pixelBufferDesc.MiscFlags = 0; pixelBufferDesc.StructureByteStride = 0; pixelBufferDesc.Usage = D3D11_USAGE_DYNAMIC; //Create the pixel constant buffer pointer so we can access the pixel shader constant buffer from whiting this class result = device->CreateBuffer(&pixelBufferDesc, nullptr, &this->m_pixelBuffer); if (FAILED(result)) { return false; } return true; }
//----------------------------------------------------------------------------// Direct3D10Renderer::Direct3D10Renderer(ID3D10Device* device) : d_device(device), d_displaySize(getViewportSize()), d_displayDPI(96, 96), d_defaultTarget(0), d_effect(0), d_normalClippedTechnique(0), d_normalUnclippedTechnique(0), d_premultipliedClippedTechnique(0), d_premultipliedUnclippedTechnique(0), d_inputLayout(0), d_boundTextureVariable(0), d_worldMatrixVariable(0), d_projectionMatrixVariable(0) { // create the main effect from the shader source. ID3D10Blob* errors = 0; if (FAILED(D3DX10CreateEffectFromMemory(shaderSource, sizeof(shaderSource), 0, 0, 0, "fx_4_0", 0, 0, d_device, 0, 0, &d_effect, &errors, 0))) { std::string msg(static_cast<const char*>(errors->GetBufferPointer()), errors->GetBufferSize()); errors->Release(); CEGUI_THROW(RendererException(msg)); } // extract the rendering techniques d_normalClippedTechnique = d_effect->GetTechniqueByName("BM_NORMAL_Clipped_Rendering"); d_normalUnclippedTechnique = d_effect->GetTechniqueByName("BM_NORMAL_Unclipped_Rendering"); d_premultipliedClippedTechnique = d_effect->GetTechniqueByName("BM_RTT_PREMULTIPLIED_Clipped_Rendering"); d_premultipliedClippedTechnique = d_effect->GetTechniqueByName("BM_RTT_PREMULTIPLIED_Unclipped_Rendering"); // Get the variables from the shader we need to be able to access d_boundTextureVariable = d_effect->GetVariableByName("BoundTexture")->AsShaderResource(); d_worldMatrixVariable = d_effect->GetVariableByName("WorldMatrix")->AsMatrix(); d_projectionMatrixVariable = d_effect->GetVariableByName("ProjectionMatrix")->AsMatrix(); // Create the input layout const D3D10_INPUT_ELEMENT_DESC vertex_layout[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 }, { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0 }, { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 16, D3D10_INPUT_PER_VERTEX_DATA, 0 }, }; const UINT element_count = sizeof(vertex_layout) / sizeof(vertex_layout[0]); D3D10_PASS_DESC pass_desc; if (FAILED(d_normalClippedTechnique->GetPassByIndex(0)->GetDesc(&pass_desc))) CEGUI_THROW(RendererException( "failed to obtain technique description for pass 0.")); if (FAILED(d_device->CreateInputLayout(vertex_layout, element_count, pass_desc.pIAInputSignature, pass_desc.IAInputSignatureSize, &d_inputLayout))) { CEGUI_THROW(RendererException("failed to create D3D 10 input layout.")); } d_defaultTarget = new Direct3D10ViewportTarget(*this); }
bool LineShader::InitializeShader(ID3D11Device *pDevice, HWND hwnd, WCHAR *vsFilename, WCHAR *psFilename) { HRESULT result; ID3D10Blob *errorMessage; ID3D10Blob *vertexShaderBuffer; ID3D10Blob *pixelShaderBuffer; D3D11_INPUT_ELEMENT_DESC polygonLayout[1]; unsigned int numElements; D3D11_BUFFER_DESC matrixBufferDesc; errorMessage = 0; vertexShaderBuffer = 0; pixelShaderBuffer = 0; // Compile the vertex shader code. result = D3DCompileFromFile(vsFilename, NULL, NULL, "Main", "vs_5_0", NULL, NULL, &vertexShaderBuffer, &errorMessage); if (FAILED(result)) { // If the shader failed to compile show the error message. if (errorMessage) { OutputShaderErrorMessage(errorMessage, hwnd, vsFilename); } // If there was nothing in the error message then the file could not be found. else { MessageBox(hwnd, vsFilename, L"Missing shader file", MB_OK); } return false; } // Compile the pixel shader code. result = D3DCompileFromFile(psFilename, NULL, NULL, "Main", "ps_5_0", NULL, NULL, &pixelShaderBuffer, &errorMessage); if (FAILED(result)) { // If the shader failed to compile show error message. if (errorMessage) { OutputShaderErrorMessage(errorMessage, hwnd, psFilename); } // If there was nothing in the error message then the file could not be found. else { MessageBox(hwnd, psFilename, L"Missing Shader File", MB_OK); } return false; } result = pDevice->CreateVertexShader(vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), NULL, &m_pVertexShader); if (FAILED(result)) { return false; } result = pDevice->CreatePixelShader(pixelShaderBuffer->GetBufferPointer(), pixelShaderBuffer->GetBufferSize(), NULL, &m_pPixelShader); if (FAILED(result)) { return false; } // Setup the layout of shader data. polygonLayout[0].SemanticName = "POSITION"; polygonLayout[0].SemanticIndex = 0; polygonLayout[0].Format = DXGI_FORMAT_R32G32B32A32_FLOAT; polygonLayout[0].InputSlot = 0; polygonLayout[0].AlignedByteOffset = 0; polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[0].InstanceDataStepRate = 0; numElements = sizeof(polygonLayout) / sizeof(polygonLayout[0]); result = pDevice->CreateInputLayout(polygonLayout, numElements, vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), &m_pLayout); if (FAILED(result)) { return false; } vertexShaderBuffer->Release(); vertexShaderBuffer = 0; pixelShaderBuffer->Release(); pixelShaderBuffer = 0; // Description of the dynamic matrix constant buffer. matrixBufferDesc.Usage = D3D11_USAGE_DYNAMIC; matrixBufferDesc.ByteWidth = sizeof(MatrixBufferType); matrixBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; matrixBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; matrixBufferDesc.MiscFlags = 0; matrixBufferDesc.StructureByteStride = 0; result = pDevice->CreateBuffer(&matrixBufferDesc, NULL, &m_pMatrixBuffer); if (FAILED(result)) { return false; } return true; }
bool FontShaderClass::InitializeShader(ID3D11Device* device, HWND hwnd, const WCHAR* vsFilename, const WCHAR* psFilename) { HRESULT result; ID3D10Blob* errorMessage = nullptr; // 버텍스 쉐이더 코드를 컴파일한다. ID3D10Blob* vertexShaderBuffer = nullptr; result = D3DCompileFromFile(vsFilename, NULL, NULL, "FontVertexShader", "vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, &vertexShaderBuffer, &errorMessage); if (FAILED(result)) { // 셰이더 컴파일 실패시 오류메시지를 출력합니다. if (errorMessage) { OutputShaderErrorMessage(errorMessage, hwnd, vsFilename); } // 컴파일 오류가 아니라면 셰이더 파일을 찾을 수 없는 경우입니다. else { MessageBox(hwnd, vsFilename, L"Missing Shader File", MB_OK); } return false; } // 픽셀 쉐이더 코드를 컴파일한다. ID3D10Blob* pixelShaderBuffer = nullptr; result = D3DCompileFromFile(psFilename, NULL, NULL, "FontPixelShader", "ps_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, &pixelShaderBuffer, &errorMessage); if (FAILED(result)) { // 셰이더 컴파일 실패시 오류메시지를 출력합니다. if (errorMessage) { OutputShaderErrorMessage(errorMessage, hwnd, psFilename); } // 컴파일 오류가 아니라면 셰이더 파일을 찾을 수 없는 경우입니다. else { MessageBox(hwnd, psFilename, L"Missing Shader File", MB_OK); } return false; } // 버퍼로부터 정점 셰이더를 생성한다. result = device->CreateVertexShader(vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), NULL, &m_vertexShader); if (FAILED(result)) { return false; } // 버퍼에서 픽셀 쉐이더를 생성합니다. result = device->CreatePixelShader(pixelShaderBuffer->GetBufferPointer(), pixelShaderBuffer->GetBufferSize(), NULL, &m_pixelShader); if (FAILED(result)) { return false; } // 정점 입력 레이아웃 구조체를 설정합니다. // 이 설정은 ModelClass와 셰이더의 VertexType 구조와 일치해야합니다. D3D11_INPUT_ELEMENT_DESC polygonLayout[2]; polygonLayout[0].SemanticName = "POSITION"; polygonLayout[0].SemanticIndex = 0; polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[0].InputSlot = 0; polygonLayout[0].AlignedByteOffset = 0; polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[0].InstanceDataStepRate = 0; polygonLayout[1].SemanticName = "TEXCOORD"; polygonLayout[1].SemanticIndex = 0; polygonLayout[1].Format = DXGI_FORMAT_R32G32_FLOAT; polygonLayout[1].InputSlot = 0; polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[1].InstanceDataStepRate = 0; // 레이아웃의 요소 수를 가져옵니다. UINT numElements = sizeof(polygonLayout) / sizeof(polygonLayout[0]); // 정점 입력 레이아웃을 만듭니다. result = device->CreateInputLayout(polygonLayout, numElements, vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), &m_layout); if (FAILED(result)) { return false; } // 더 이상 사용되지 않는 정점 셰이더 퍼버와 픽셀 셰이더 버퍼를 해제합니다. vertexShaderBuffer->Release(); vertexShaderBuffer = 0; pixelShaderBuffer->Release(); pixelShaderBuffer = 0; // 정점 셰이더에 있는 행렬 상수 버퍼의 구조체를 작성합니다. D3D11_BUFFER_DESC constantBufferDesc; constantBufferDesc.Usage = D3D11_USAGE_DYNAMIC; constantBufferDesc.ByteWidth = sizeof(ConstantBufferType); constantBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; constantBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; constantBufferDesc.MiscFlags = 0; constantBufferDesc.StructureByteStride = 0; // 상수 버퍼 포인터를 만들어 이 클래스에서 정점 셰이더 상수 버퍼에 접근할 수 있게 합니다. result = device->CreateBuffer(&constantBufferDesc, NULL, &m_constantBuffer); if (FAILED(result)) { return false; } // 텍스처 샘플러 상태 구조체를 생성 및 설정합니다. D3D11_SAMPLER_DESC samplerDesc; samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.MipLODBias = 0.0f; samplerDesc.MaxAnisotropy = 1; samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; samplerDesc.BorderColor[0] = 0; samplerDesc.BorderColor[1] = 0; samplerDesc.BorderColor[2] = 0; samplerDesc.BorderColor[3] = 0; samplerDesc.MinLOD = 0; samplerDesc.MaxLOD = D3D11_FLOAT32_MAX; // 텍스처 샘플러 상태를 만듭니다. result = device->CreateSamplerState(&samplerDesc, &m_sampleState); if (FAILED(result)) { return false; } // Setup the description of the dynamic pixel constant buffer that is in the pixel shader. D3D11_BUFFER_DESC pixelBufferDesc; pixelBufferDesc.Usage = D3D11_USAGE_DYNAMIC; pixelBufferDesc.ByteWidth = sizeof(PixelBufferType); pixelBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; pixelBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; pixelBufferDesc.MiscFlags = 0; pixelBufferDesc.StructureByteStride = 0; // Create the pixel constant buffer pointer so we can access the pixel shader constant buffer from within this class. result = device->CreateBuffer(&pixelBufferDesc, NULL, &m_pixelBuffer); if (FAILED(result)) { return false; } return true; }
RenderQuard::RenderQuard() { if (FbxFilePath == NULL || ShaderFilePath == NULL) { return; } mName = FbxFilePath; //create vertex buffer meshData.Clear(); //load fbx FBXExporter fbxloader; fbxloader.Initialize(); fbxloader.LoadModelInfo(FbxFilePath, meshData); D3D11_BUFFER_DESC vbd; vbd.Usage = D3D11_USAGE_IMMUTABLE; vbd.ByteWidth = sizeof(BaseCommonVertex) * meshData.vertices.size(); vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER; vbd.CPUAccessFlags = 0; vbd.MiscFlags = 0; vbd.StructureByteStride = 0; D3D11_SUBRESOURCE_DATA vinitData; vinitData.pSysMem = &meshData.vertices[0]; Device::Instance().GetDevice()->CreateBuffer(&vbd, &vinitData, &mVertexBuffer); //create index buffer D3D11_BUFFER_DESC ibd; ibd.Usage = D3D11_USAGE_IMMUTABLE; ibd.ByteWidth = sizeof(UINT) * meshData.indices.size(); ibd.BindFlags = D3D11_BIND_INDEX_BUFFER; ibd.CPUAccessFlags = 0; ibd.MiscFlags = 0; ibd.StructureByteStride = 0; D3D11_SUBRESOURCE_DATA iinitData; iinitData.pSysMem = &meshData.indices[0]; HRESULT a = Device::Instance().GetDevice()->CreateBuffer(&ibd, &iinitData, &mIndexBuffer); //create const buffer vs D3D11_BUFFER_DESC matrixBufferDescVS; ZeroMemory(&matrixBufferDescVS, sizeof(matrixBufferDescVS)); matrixBufferDescVS.Usage = D3D11_USAGE_DEFAULT; //这个应该改成dynamic? matrixBufferDescVS.ByteWidth = sizeof(CBufferVertex1); matrixBufferDescVS.BindFlags = D3D11_BIND_CONSTANT_BUFFER; matrixBufferDescVS.CPUAccessFlags = 0; Device::Instance().GetDevice()->CreateBuffer(&matrixBufferDescVS, NULL, &mCBMatrixBufferVS); //create const buffer D3D11_BUFFER_DESC matrixBufferDescPS; ZeroMemory(&matrixBufferDescPS, sizeof(matrixBufferDescPS)); matrixBufferDescPS.Usage = D3D11_USAGE_DEFAULT; //这个应该改成dynamic? matrixBufferDescPS.ByteWidth = sizeof(CBufferPixel1); matrixBufferDescPS.BindFlags = D3D11_BIND_CONSTANT_BUFFER; matrixBufferDescPS.CPUAccessFlags = 0; Device::Instance().GetDevice()->CreateBuffer(&matrixBufferDescPS, NULL, &mCBMatrixBufferPS); //compile and create shader HRESULT result; ID3D10Blob* errorMessage = NULL; ID3D10Blob* VertexShaderBuffer = NULL; ID3D10Blob* PixelShaderBuffer = NULL; D3D10_SHADER_MACRO* Macros; if (bUseIBL) { D3D10_SHADER_MACRO Shader_Macros[] = { "_IBL", "0",NULL,NULL }; Macros = Shader_Macros; } else { D3D10_SHADER_MACRO Shader_Macros[] = { NULL,NULL }; Macros = Shader_Macros; } //D3D10_SHADER_MACRO Shader_Macros[] = {NULL,NULL }; result = D3DX11CompileFromFile(ShaderFilePath, Macros, NULL, "VS", "vs_5_0", D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION, 0, NULL, &VertexShaderBuffer, &errorMessage, NULL); if (FAILED(result)) { // 获取指向错误信息文本的指针 char* compileErrors = (char*)(errorMessage->GetBufferPointer()); // 获取错误信息文本的长度 int bufferSize = errorMessage->GetBufferSize(); std::ofstream fout; // 创建一个txt,用于写入错误信息 fout.open("shader-error.txt"); //想txt文件写入错误信息 for (int i = 0; i < bufferSize; i++) { fout << compileErrors[i]; } // 关闭文件 fout.close(); } Device::Instance().GetDevice()->CreateVertexShader(VertexShaderBuffer->GetBufferPointer(), VertexShaderBuffer->GetBufferSize(), NULL, &mVertexShader); result = D3DX11CompileFromFile(ShaderFilePath, Macros, NULL, "PS", "ps_5_0", D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION, 0, NULL, &PixelShaderBuffer, &errorMessage, NULL); if (FAILED(result)) { // 获取指向错误信息文本的指针 char* compileErrors = (char*)(errorMessage->GetBufferPointer()); // 获取错误信息文本的长度 int bufferSize = errorMessage->GetBufferSize(); std::ofstream fout; // 创建一个txt,用于写入错误信息 fout.open("shader-error.txt"); //想txt文件写入错误信息 for (int i = 0; i < bufferSize; i++) { fout << compileErrors[i]; } // 关闭文件 fout.close(); } Device::Instance().GetDevice()->CreatePixelShader(PixelShaderBuffer->GetBufferPointer(), PixelShaderBuffer->GetBufferSize(), NULL, &mPixelShader); result = D3DX11CompileFromFile(L"Resource/Shader/Common.hlsl", Macros, NULL, "GBufferPS", "ps_5_0", D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION, 0, NULL, &PixelShaderBuffer, &errorMessage, NULL); if (FAILED(result)) { // 获取指向错误信息文本的指针 char* compileErrors = (char*)(errorMessage->GetBufferPointer()); // 获取错误信息文本的长度 int bufferSize = errorMessage->GetBufferSize(); std::ofstream fout; // 创建一个txt,用于写入错误信息 fout.open("shader-error.txt"); //想txt文件写入错误信息 for (int i = 0; i < bufferSize; i++) { fout << compileErrors[i]; } // 关闭文件 fout.close(); } Device::Instance().GetDevice()->CreatePixelShader(PixelShaderBuffer->GetBufferPointer(), PixelShaderBuffer->GetBufferSize(), NULL, &mGBufferPixelShader); //create input layout D3D11_INPUT_ELEMENT_DESC vertexInputLayout[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "NORMAL",0,DXGI_FORMAT_R32G32B32_FLOAT,0,12,D3D11_INPUT_PER_VERTEX_DATA,0 }, { "TANGENT",0,DXGI_FORMAT_R32G32B32_FLOAT,0,24,D3D11_INPUT_PER_VERTEX_DATA,0 }, { "BINORMAL",0,DXGI_FORMAT_R32G32B32_FLOAT,0,36,D3D11_INPUT_PER_VERTEX_DATA,0 }, { "TEXCOORD",0,DXGI_FORMAT_R32G32_FLOAT,0,48,D3D11_INPUT_PER_VERTEX_DATA,0 }, }; unsigned int numElements = sizeof(vertexInputLayout) / sizeof(vertexInputLayout[0]); result = Device::Instance().GetDevice()->CreateInputLayout(vertexInputLayout, numElements, VertexShaderBuffer->GetBufferPointer(), VertexShaderBuffer->GetBufferSize(), &mInputLayout); VertexShaderBuffer->Release(); VertexShaderBuffer = NULL; PixelShaderBuffer->Release(); PixelShaderBuffer = NULL; //create sampler state D3D11_SAMPLER_DESC samplerDesc; samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.MipLODBias = 0.0f; samplerDesc.MaxAnisotropy = 1; samplerDesc.ComparisonFunc = D3D11_COMPARISON_NEVER; samplerDesc.BorderColor[0] = 0; samplerDesc.BorderColor[1] = 0; samplerDesc.BorderColor[2] = 0; samplerDesc.BorderColor[3] = 0; samplerDesc.MinLOD = 0; samplerDesc.MaxLOD = D3D11_FLOAT32_MAX; result = Device::Instance().GetDevice()->CreateSamplerState(&samplerDesc, &mSamplerState); //create materials for (std::map<UINT, MaterialDesc>::iterator iter = meshData.materials.begin(); iter != meshData.materials.end(); ++iter) { mMaterials[iter->first].init(string_to_wstring(iter->second.mDiffuseMapName).c_str(), string_to_wstring(iter->second.mNormalMapName).c_str(), string_to_wstring(iter->second.RoughnessMetallicMapName).c_str()); } //create resaterizer state D3D11_RASTERIZER_DESC rasterDesc; rasterDesc.AntialiasedLineEnable = false; rasterDesc.CullMode = D3D11_CULL_BACK; rasterDesc.DepthBias = 0; rasterDesc.DepthBiasClamp = 0.0f; rasterDesc.DepthClipEnable = true; rasterDesc.FillMode = D3D11_FILL_SOLID; rasterDesc.FrontCounterClockwise = false; rasterDesc.MultisampleEnable = false; rasterDesc.ScissorEnable = false; rasterDesc.SlopeScaledDepthBias = 0.0f; rasterDesc.MultisampleEnable = false; result = Device::Instance().GetDevice()->CreateRasterizerState(&rasterDesc, &mRasterizerState); WCHAR* cubemapFilename = L"Resource/Texture/snowcube1024.dds"; D3DX11CreateShaderResourceViewFromFile(Device::Instance().GetDevice(), cubemapFilename, 0, 0, &mCubeTexture, 0); D3D11_QUERY_DESC queryDesc; queryDesc.Query = D3D11_QUERY_OCCLUSION; queryDesc.MiscFlags = 0; HRESULT re = Device::Instance().GetDevice()->CreateQuery(&queryDesc, &mQuery); if (FAILED(re)) { std::cout << "gww" << std::endl; } // 初始化混合状态 D3D11_BLEND_DESC blendDesc = { 0 }; blendDesc.RenderTarget[0].BlendEnable = FALSE; blendDesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; result = Device::Instance().GetDevice()->CreateBlendState( &blendDesc, &mBlendState ); //depth stencil state D3D11_DEPTH_STENCIL_DESC depthStencilDesc; depthStencilDesc.DepthEnable = TRUE; depthStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; depthStencilDesc.DepthFunc = D3D11_COMPARISON_LESS; depthStencilDesc.StencilEnable = FALSE; depthStencilDesc.StencilReadMask = 0xFF; depthStencilDesc.StencilWriteMask = 0xFF; Device::Instance().GetDevice()->CreateDepthStencilState(&depthStencilDesc, &mDepthStencilState); //boundbox InitAABB(); }
//----------------------------------------------------------------------------- // Name: InitD3D() // Desc: Initializes Direct3D //----------------------------------------------------------------------------- HRESULT InitD3D(HWND hWnd) { // Set up the structure used to create the device and swapchain DXGI_SWAP_CHAIN_DESC sd; ZeroMemory(&sd, sizeof(sd)); sd.BufferCount = 1; sd.BufferDesc.Width = g_WindowWidth; sd.BufferDesc.Height = g_WindowHeight; sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; sd.BufferDesc.RefreshRate.Numerator = 60; sd.BufferDesc.RefreshRate.Denominator = 1; sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; sd.OutputWindow = hWnd; sd.SampleDesc.Count = 1; sd.SampleDesc.Quality = 0; sd.Windowed = TRUE; // Create device and swapchain HRESULT hr = sFnPtr_D3D10CreateDeviceAndSwapChain( g_pCudaCapableAdapter, D3D10_DRIVER_TYPE_HARDWARE, NULL, 0, D3D10_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice); AssertOrQuit(SUCCEEDED(hr)); g_pCudaCapableAdapter->Release(); // Create a render target view of the swapchain ID3D10Texture2D *pBuffer; hr = g_pSwapChain->GetBuffer(0, __uuidof(ID3D10Texture2D), (LPVOID *)&pBuffer); AssertOrQuit(SUCCEEDED(hr)); hr = g_pd3dDevice->CreateRenderTargetView(pBuffer, NULL, &g_pSwapChainRTV); AssertOrQuit(SUCCEEDED(hr)); pBuffer->Release(); g_pd3dDevice->OMSetRenderTargets(1, &g_pSwapChainRTV, NULL); // Setup the viewport D3D10_VIEWPORT vp; vp.Width = g_WindowWidth; vp.Height = g_WindowHeight; vp.MinDepth = 0.0f; vp.MaxDepth = 1.0f; vp.TopLeftX = 0; vp.TopLeftY = 0; g_pd3dDevice->RSSetViewports(1, &vp); // Setup the effect { ID3D10Blob *pCompiledEffect; hr = sFnPtr_D3D10CompileEffectFromMemory( (void *)g_simpleEffectSrc, sizeof(g_simpleEffectSrc), NULL, NULL, // pDefines NULL, // pIncludes 0, // HLSL flags 0, // FXFlags &pCompiledEffect, NULL); AssertOrQuit(SUCCEEDED(hr)); hr = sFnPtr_D3D10CreateEffectFromMemory( pCompiledEffect->GetBufferPointer(), pCompiledEffect->GetBufferSize(), 0, // FXFlags g_pd3dDevice, NULL, &g_pSimpleEffect); pCompiledEffect->Release(); g_pSimpleTechnique = g_pSimpleEffect->GetTechniqueByName("Render"); // g_pmWorldViewProjection = g_pSimpleEffect->GetVariableByName("g_mWorldViewProjection")->AsMatrix(); g_pmWorld = g_pSimpleEffect->GetVariableByName("g_mWorld")->AsMatrix(); g_pmView = g_pSimpleEffect->GetVariableByName("g_mView")->AsMatrix(); g_pmProjection = g_pSimpleEffect->GetVariableByName("g_mProjection")->AsMatrix(); // Define the input layout D3D10_INPUT_ELEMENT_DESC layout[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 }, { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0 }, }; UINT numElements = sizeof(layout)/sizeof(layout[0]); // Create the input layout D3D10_PASS_DESC PassDesc; g_pSimpleTechnique->GetPassByIndex(0)->GetDesc(&PassDesc); hr = g_pd3dDevice->CreateInputLayout(layout, numElements, PassDesc.pIAInputSignature, PassDesc.IAInputSignatureSize, &g_pInputLayout); AssertOrQuit(SUCCEEDED(hr)); // Setup Input Layout, apply effect and draw points g_pd3dDevice->IASetInputLayout(g_pInputLayout); g_pSimpleTechnique->GetPassByIndex(0)->Apply(0); g_pd3dDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_POINTLIST); } // begin interop cudaD3D10SetDirect3DDevice(g_pd3dDevice); getLastCudaError("cudaD3D10SetDirect3DDevice failed"); return S_OK; }
bool ColorShader::InitializeShader(ID3D11Device* device, HWND hwnd, WCHAR* vsFilename, WCHAR* psFilename) { HRESULT result; ID3D10Blob* errorMessage; ID3D10Blob* vertexShaderBuffer; ID3D10Blob* pixelShaderBuffer; D3D11_INPUT_ELEMENT_DESC polygonLayout[2]; unsigned int numElements; D3D11_BUFFER_DESC matrixBufferDesc; // Initialize the pointers this function wll use to null errorMessage = nullptr; vertexShaderBuffer = nullptr; pixelShaderBuffer = nullptr; // Compile the vertex shader result = D3DX11CompileFromFile(vsFilename, NULL, NULL, "ColorVertexShader", "vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &vertexShaderBuffer, &errorMessage, NULL); if (FAILED(result)) { // if there is a message if (errorMessage) { OutputShaderErrorMessage(errorMessage, hwnd, vsFilename); } else { MessageBox(hwnd, vsFilename, L"Missing Shader File", MB_OK); } return false; } // Compile the pixel shader result = D3DX11CompileFromFile(psFilename, NULL, NULL, "ColorPixelShader", "ps_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &pixelShaderBuffer, &errorMessage, NULL); if (FAILED(result)) { if (errorMessage) { OutputShaderErrorMessage(errorMessage, hwnd, psFilename); } else { MessageBox(hwnd, psFilename, L"Missing Shader File", MB_OK); } return false; } // Create the vertex and pixel shader from the buffer result = device->CreateVertexShader(vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), NULL, &mVertexShader); if (FAILED(result)) return false; result = device->CreatePixelShader(pixelShaderBuffer->GetBufferPointer(), pixelShaderBuffer->GetBufferSize(), NULL, &mPixelShader); if (FAILED(result)) return false; // Set up the layout of the data that goes into the shader polygonLayout[0].SemanticName = "POSITION"; polygonLayout[0].SemanticIndex = 0; polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[0].InputSlot = 0; polygonLayout[0].AlignedByteOffset = 0; polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[0].InstanceDataStepRate = 0; polygonLayout[1].SemanticName = "COLOR"; polygonLayout[1].SemanticIndex = 0; polygonLayout[1].Format = DXGI_FORMAT_R32G32B32A32_FLOAT; polygonLayout[1].InputSlot = 0; polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[1].InstanceDataStepRate = 0; numElements = sizeof(polygonLayout) / sizeof(polygonLayout[0]); result = device->CreateInputLayout(polygonLayout, numElements, vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), &mInputLayout); if (FAILED(result)) return false; vertexShaderBuffer->Release(); vertexShaderBuffer = nullptr; pixelShaderBuffer->Release(); pixelShaderBuffer = nullptr; // Set up the description of the dynamic matrix constant buffer in // the vertex shader matrixBufferDesc.Usage = D3D11_USAGE_DYNAMIC; matrixBufferDesc.ByteWidth = sizeof(MatrixBufferType); matrixBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; matrixBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; matrixBufferDesc.MiscFlags = 0; matrixBufferDesc.StructureByteStride = 0; result = device->CreateBuffer(&matrixBufferDesc, NULL, &mMatrixBuffer); if (FAILED(result)) return false; return true; }
bool ProjectionLightMapShaderClass::InitializeShader(ID3D11Device* device, HWND hwnd, WCHAR* vsFilename, WCHAR* psFilename){ HRESULT result; ID3D10Blob* errorMessage; ID3D10Blob* vertexShaderBuffer; ID3D10Blob* pixelShaderBuffer; D3D11_INPUT_ELEMENT_DESC polygonLayout[3]; unsigned int numElements; D3D11_SAMPLER_DESC samplerDesc; D3D11_BUFFER_DESC matrixBufferDesc; D3D11_BUFFER_DESC lightBufferDesc; D3D11_BUFFER_DESC lightPositionBufferDesc; //init pointers errorMessage = 0; vertexShaderBuffer = 0; pixelShaderBuffer = 0; //compile vs result = D3DCompileFromFile(vsFilename, NULL, NULL, "ProjectionLightMapVertexShader", "vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, &vertexShaderBuffer, &errorMessage); if (FAILED(result)){ if (errorMessage){ OutputShaderErrorMessage(errorMessage, hwnd, vsFilename); } else{ MessageBox(hwnd, (char*)vsFilename, "Missing Shader File", MB_OK); } return false; } //compile ps result = D3DCompileFromFile(psFilename, NULL, NULL, "ProjectionLightMapPixelShader", "ps_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, &pixelShaderBuffer, &errorMessage); if (FAILED(result)){ if (errorMessage){ OutputShaderErrorMessage(errorMessage, hwnd, psFilename); } else{ MessageBox(hwnd, (char*)psFilename, "Missing Shader File", MB_OK); } return false; } //create vs from buffer result = device->CreateVertexShader(vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), NULL, &m_vertexShader); if (FAILED(result)) return false; //create ps from buffer result = device->CreatePixelShader(pixelShaderBuffer->GetBufferPointer(), pixelShaderBuffer->GetBufferSize(), NULL, &m_pixelShader); if (FAILED(result)) return false; //create the vertex input layout description. polygonLayout[0].SemanticName = "POSITION"; polygonLayout[0].SemanticIndex = 0; polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[0].InputSlot = 0; polygonLayout[0].AlignedByteOffset = 0; polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[0].InstanceDataStepRate = 0; polygonLayout[1].SemanticName = "TEXCOORD"; polygonLayout[1].SemanticIndex = 0; polygonLayout[1].Format = DXGI_FORMAT_R32G32_FLOAT; polygonLayout[1].InputSlot = 0; polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[1].InstanceDataStepRate = 0; polygonLayout[2].SemanticName = "NORMAL"; polygonLayout[2].SemanticIndex = 0; polygonLayout[2].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[2].InputSlot = 0; polygonLayout[2].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; polygonLayout[2].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[2].InstanceDataStepRate = 0; //number of elements in layout numElements = sizeof(polygonLayout) / sizeof(polygonLayout[0]); //create vertex input layout result = device->CreateInputLayout(polygonLayout, numElements, vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), &m_layout); if (FAILED(result)) return false; //release vs, ps buffers vertexShaderBuffer->Release(); vertexShaderBuffer = 0; pixelShaderBuffer->Release(); pixelShaderBuffer = 0; //create texture sampler state desc samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.MipLODBias = 0.0f; samplerDesc.MaxAnisotropy = 1; samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; samplerDesc.BorderColor[0] = 0; samplerDesc.BorderColor[1] = 0; samplerDesc.BorderColor[2] = 0; samplerDesc.BorderColor[3] = 0; samplerDesc.MinLOD = 0; samplerDesc.MaxLOD = D3D11_FLOAT32_MAX; //create the texture sampler state result = device->CreateSamplerState(&samplerDesc, &m_sampleState); if (FAILED(result)) return false; //setup the dynamic matrix constant buffer desc in vs matrixBufferDesc.Usage = D3D11_USAGE_DYNAMIC; matrixBufferDesc.ByteWidth = sizeof(MatrixBufferType); matrixBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; matrixBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; matrixBufferDesc.MiscFlags = 0; matrixBufferDesc.StructureByteStride = 0; //create constant buffer pointer to access vs constant buffer result = device->CreateBuffer(&matrixBufferDesc, NULL, &m_matrixBuffer); if (FAILED(result)) return false; //setup light dynamic constant buffer desc in ps lightBufferDesc.Usage = D3D11_USAGE_DYNAMIC; lightBufferDesc.ByteWidth = sizeof(LightBufferType); lightBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; lightBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; lightBufferDesc.MiscFlags = 0; lightBufferDesc.StructureByteStride = 0; //create constant buffer pointer to access ps constant buffer result = device->CreateBuffer(&lightBufferDesc, NULL, &m_lightBuffer); if (FAILED(result)) return false; //setup light position dynamic constant buffer in vertex shader! lightPositionBufferDesc.Usage = D3D11_USAGE_DYNAMIC; lightPositionBufferDesc.ByteWidth = sizeof(LightPositionBufferType); lightPositionBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; lightPositionBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; lightPositionBufferDesc.MiscFlags = 0; lightPositionBufferDesc.StructureByteStride = 0; // Create the constant buffer pointer so we can access the vertex shader constant buffer from within this class. result = device->CreateBuffer(&lightPositionBufferDesc, NULL, &m_lightPositionBuffer); if (FAILED(result)) return false; return true; }
Shader* D3D10VertexShader::CreateVertexShader(CTSTR lpShader, CTSTR lpFileName) { String errorString; ShaderProcessor shaderProcessor; if(!shaderProcessor.ProcessShader(lpShader, lpFileName)) AppWarning(TEXT("Unable to process vertex shader '%s'"), lpFileName); //don't exit, leave it to the actual shader compiler to tell the errors //----------------------------------------------- D3D10System *d3d10Sys = static_cast<D3D10System*>(GS); LPCSTR lpVSType = d3d10Sys->bDisableCompatibilityMode ? "vs_4_0" : "vs_4_0_level_9_3"; String cacheFilename = FormattedString(TEXT("%s/shaderCache/%s.blob"), OBSGetAppDataPath(), lpFileName).FindReplace(TEXT("\\"), TEXT("/")); List<BYTE> shaderBuffer; LPVOID shaderData; SIZE_T shaderDataSize; ID3D10Blob *errorMessages = NULL, *shaderBlob = NULL; HRESULT err; if(!OSFileExists(cacheFilename) || OSGetFileModificationTime(lpFileName) > OSGetFileModificationTime(cacheFilename)) { LPSTR lpAnsiShader = tstr_createUTF8(lpShader); LPSTR lpAnsiFileName = tstr_createUTF8(lpFileName); err = D3DX10CompileFromMemory(lpAnsiShader, strlen(lpAnsiShader), lpAnsiFileName, NULL, NULL, "main", lpVSType, D3D10_SHADER_OPTIMIZATION_LEVEL3, 0, NULL, &shaderBlob, &errorMessages, NULL); Free(lpAnsiFileName); Free(lpAnsiShader); if(FAILED(err)) { if(errorMessages) { if(errorMessages->GetBufferSize()) { LPSTR lpErrors = (LPSTR)errorMessages->GetBufferPointer(); Log(TEXT("Error compiling vertex shader '%s':\r\n\r\n%S\r\n"), lpFileName, lpErrors); } errorMessages->Release(); } CrashError(TEXT("Compilation of vertex shader '%s' failed, result = %08lX"), lpFileName, err); return NULL; } shaderData = shaderBlob->GetBufferPointer(); shaderDataSize = shaderBlob->GetBufferSize(); CreatePath(GetPathDirectory(cacheFilename)); XFile cacheFile(cacheFilename, XFILE_WRITE, XFILE_CREATEALWAYS); cacheFile.Write(shaderData, (DWORD)shaderDataSize); } else { XFile cacheFile(cacheFilename, XFILE_READ | XFILE_SHARED, XFILE_OPENEXISTING); shaderBuffer.SetSize((unsigned)cacheFile.GetFileSize()); cacheFile.Read(shaderBuffer.Array(), shaderBuffer.Num()); shaderData = shaderBuffer.Array(); shaderDataSize = shaderBuffer.Num(); } //----------------------------------------------- ID3D10VertexShader *vShader; ID3D10InputLayout *vShaderLayout; err = GetD3D()->CreateVertexShader(shaderData, shaderDataSize, &vShader); if(FAILED(err)) { CrashError(TEXT("Unable to create vertex shader '%s', result = %08lX"), lpFileName, err); SafeRelease(shaderBlob); return NULL; } err = GetD3D()->CreateInputLayout(shaderProcessor.generatedLayout.Array(), shaderProcessor.generatedLayout.Num(), shaderData, shaderDataSize, &vShaderLayout); if(FAILED(err)) { CrashError(TEXT("Unable to create vertex layout for vertex shader '%s', result = %08lX"), lpFileName, err); SafeRelease(shaderBlob); SafeRelease(vShader); return NULL; } SafeRelease(shaderBlob); //----------------------------------------------- D3D10VertexShader *shader = new D3D10VertexShader; shader->vertexShader = vShader; shader->inputLayout = vShaderLayout; if(!shader->ProcessData(shaderProcessor, lpFileName)) { delete shader; return NULL; } shader->bHasNormals = shaderProcessor.bHasNormals; shader->bHasColors = shaderProcessor.bHasColors; shader->bHasTangents = shaderProcessor.bHasTangents; shader->nTextureCoords = shaderProcessor.numTextureCoords; shader->hViewProj = shader->GetParameterByName(TEXT("ViewProj")); return shader; }
bool Shader::InitializeShader(ID3D11Device* device, HWND hwnd, LPCSTR vsFilename, LPCSTR psFilename) { HRESULT result; ID3D10Blob* errorMessage; ID3D10Blob* vertexShaderBuffer; ID3D10Blob* pixelShaderBuffer; D3D11_INPUT_ELEMENT_DESC polygonLayout[4]; unsigned int numElements; D3D11_SAMPLER_DESC samplerDesc; D3D11_BUFFER_DESC matrixBufferDesc; D3D11_BUFFER_DESC lightBufferDesc; D3D11_BUFFER_DESC lightBufferDesc2; D3D11_BUFFER_DESC fogBufferDesc; errorMessage = 0; vertexShaderBuffer = 0; pixelShaderBuffer = 0; // compile VS result = D3DX11CompileFromFile(vsFilename, NULL, NULL, "main", "vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &vertexShaderBuffer, &errorMessage, NULL); if (FAILED(result)) { if (errorMessage) { OutputShaderErrorMessage(errorMessage, hwnd, vsFilename); } else { MessageBox(hwnd, vsFilename, "Missing Shader File", MB_OK); } return false; } // compile PS result = D3DX11CompileFromFile(psFilename, NULL, NULL, "main", "ps_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &pixelShaderBuffer, &errorMessage, NULL); if (FAILED(result)) { if (errorMessage) { OutputShaderErrorMessage(errorMessage, hwnd, psFilename); } else { MessageBox(hwnd, psFilename, "Missing Shader File", MB_OK); } return false; } // Create the vertex shader result = device->CreateVertexShader(vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), NULL, &m_vertexShader); if (FAILED(result)) { return false; } // Create the pixel shader result = device->CreatePixelShader(pixelShaderBuffer->GetBufferPointer(), pixelShaderBuffer->GetBufferSize(), NULL, &m_pixelShader); if (FAILED(result)) { return false; } // Create the vertex input layout description. polygonLayout[0].SemanticName = "POSITION"; polygonLayout[0].SemanticIndex = 0; polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[0].InputSlot = 0; polygonLayout[0].AlignedByteOffset = 0; polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[0].InstanceDataStepRate = 0; polygonLayout[1].SemanticName = "TEXCOORD"; polygonLayout[1].SemanticIndex = 0; polygonLayout[1].Format = DXGI_FORMAT_R32G32_FLOAT; polygonLayout[1].InputSlot = 0; polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[1].InstanceDataStepRate = 0; polygonLayout[2].SemanticName = "NORMAL"; polygonLayout[2].SemanticIndex = 0; polygonLayout[2].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[2].InputSlot = 0; polygonLayout[2].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; polygonLayout[2].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[2].InstanceDataStepRate = 0; polygonLayout[3].SemanticName = "TEXCOORD"; polygonLayout[3].SemanticIndex = 1; polygonLayout[3].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[3].InputSlot = 1; polygonLayout[3].AlignedByteOffset = 0; polygonLayout[3].InputSlotClass = D3D11_INPUT_PER_INSTANCE_DATA; polygonLayout[3].InstanceDataStepRate = 1; numElements = sizeof(polygonLayout) / sizeof(polygonLayout[0]); result = device->CreateInputLayout(polygonLayout, numElements, vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), &m_layout); if (FAILED(result)) { return false; } vertexShaderBuffer->Release(); vertexShaderBuffer = 0; pixelShaderBuffer->Release(); pixelShaderBuffer = 0; // Create a wrap texture sampler state samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.MipLODBias = 0.0f; samplerDesc.MaxAnisotropy = 1; samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; samplerDesc.BorderColor[0] = 0; samplerDesc.BorderColor[1] = 0; samplerDesc.BorderColor[2] = 0; samplerDesc.BorderColor[3] = 0; samplerDesc.MinLOD = 0; samplerDesc.MaxLOD = D3D11_FLOAT32_MAX; result = device->CreateSamplerState(&samplerDesc, &m_sampleStateWrap); if (FAILED(result)) { return false; } // Create a clamp texture sampler state samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; result = device->CreateSamplerState(&samplerDesc, &m_sampleStateClamp); if (FAILED(result)) { return false; } // Create matrix desc matrixBufferDesc.Usage = D3D11_USAGE_DYNAMIC; matrixBufferDesc.ByteWidth = sizeof(MatrixBufferType); matrixBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; matrixBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; matrixBufferDesc.MiscFlags = 0; matrixBufferDesc.StructureByteStride = 0; result = device->CreateBuffer(&matrixBufferDesc, NULL, &m_matrixBuffer); if (FAILED(result)) { return false; } // Create light desc in PS lightBufferDesc.Usage = D3D11_USAGE_DYNAMIC; lightBufferDesc.ByteWidth = sizeof(LightBufferType); lightBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; lightBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; lightBufferDesc.MiscFlags = 0; lightBufferDesc.StructureByteStride = 0; result = device->CreateBuffer(&lightBufferDesc, NULL, &m_lightBuffer); if (FAILED(result)) { return false; } // Create light desc in VS lightBufferDesc2.Usage = D3D11_USAGE_DYNAMIC; lightBufferDesc2.ByteWidth = sizeof(LightBufferType2); lightBufferDesc2.BindFlags = D3D11_BIND_CONSTANT_BUFFER; lightBufferDesc2.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; lightBufferDesc2.MiscFlags = 0; lightBufferDesc2.StructureByteStride = 0; result = device->CreateBuffer(&lightBufferDesc2, NULL, &m_lightBuffer2); if (FAILED(result)) { return false; } // create fog desc in VS fogBufferDesc.Usage = D3D11_USAGE_DYNAMIC; fogBufferDesc.ByteWidth = sizeof(FogBufferType); fogBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; fogBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; fogBufferDesc.MiscFlags = 0; fogBufferDesc.StructureByteStride = 0; result = device->CreateBuffer(&fogBufferDesc, NULL, &m_fogBuffer); if (FAILED(result)) { return false; } return true; }
sBool sShaderCompileDX(const sChar *source,const sChar *profile,const sChar *main,sU8 *&data,sInt &size,sInt flags,sTextBuffer *errors) { #if sCOMP_DX9_ENABLE ID3D10Blob *bytecode; ID3D10Blob *dxerrors; sBool result; // unicode -> ansi conversion (cheap) sChar8 profile8[16]; sCopyString(profile8,profile,sCOUNTOF(profile8)); sChar8 main8[256]; sCopyString(main8,main,sCOUNTOF(main8)); sInt len = sGetStringLen(source); sChar8 *src8 = new sChar8[len+1]; sCopyString(src8,source,len+1); // figure out flags UINT flags1 = 0; UINT flags2 = 0; if(flags&sSCF_DEBUG) flags1 |= D3D10_SHADER_DEBUG; //#ifdef D3DXSHADER_USE_LEGACY_D3DX9_31_DLL // if(sGetShellSwitch(L"-d3dold") || sMatchWildcard(L"ps_1_*",profile)) // flags1 |= D3DXSHADER_USE_LEGACY_D3DX9_31_DLL; //#endif // result = (D3DXCompileShader(src8,len,0,0,main8,profile8,d3dflags,&bytecode,&dxerrors,0)==D3D_OK); result = !FAILED(D3DCompile(src8,len,0,0,0,main8,profile8,flags1,flags2,&bytecode,&dxerrors)); // print errors and warnings // errors->Clear(); // do not clear, this will overwrite old errors if(dxerrors) { sInt elen = dxerrors->GetBufferSize(); const sChar8 *estr = (const sChar8*)dxerrors->GetBufferPointer(); for(sInt i=0;i<elen;i++) if(estr[i]) errors->PrintChar(estr[i]); dxerrors->Release(); } // get bytecode if(bytecode) { size = bytecode->GetBufferSize(); data = new sU8[size]; sCopyMem(data,bytecode->GetBufferPointer(),size); bytecode->Release(); } else { result = 0; data = 0; size = 0; } // done delete[] src8; return result; #else return sFALSE; #endif // sCOMP_DX9_ENABLE }
bool CFontShaderClass::InitalizeShader(ID3D11Device* device, HWND hwnd, WCHAR* vsFilename, WCHAR* psFilename) { HRESULT result; ID3D10Blob* errorMessage; ID3D10Blob* VertexShaderBuffer; ID3D10Blob* PixelShaderBuffer; D3D11_INPUT_ELEMENT_DESC polygonLayout[2]; unsigned int numElements; D3D11_BUFFER_DESC ConstantBufferDesc; D3D11_SAMPLER_DESC samplerDesc; D3D11_BUFFER_DESC PixelBufferDesc; //Ponemos a 0 los blobs errorMessage = 0; VertexShaderBuffer = 0; PixelShaderBuffer = 0; //Ahora Compilamos nuestro pixelShader para ver por errores result = D3DX11CompileFromFile (vsFilename, NULL, NULL, "FontVertexShader", "vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &VertexShaderBuffer, &errorMessage, NULL); if (FAILED(result)) { if (errorMessage) { OutputShaderErrorMessage(errorMessage, hwnd, vsFilename); } else { MessageBox(hwnd, vsFilename, L"Missing File", MB_OK); } return false; } //Ahora Compilamos nuestro pixelShader para ver por errores result = D3DX11CompileFromFile (psFilename, NULL, NULL, "FontPixelShader", "ps_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &PixelShaderBuffer, &errorMessage, NULL); if (FAILED(result)) { if (errorMessage) { OutputShaderErrorMessage(errorMessage, hwnd, psFilename); } else { MessageBox(hwnd, psFilename, L"Missing File", MB_OK); } return false; } //ahora cremos el vertex Shader result = device->CreateVertexShader(VertexShaderBuffer->GetBufferPointer(), VertexShaderBuffer->GetBufferSize(), NULL, &m_vertexShader); if (FAILED(result)) { return false; } //ahora cremos el pixel Shader result = device->CreatePixelShader(PixelShaderBuffer->GetBufferPointer(), PixelShaderBuffer->GetBufferSize(), NULL, &m_pixelShader); if (FAILED(result)) { return false; } //Ahora describimos los buffers que estan en el vertex shader polygonLayout[0].SemanticName = "POSITION"; polygonLayout[0].SemanticIndex = 0; polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[0].InputSlot = 0; polygonLayout[0].AlignedByteOffset = 0; polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[0].InstanceDataStepRate = 0; polygonLayout[1].SemanticName = "TEXCOORD"; polygonLayout[1].SemanticIndex = 0; polygonLayout[1].Format = DXGI_FORMAT_R32G32_FLOAT; polygonLayout[1].InputSlot = 0; polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[1].InstanceDataStepRate = 0; //Vemos cuantos layouts tenemos con una division de Bytes numElements = sizeof(polygonLayout)/sizeof(polygonLayout[0]); //Creamos el vertex input Layout result = device->CreateInputLayout(polygonLayout, numElements, VertexShaderBuffer->GetBufferPointer(), VertexShaderBuffer->GetBufferSize(), &m_layout); if (FAILED(result)) { return false; } //Ahora liberamos toda la memoria salida para la creacion de buffers VertexShaderBuffer->Release(); VertexShaderBuffer = 0; PixelShaderBuffer->Release(); PixelShaderBuffer = 0; //Especificamos la informacion para el constant buffer ConstantBufferDesc.Usage = D3D11_USAGE_DYNAMIC; ConstantBufferDesc.ByteWidth = sizeof(ConstantBufferType); ConstantBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; ConstantBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; ConstantBufferDesc.MiscFlags = 0; ConstantBufferDesc.StructureByteStride = 0; //Creamos el buffer de constantes result = device->CreateBuffer(&ConstantBufferDesc, NULL, &m_constantBuffer); if (FAILED(result)) { return false; } //describimos el sampler para la textura samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.MipLODBias = 0.0f; samplerDesc.MaxAnisotropy = 1; samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; samplerDesc.BorderColor[0] = 0; samplerDesc.BorderColor[1] = 0; samplerDesc.BorderColor[2] = 0; samplerDesc.BorderColor[3] = 0; samplerDesc.MinLOD = 0; samplerDesc.MaxLOD = D3D11_FLOAT32_MAX; //creamos el sampler result = device->CreateSamplerState(&samplerDesc, &m_sampleState); if (FAILED(result)) { return false; } //ahora describimos el buffer pero para el color de pixel PixelBufferDesc.Usage = D3D11_USAGE_DYNAMIC; PixelBufferDesc.ByteWidth = sizeof(PixelBufferType); PixelBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; PixelBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; PixelBufferDesc.MiscFlags = 0; PixelBufferDesc.StructureByteStride = 0; //Y lo creamos result = device->CreateBuffer(&PixelBufferDesc, NULL, &m_PixelBuffer); if (FAILED(result)) { return false; } return true; }
Shader* D3D10PixelShader::CreatePixelShader(CTSTR lpShader, CTSTR lpFileName) { String errorString; ShaderProcessor shaderProcessor; if(!shaderProcessor.ProcessShader(lpShader, lpFileName)) AppWarning(TEXT("Unable to process pixel shader '%s'"), lpFileName); //don't exit, leave it to the actual shader compiler to tell the errors //----------------------------------------------- LPSTR lpAnsiShader = tstr_createUTF8(lpShader); LPSTR lpAnsiFileName = tstr_createUTF8(lpFileName); D3D10System *d3d10Sys = static_cast<D3D10System*>(GS); LPCSTR lpPSType = d3d10Sys->bDisableCompatibilityMode ? "ps_4_0" : "ps_4_0_level_9_3"; ID3D10Blob *errorMessages = NULL, *shaderBlob = NULL; HRESULT err = D3DX10CompileFromMemory(lpAnsiShader, strlen(lpAnsiShader), lpAnsiFileName, NULL, NULL, "main", lpPSType, D3D10_SHADER_OPTIMIZATION_LEVEL3, 0, NULL, &shaderBlob, &errorMessages, NULL); Free(lpAnsiFileName); Free(lpAnsiShader); if(FAILED(err)) { if(errorMessages) { if(errorMessages->GetBufferSize()) { LPSTR lpErrors = (LPSTR)errorMessages->GetBufferPointer(); Log(TEXT("Error compiling pixel shader '%s':\r\n\r\n%S\r\n"), lpFileName, lpErrors); } errorMessages->Release(); } CrashError(TEXT("Compilation of pixel shader '%s' failed, result = %08lX"), lpFileName, err); return NULL; } //----------------------------------------------- ID3D10PixelShader *pShader; err = GetD3D()->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), &pShader); if(FAILED(err)) { CrashError(TEXT("Unable to create pixel shader '%s', result = %08lX"), lpFileName, err); SafeRelease(shaderBlob); return NULL; } shaderBlob->Release(); //----------------------------------------------- D3D10PixelShader *shader = new D3D10PixelShader; shader->pixelShader = pShader; if(!shader->ProcessData(shaderProcessor, lpFileName)) { delete shader; return NULL; } return shader; }
bool ColorShaderClass::InitializeShader(ID3D11Device* device, HWND hwnd, WCHAR* vsFilename, WCHAR* psfilename) { HRESULT result; ID3D10Blob* errorMessage; ID3D10Blob* vertexShaderBuffer; ID3D10Blob* pixelShaderBuffer; D3D11_INPUT_ELEMENT_DESC polygonLayout[2]; unsigned int numElements; D3D11_BUFFER_DESC matrixBufferDesc; //Æ÷ÀÎÅÍ NULL ¼³Á¤ errorMessage = NULL; vertexShaderBuffer = NULL; pixelShaderBuffer = NULL; //Á¤Á¡ ½¦ÀÌ´õ ÄÄÆÄÀÏ result = D3DX11CompileFromFile(vsFilename, NULL, NULL, "ColorVertexShader", "vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &vertexShaderBuffer, &errorMessage, NULL); if (FAILED(result)) { if (errorMessage) { OutputShaderErrorMessage(errorMessage, hwnd, vsFilename); } else { MessageBox(hwnd, vsFilename, L"Missing Shader File", MB_OK); } return false; } //Çʼ¿ ½¦ÀÌ´õ ÄÄÆÄÀÏ result = D3DX11CompileFromFile(psfilename, NULL, NULL, "ColorPixelShader", "ps_5_0" ,D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &pixelShaderBuffer, &errorMessage, NULL); if (FAILED(result)) { if (errorMessage) { OutputShaderErrorMessage(errorMessage, hwnd, psfilename); } else { MessageBox(hwnd, psfilename, L"Missing Shader File", MB_OK); } return false; } //Á¤Á¡ ¼¼ÀÌ´õ »ý¼º result = device->CreateVertexShader(vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), NULL, &_vertexShader); if (FAILED(result)) { return false; } //Çȼ¿ ½¦ÀÌ´õ »ý¼º result = device->CreatePixelShader(pixelShaderBuffer->GetBufferPointer(), pixelShaderBuffer->GetBufferSize(), NULL, &_pixelShader); if (FAILED(result)) { return false; } //LAYOUT DESC ÀÛ¼º //ModelClass ÀÇ VertexType °ú ÀÏÄ¡ÇؾßÇÔ polygonLayout[0].SemanticName = "POSITION"; polygonLayout[0].SemanticIndex = 0; polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[0].InputSlot = 0; polygonLayout[0].AlignedByteOffset = 0; polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[0].InstanceDataStepRate = 0; polygonLayout[1].SemanticName = "COLOR"; polygonLayout[1].SemanticIndex = 0; polygonLayout[1].Format = DXGI_FORMAT_R32G32B32A32_FLOAT; polygonLayout[1].InputSlot = 0; polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[1].InstanceDataStepRate = 0; //·¹À̾ƿô ¿ä¼Ò °¹¼ö¸¦ °¡Á®¿È? numElements = sizeof(polygonLayout) / sizeof(polygonLayout[0]); //¾Æ ¿©±â¼ Á¤Á¡ÀÔ·Â ·¹À̾ƿô »ý¼ºÀ§Çؼ ±×·³ result = device->CreateInputLayout(polygonLayout, numElements, vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), &_layout); if (FAILED(result)) { return false; } //ÇØÁ¦ ó¸® vertexShaderBuffer->Release(); vertexShaderBuffer = NULL; pixelShaderBuffer->Release(); pixelShaderBuffer = NULL; //Á¤Á¡½¦ÀÌ´õ Çà·Ä »ó¼ö ¹öÆÛ DESC ÀÛ¼º matrixBufferDesc.Usage = D3D11_USAGE_DYNAMIC; matrixBufferDesc.ByteWidth = sizeof(MatrixBufferType); matrixBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; matrixBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; matrixBufferDesc.MiscFlags = 0; matrixBufferDesc.StructureByteStride = 0; // »ó¼ö ¹öÆÛ Æ÷ÀÎÅ͸¦ ¸¸µé¾î ÀÌ Å¬·¡½º¿¡¼ Á¤Á¡ ¼¼ÀÌ´õ »ó¼ö ¹öÆÛ¿¡ Á¢±ÙÁA ¤ÌÀÖ°Ô ÇÑ´Ù´Â°Ô ¸Õ¼Ò¸®?? result = device->CreateBuffer(&matrixBufferDesc, NULL, &_matrixBuffer); if (FAILED(result)) { return false; } return true; }
Shader* D3D10VertexShader::CreateVertexShader(CTSTR lpShader, CTSTR lpFileName) { String errorString; ShaderProcessor shaderProcessor; if(!shaderProcessor.ProcessShader(lpShader, lpFileName)) AppWarning(TEXT("Unable to process vertex shader '%s'"), lpFileName); //don't exit, leave it to the actual shader compiler to tell the errors //----------------------------------------------- LPSTR lpAnsiShader = tstr_createUTF8(lpShader); LPSTR lpAnsiFileName = tstr_createUTF8(lpFileName); D3D10System *d3d10Sys = static_cast<D3D10System*>(GS); LPCSTR lpVSType = d3d10Sys->bDisableCompatibilityMode ? "vs_4_0" : "vs_4_0_level_9_3"; ID3D10Blob *errorMessages = NULL, *shaderBlob = NULL; HRESULT err = D3DX10CompileFromMemory(lpAnsiShader, strlen(lpAnsiShader), lpAnsiFileName, NULL, NULL, "main", lpVSType, D3D10_SHADER_OPTIMIZATION_LEVEL3, 0, NULL, &shaderBlob, &errorMessages, NULL); Free(lpAnsiFileName); Free(lpAnsiShader); if(FAILED(err)) { if(errorMessages) { if(errorMessages->GetBufferSize()) { LPSTR lpErrors = (LPSTR)errorMessages->GetBufferPointer(); Log(TEXT("Error compiling vertex shader '%s':\r\n\r\n%S\r\n"), lpFileName, lpErrors); } errorMessages->Release(); } CrashError(TEXT("Compilation of vertex shader '%s' failed, result = %08lX"), lpFileName, err); return NULL; } //----------------------------------------------- ID3D10VertexShader *vShader; ID3D10InputLayout *vShaderLayout; err = GetD3D()->CreateVertexShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), &vShader); if(FAILED(err)) { CrashError(TEXT("Unable to create vertex shader '%s', result = %08lX"), lpFileName, err); SafeRelease(shaderBlob); return NULL; } err = GetD3D()->CreateInputLayout(shaderProcessor.generatedLayout.Array(), shaderProcessor.generatedLayout.Num(), shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), &vShaderLayout); if(FAILED(err)) { CrashError(TEXT("Unable to create vertex layout for vertex shader '%s', result = %08lX"), lpFileName, err); SafeRelease(shaderBlob); SafeRelease(vShader); return NULL; } shaderBlob->Release(); //----------------------------------------------- D3D10VertexShader *shader = new D3D10VertexShader; shader->vertexShader = vShader; shader->inputLayout = vShaderLayout; if(!shader->ProcessData(shaderProcessor, lpFileName)) { delete shader; return NULL; } shader->bHasNormals = shaderProcessor.bHasNormals; shader->bHasColors = shaderProcessor.bHasColors; shader->bHasTangents = shaderProcessor.bHasTangents; shader->nTextureCoords = shaderProcessor.numTextureCoords; shader->hViewProj = shader->GetParameterByName(TEXT("ViewProj")); return shader; }
bool CBlurShaderClass::InitializeShader(ID3D11Device* device, HWND hwnd, WCHAR* vsFilename, WCHAR* psFilename) { HRESULT result; ID3D10Blob* errorMessage; ID3D10Blob* vertexShaderBuffer; ID3D10Blob* pixelShaderBuffer; D3D11_INPUT_ELEMENT_DESC polygonLayout[3]; unsigned int numElements; D3D11_BUFFER_DESC MatrixBufferDesc; D3D11_BUFFER_DESC LightBufferDesc; D3D11_BUFFER_DESC ScreenSizeBufferDesc; D3D11_SAMPLER_DESC samplerDesc; D3D11_SAMPLER_DESC samplerDesc2; //Inicializamos los valores errorMessage = 0; vertexShaderBuffer = 0; pixelShaderBuffer = 0; /************************************************************************/ /* Compilamos los Shaders */ /************************************************************************/ //Compilamos el vertex shader, si hay un error lo dira result = D3DX11CompileFromFile( vsFilename, NULL, NULL, "BlurVertexShader", "vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &vertexShaderBuffer, &errorMessage, NULL); if (FAILED(result)) { //Si hubo un error, lo debio de haber escrito if (errorMessage) { OutputShaderErrorMessage(errorMessage, hwnd, vsFilename); } //Si no esribio nada, significa que no encontro el archivo else { MessageBox(hwnd, L"no se encontro el archivo", L"Error", MB_OK); } return false; } //Compilamos el pixel shader, si ay un error lo dira result = D3DX11CompileFromFile( psFilename, NULL, NULL, "BlurPixelShader", "ps_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &pixelShaderBuffer, &errorMessage, NULL); if (FAILED(result)) { //Si hubo un error, lo debio de haber escrito if (errorMessage) { OutputShaderErrorMessage(errorMessage, hwnd, psFilename); } //Si no esribio nada, significa que no encontro el archivo else { MessageBox(hwnd, L"no se encontro el archivo", L"Error", MB_OK); } return false; } /************************************************************************/ /* Creamos los buffers a partir de la compilacion */ /************************************************************************/ //creamos el vertex shader del buffer result = device->CreateVertexShader(vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), NULL, &m_vertexShader); if (FAILED(result)) { return false; } //creamos el pixel shader del buffer result = device->CreatePixelShader(pixelShaderBuffer->GetBufferPointer(), pixelShaderBuffer->GetBufferSize(), NULL, &m_pixelShader); if (FAILED(result)) { return false; } /************************************************************************/ /* Creamos el Layout */ /************************************************************************/ polygonLayout[0].SemanticName = "POSITION"; polygonLayout[0].SemanticIndex = 0; polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[0].InputSlot = 0; polygonLayout[0].AlignedByteOffset = 0; polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[0].InstanceDataStepRate = 0; polygonLayout[1].SemanticName = "TEXCOORD"; polygonLayout[1].SemanticIndex = 0; polygonLayout[1].Format = DXGI_FORMAT_R32G32_FLOAT; polygonLayout[1].InputSlot = 0; polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[1].InstanceDataStepRate = 0; polygonLayout[2].SemanticName = "NORMAL"; polygonLayout[2].SemanticIndex = 0; polygonLayout[2].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[2].InputSlot = 0; polygonLayout[2].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; polygonLayout[2].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[2].InstanceDataStepRate = 0; //Obtenemos el numero de elementos del Layout numElements = sizeof(polygonLayout) / sizeof(polygonLayout[0]); //Creamos el Layout del vertex result = device->CreateInputLayout(polygonLayout, numElements, vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), &m_layout); if (FAILED(result)) { return false; } //Liberamos memoria vertexShaderBuffer->Release(); vertexShaderBuffer = 0; pixelShaderBuffer->Release(); pixelShaderBuffer = 0; /************************************************************************/ /* creamos el buffer de constantes */ /************************************************************************/ //Creamos el descriptor del buffer de constantes MatrixBufferDesc.Usage = D3D11_USAGE_DYNAMIC; MatrixBufferDesc.ByteWidth = sizeof(MatrixBufferType); MatrixBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; MatrixBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; MatrixBufferDesc.MiscFlags = 0; MatrixBufferDesc.StructureByteStride = 0; //Creamos el buffer de contsntantes result = device->CreateBuffer(&MatrixBufferDesc, NULL, &m_matrixBuffer); if (FAILED(result)) { return false; } /************************************************************************/ /* creamos el buffer de luces */ /************************************************************************/ //Creamos el descriptor del buffer de constantes LightBufferDesc.Usage = D3D11_USAGE_DYNAMIC; LightBufferDesc.ByteWidth = sizeof(LightBufferType); LightBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; LightBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; LightBufferDesc.MiscFlags = 0; LightBufferDesc.StructureByteStride = 0; //Creamos el buffer de contsntantes result = device->CreateBuffer(&LightBufferDesc, NULL, &m_lightBuffer); if (FAILED(result)) { return false; } /************************************************************************/ /* Creamos el sampler para la textura */ /************************************************************************/ //Describimos el comportamiento con la textura samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.MipLODBias = 0.0f; samplerDesc.MaxAnisotropy = 1; samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; samplerDesc.BorderColor[0] = 0; samplerDesc.BorderColor[1] = 0; samplerDesc.BorderColor[2] = 0; samplerDesc.BorderColor[3] = 0; samplerDesc.MinLOD = 0; samplerDesc.MaxLOD = D3D11_FLOAT32_MAX; //y creamos el sample state result = device->CreateSamplerState(&samplerDesc, &m_sampleState); if (FAILED(result)) { return false; } ////////////////////////////////////////////////////////////////////////// return true; }
//----------------------------------------------------------------------------- // Name: InitD3D() // Desc: Initializes Direct3D //----------------------------------------------------------------------------- HRESULT InitD3D(HWND hWnd) { // Set up the structure used to create the device and swapchain DXGI_SWAP_CHAIN_DESC sd; ZeroMemory(&sd, sizeof(sd)); sd.BufferCount = 1; sd.BufferDesc.Width = g_WindowWidth; sd.BufferDesc.Height = g_WindowHeight; sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; sd.BufferDesc.RefreshRate.Numerator = 60; sd.BufferDesc.RefreshRate.Denominator = 1; sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; sd.OutputWindow = hWnd; sd.SampleDesc.Count = 1; sd.SampleDesc.Quality = 0; sd.Windowed = TRUE; // Create device and swapchain HRESULT hr = sFnPtr_D3D10CreateDeviceAndSwapChain( g_pCudaCapableAdapter, D3D10_DRIVER_TYPE_HARDWARE, NULL, 0, //D3D10_CREATE_DEVICE_DEBUG, D3D10_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice); AssertOrQuit(SUCCEEDED(hr)); g_pCudaCapableAdapter->Release(); // Create a render target view of the swapchain ID3D10Texture2D *pBuffer; hr = g_pSwapChain->GetBuffer(0, __uuidof(ID3D10Texture2D), (LPVOID *)&pBuffer); AssertOrQuit(SUCCEEDED(hr)); hr = g_pd3dDevice->CreateRenderTargetView(pBuffer, NULL, &g_pSwapChainRTV); AssertOrQuit(SUCCEEDED(hr)); pBuffer->Release(); // Create a color buffer, corresponding render target view and shader resource view D3D10_TEXTURE2D_DESC tex2Ddesc; ZeroMemory(&tex2Ddesc, sizeof(D3D10_TEXTURE2D_DESC)); tex2Ddesc.Width = g_WindowWidth; tex2Ddesc.Height = g_WindowHeight; tex2Ddesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; tex2Ddesc.MipLevels = 1; tex2Ddesc.ArraySize = 1; tex2Ddesc.SampleDesc.Count = 1; tex2Ddesc.Usage = D3D10_USAGE_DEFAULT; tex2Ddesc.BindFlags = D3D10_BIND_RENDER_TARGET | D3D10_BIND_SHADER_RESOURCE; hr = g_pd3dDevice->CreateTexture2D(&tex2Ddesc, NULL, &g_color.pBuffer); AssertOrQuit(SUCCEEDED(hr)); hr = g_pd3dDevice->CreateShaderResourceView(g_color.pBuffer, NULL, &g_color.pBufferSRV); AssertOrQuit(SUCCEEDED(hr)); hr = g_pd3dDevice->CreateRenderTargetView(g_color.pBuffer, NULL, &g_color.pBufferRTV); AssertOrQuit(SUCCEEDED(hr)); // Create a buffer which will contain the resulting histogram and the SRV to plug it D3D10_BUFFER_DESC bufferDesc; bufferDesc.Usage = D3D10_USAGE_DEFAULT; // NOTE: allocation of more than what is needed to display in the shader // but this 64 factor is required for CUDA to work with this buffer (see BLOCK_N in .cu code...) bufferDesc.ByteWidth = sizeof(unsigned int) * g_HistogramSize * 64/*BLOCK_N*/; bufferDesc.BindFlags = D3D10_BIND_SHADER_RESOURCE; bufferDesc.CPUAccessFlags = 0; bufferDesc.MiscFlags = 0; // useless values... we could remove this... unsigned int values[256 * 64]; for (int i = 0; i < 256 * 64; i++) { values[i] = i; } D3D10_SUBRESOURCE_DATA data; data.pSysMem = values; data.SysMemPitch = 0; data.SysMemSlicePitch = 0; hr = g_pd3dDevice->CreateBuffer(&bufferDesc, &data, &g_histogram.pBuffer); AssertOrQuit(SUCCEEDED(hr)); D3D10_SHADER_RESOURCE_VIEW_DESC bufferSRVDesc; bufferSRVDesc.Format = DXGI_FORMAT_R32_UINT; bufferSRVDesc.ViewDimension = D3D10_SRV_DIMENSION_BUFFER; bufferSRVDesc.Buffer.ElementOffset = 0; bufferSRVDesc.Buffer.ElementWidth = g_HistogramSize; //4*sizeof(unsigned int); hr = g_pd3dDevice->CreateShaderResourceView(g_histogram.pBuffer, &bufferSRVDesc, &g_histogram.pBufferSRV); AssertOrQuit(SUCCEEDED(hr)); // Create the equivalent as a cuda staging buffer that we'll use to write from Cuda. Then we'll copy it to the texture //cudaMalloc(g_histogram.cudaBuffer, sizeof(float) * g_HistogramSize; //getLastCudaError("cudaMallocPitch (g_histogram) failed"); // Setup the viewport D3D10_VIEWPORT vp; vp.Width = g_WindowWidth; vp.Height = g_WindowHeight; vp.MinDepth = 0.0f; vp.MaxDepth = 1.0f; vp.TopLeftX = 0; vp.TopLeftY = 0; g_pd3dDevice->RSSetViewports(1, &vp); // Setup the effect { ID3D10Blob *pErrors = NULL; ID3D10Blob *pCompiledEffect; hr = sFnPtr_D3D10CompileEffectFromMemory( (void *)g_displayEffectSrc, sizeof(g_displayEffectSrc), NULL, NULL, // pDefines NULL, // pIncludes 0, // HLSL flags 0, // FXFlags &pCompiledEffect, &pErrors); if (pErrors) { LPVOID l_pError = NULL; l_pError = pErrors->GetBufferPointer(); // then cast to a char* to see it in the locals window fprintf(stdout, "Compilation error: \n %s", (char *) l_pError); } AssertOrQuit(SUCCEEDED(hr)); hr = sFnPtr_D3D10CreateEffectFromMemory( pCompiledEffect->GetBufferPointer(), pCompiledEffect->GetBufferSize(), 0, // FXFlags g_pd3dDevice, NULL, &g_pDisplayEffect); pCompiledEffect->Release(); g_pDisplayTechnique = g_pDisplayEffect->GetTechniqueByName("Render"); g_pTime = g_pDisplayEffect->GetVariableByName("g_Time")->AsScalar(); } // Setup the effect { ID3D10Blob *pCompiledEffect; ID3D10Blob *pErrors = NULL; hr = sFnPtr_D3D10CompileEffectFromMemory( (void *)g_compositeEffectSrc, sizeof(g_compositeEffectSrc), NULL, NULL, // pDefines NULL, // pIncludes 0, // HLSL flags 0, // FXFlags &pCompiledEffect, &pErrors); if (pErrors) { LPVOID l_pError = NULL; l_pError = pErrors->GetBufferPointer(); // then cast to a char* to see it in the locals window fprintf(stdout, "Compilation error: \n %s", (char *) l_pError); } AssertOrQuit(SUCCEEDED(hr)); hr = sFnPtr_D3D10CreateEffectFromMemory( pCompiledEffect->GetBufferPointer(), pCompiledEffect->GetBufferSize(), 0, // FXFlags g_pd3dDevice, NULL, &g_pCompositeEffect); pCompiledEffect->Release(); g_pCompositeTechnique = g_pCompositeEffect->GetTechniqueByName("Render"); g_pvQuadRect = g_pCompositeEffect->GetVariableByName("g_vQuadRect")->AsVector(); g_pUseCase = g_pCompositeEffect->GetVariableByName("g_UseCase")->AsScalar(); g_pTexture2D = g_pCompositeEffect->GetVariableByName("g_Texture2D")->AsShaderResource(); g_pTexture2D->SetResource(g_color.pBufferSRV); g_pHistogram = g_pCompositeEffect->GetVariableByName("g_Histogram")->AsShaderResource(); g_pHistogram->SetResource(g_histogram.pBufferSRV); } D3D10_RASTERIZER_DESC rasterizerState; rasterizerState.FillMode = D3D10_FILL_SOLID; rasterizerState.CullMode = D3D10_CULL_FRONT; rasterizerState.FrontCounterClockwise = false; rasterizerState.DepthBias = false; rasterizerState.DepthBiasClamp = 0; rasterizerState.SlopeScaledDepthBias = 0; rasterizerState.DepthClipEnable = false; rasterizerState.ScissorEnable = false; rasterizerState.MultisampleEnable = false; rasterizerState.AntialiasedLineEnable = false; g_pd3dDevice->CreateRasterizerState(&rasterizerState, &g_pRasterState); g_pd3dDevice->RSSetState(g_pRasterState); // begin interop cudaD3D10SetDirect3DDevice(g_pd3dDevice); getLastCudaError("cudaD3D10SetDirect3DDevice failed"); return S_OK; }
bool ColorShaderClass::InitializeShader(ID3D11Device* device, HWND hwnd, WCHAR* vsFilename, WCHAR* psFilename) { HRESULT result; ID3D10Blob* errorMessage; ID3D10Blob* vertexShaderBuffer; ID3D10Blob* pixelShaderBuffer; D3D11_INPUT_ELEMENT_DESC polygonLayout[2]; unsigned int numElements; D3D11_BUFFER_DESC matrixBufferDesc; // Initialize the pointers this function will use to null. errorMessage = 0; vertexShaderBuffer = 0; pixelShaderBuffer = 0; //Compile the vertex shader code result = D3DX11CompileFromFile(vsFilename, NULL, NULL, "ColorVertexShader", "vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &vertexShaderBuffer, &errorMessage, NULL); if(FAILED(result)) { //If the shader failed to compile it should have written something to the error message if(errorMessage) { OutputShaderErrorMessage(errorMessage, hwnd, vsFilename); } else { MessageBox(hwnd, vsFilename, L"Missing Shader File", MB_OK); } return false; } // Compile the pixel shader code. result = D3DX11CompileFromFile(psFilename, NULL, NULL, "ColorPixelShader", "ps_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &pixelShaderBuffer, &errorMessage, NULL); if(FAILED(result)) { // If the shader failed to compile it should have writen something to the error message. if(errorMessage) { OutputShaderErrorMessage(errorMessage, hwnd, psFilename); } // If there was nothing in the error message then it simply could not find the file itself. else { MessageBox(hwnd, psFilename, L"Missing Shader File", MB_OK); } return false; } //Create the vertex shader from the buffer result = device->CreateVertexShader(vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), NULL, &m_vertexShader); if(FAILED(result)) return false; //Create the pixel shader from the buffer result = device->CreatePixelShader(pixelShaderBuffer->GetBufferPointer(), pixelShaderBuffer->GetBufferSize(), NULL, &m_pixelShader); if(FAILED(result)) return false; //Now setup the layout of the data that goes into the shader //This setup needs to match the VertexType structure in the ModellClass and in the shader polygonLayout[0].SemanticName = "Position"; polygonLayout[0].SemanticIndex = 0; polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[0].InputSlot = 0; polygonLayout[0].AlignedByteOffset= 0; polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[0].InstanceDataStepRate = 0; polygonLayout[1].SemanticName = "COLOR"; polygonLayout[1].SemanticIndex = 0; polygonLayout[1].Format = DXGI_FORMAT_R32G32B32A32_FLOAT; polygonLayout[1].InputSlot = 0; polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[1].InstanceDataStepRate = 0; //Get a count of the elements in the layout numElements = sizeof(polygonLayout) / sizeof(polygonLayout[0]); //Create the vertex input layout result = device->CreateInputLayout(polygonLayout, numElements, vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), &m_layout); if(FAILED(result)) return false; //Release the vertex shader buffer and pixel shader buffer since they are no longer needed. vertexShaderBuffer->Release(); vertexShaderBuffer = 0; pixelShaderBuffer->Release(); pixelShaderBuffer = 0; //Setup the description of the dynamic matrix constant buffer that is in the vertex shader matrixBufferDesc.Usage = D3D11_USAGE_DYNAMIC; matrixBufferDesc.ByteWidth = sizeof(MatrixBufferType); matrixBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; matrixBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; matrixBufferDesc.MiscFlags = 0; matrixBufferDesc.StructureByteStride = 0; //Create the constant buffer pointer so we can access the vertex shader constant buffer from within this class result = device->CreateBuffer(&matrixBufferDesc, NULL, &m_matrixBuffer); if(FAILED(result)) return false; return true; }
bool ColorShader::InitializeShader(ID3D11Device* device, HWND hwnd, LPCSTR vsFilename, LPCSTR psFilename) { HRESULT result; ID3D10Blob* errorMessage; ID3D10Blob* vertexShaderBuffer; ID3D10Blob* pixelShaderBuffer; D3D11_INPUT_ELEMENT_DESC polygonLayout[2]; unsigned int numElements; D3D11_BUFFER_DESC matrixBufferDesc; errorMessage = 0; vertexShaderBuffer = 0; pixelShaderBuffer = 0; result = D3DX11CompileFromFile(vsFilename, NULL, NULL, "main", "vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &vertexShaderBuffer, &errorMessage, NULL); if (FAILED(result)) { if (errorMessage) { OutputShaderErrorMessage(errorMessage, hwnd, vsFilename); } else { MessageBox(hwnd, (LPCSTR)vsFilename, "Missing Shader File", MB_OK); } return false; } result = D3DX11CompileFromFile(psFilename, NULL, NULL, "main", "ps_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &pixelShaderBuffer, &errorMessage, NULL); if (FAILED(result)) { if (errorMessage) { OutputShaderErrorMessage(errorMessage, hwnd, psFilename); } else { MessageBox(hwnd, (LPCSTR)psFilename, "Missing Shader File", MB_OK); } return false; } result = device->CreateVertexShader(vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), NULL, &m_vertexShader); if (FAILED(result)) { return false; } result = device->CreatePixelShader(pixelShaderBuffer->GetBufferPointer(), pixelShaderBuffer->GetBufferSize(), NULL, &m_pixelShader); if (FAILED(result)) { return false; } polygonLayout[0].SemanticName = "POSITION"; polygonLayout[0].SemanticIndex = 0; polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[0].InputSlot = 0; polygonLayout[0].AlignedByteOffset = 0; polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[0].InstanceDataStepRate = 0; polygonLayout[1].SemanticName = "COLOR"; polygonLayout[1].SemanticIndex = 0; polygonLayout[1].Format = DXGI_FORMAT_R32G32B32A32_FLOAT; polygonLayout[1].InputSlot = 0; polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[1].InstanceDataStepRate = 0; numElements = sizeof(polygonLayout) / sizeof(polygonLayout[0]); result = device->CreateInputLayout(polygonLayout, numElements, vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), &m_layout); if (FAILED(result)) { return false; } vertexShaderBuffer->Release(); vertexShaderBuffer = 0; pixelShaderBuffer->Release(); pixelShaderBuffer = 0; // matrix desc matrixBufferDesc.Usage = D3D11_USAGE_DYNAMIC; matrixBufferDesc.ByteWidth = sizeof(MatrixBufferType); matrixBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; matrixBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; matrixBufferDesc.MiscFlags = 0; matrixBufferDesc.StructureByteStride = 0; result = device->CreateBuffer(&matrixBufferDesc, NULL, &m_matrixBuffer); if (FAILED(result)) { return false; } return true; }
App::App(ID3D11Device *d3dDevice, unsigned int activeLights, unsigned int msaaSamples) : mMSAASamples(msaaSamples) , mTotalTime(0.0f) , mActiveLights(0) , mLightBuffer(0) , mDepthBufferReadOnlyDSV(0) { std::string msaaSamplesStr; { std::ostringstream oss; oss << mMSAASamples; msaaSamplesStr = oss.str(); } // Set up macros D3D10_SHADER_MACRO defines[] = { {"MSAA_SAMPLES", msaaSamplesStr.c_str()}, {0, 0} }; #pragma region CreateEverything // Create shaders, Careful moving the shaders. Moving them causes memory exceptions during runtime. #pragma region Create Shaders mGeometryVS = new VertexShader(d3dDevice, L"Rendering.hlsl", "GeometryVS", defines); mGBufferPS = new PixelShader(d3dDevice, L"GBuffer.hlsl", "GBufferPS", defines); mGBufferAlphaTestPS = new PixelShader(d3dDevice, L"GBuffer.hlsl", "GBufferAlphaTestPS", defines); mForwardPS = new PixelShader(d3dDevice, L"Forward.hlsl", "ForwardPS", defines); mForwardAlphaTestPS = new PixelShader(d3dDevice, L"Forward.hlsl", "ForwardAlphaTestPS", defines); mForwardAlphaTestOnlyPS = new PixelShader(d3dDevice, L"Forward.hlsl", "ForwardAlphaTestOnlyPS", defines); mFullScreenTriangleVS = new VertexShader(d3dDevice, L"Rendering.hlsl", "FullScreenTriangleVS", defines); mSkyboxVS = new VertexShader(d3dDevice, L"SkyboxToneMap.hlsl", "SkyboxVS", defines); mSkyboxPS = new PixelShader(d3dDevice, L"SkyboxToneMap.hlsl", "SkyboxPS", defines); mRequiresPerSampleShadingPS = new PixelShader(d3dDevice, L"GBuffer.hlsl", "RequiresPerSampleShadingPS", defines); mBasicLoopPS = new PixelShader(d3dDevice, L"BasicLoop.hlsl", "BasicLoopPS", defines); mBasicLoopPerSamplePS = new PixelShader(d3dDevice, L"BasicLoop.hlsl", "BasicLoopPerSamplePS", defines); mComputeShaderTileCS = new ComputeShader(d3dDevice, L"ComputeShaderTile.hlsl", "ComputeShaderTileCS", defines); mGPUQuadVS = new VertexShader(d3dDevice, L"GPUQuad.hlsl", "GPUQuadVS", defines); mGPUQuadGS = new GeometryShader(d3dDevice, L"GPUQuad.hlsl", "GPUQuadGS", defines); mGPUQuadPS = new PixelShader(d3dDevice, L"GPUQuad.hlsl", "GPUQuadPS", defines); mGPUQuadPerSamplePS = new PixelShader(d3dDevice, L"GPUQuad.hlsl", "GPUQuadPerSamplePS", defines); mGPUQuadDLPS = new PixelShader(d3dDevice, L"GPUQuadDL.hlsl", "GPUQuadDLPS", defines); mGPUQuadDLPerSamplePS = new PixelShader(d3dDevice, L"GPUQuadDL.hlsl", "GPUQuadDLPerSamplePS", defines); mGPUQuadDLResolvePS = new PixelShader(d3dDevice, L"GPUQuadDL.hlsl", "GPUQuadDLResolvePS", defines); mGPUQuadDLResolvePerSamplePS = new PixelShader(d3dDevice, L"GPUQuadDL.hlsl", "GPUQuadDLResolvePerSamplePS", defines); #pragma endregion // Create input layout #pragma region Create input layout { // We need the vertex shader bytecode for this... rather than try to wire that all through the // shader interface, just recompile the vertex shader. UINT shaderFlags = D3D10_SHADER_ENABLE_STRICTNESS | D3D10_SHADER_PACK_MATRIX_ROW_MAJOR; ID3D10Blob *bytecode = 0; HRESULT hr = D3DX11CompileFromFile(L"Rendering.hlsl", defines, 0, "GeometryVS", "vs_5_0", shaderFlags, 0, 0, &bytecode, 0, 0); if (FAILED(hr)) { assert(false); // It worked earlier... } const D3D11_INPUT_ELEMENT_DESC layout[] = { {"position", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}, {"normal", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0}, {"texCoord", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0}, }; d3dDevice->CreateInputLayout( layout, ARRAYSIZE(layout), bytecode->GetBufferPointer(), bytecode->GetBufferSize(), &mMeshVertexLayout); bytecode->Release(); } #pragma endregion // Create standard rasterizer state { CD3D11_RASTERIZER_DESC desc(D3D11_DEFAULT); d3dDevice->CreateRasterizerState(&desc, &mRasterizerState); desc.CullMode = D3D11_CULL_NONE; d3dDevice->CreateRasterizerState(&desc, &mDoubleSidedRasterizerState); } { CD3D11_DEPTH_STENCIL_DESC desc(D3D11_DEFAULT); // NOTE: Complementary Z => GREATER test desc.DepthFunc = D3D11_COMPARISON_GREATER_EQUAL; d3dDevice->CreateDepthStencilState(&desc, &mDepthState); } // Stencil states for MSAA { CD3D11_DEPTH_STENCIL_DESC desc( FALSE, D3D11_DEPTH_WRITE_MASK_ZERO, D3D11_COMPARISON_GREATER_EQUAL, // Depth TRUE, 0xFF, 0xFF, // Stencil D3D11_STENCIL_OP_REPLACE, D3D11_STENCIL_OP_REPLACE, D3D11_STENCIL_OP_REPLACE, D3D11_COMPARISON_ALWAYS, // Front face stencil D3D11_STENCIL_OP_REPLACE, D3D11_STENCIL_OP_REPLACE, D3D11_STENCIL_OP_REPLACE, D3D11_COMPARISON_ALWAYS // Back face stencil ); d3dDevice->CreateDepthStencilState(&desc, &mWriteStencilState); } { CD3D11_DEPTH_STENCIL_DESC desc( TRUE, D3D11_DEPTH_WRITE_MASK_ZERO, D3D11_COMPARISON_GREATER_EQUAL, // Depth TRUE, 0xFF, 0xFF, // Stencil D3D11_STENCIL_OP_KEEP, D3D11_STENCIL_OP_KEEP, D3D11_STENCIL_OP_KEEP, D3D11_COMPARISON_EQUAL, // Front face stencil D3D11_STENCIL_OP_KEEP, D3D11_STENCIL_OP_KEEP, D3D11_STENCIL_OP_KEEP, D3D11_COMPARISON_EQUAL // Back face stencil ); d3dDevice->CreateDepthStencilState(&desc, &mEqualStencilState); } // Create geometry phase blend state { CD3D11_BLEND_DESC desc(D3D11_DEFAULT); d3dDevice->CreateBlendState(&desc, &mGeometryBlendState); } // Create lighting phase blend state { CD3D11_BLEND_DESC desc(D3D11_DEFAULT); // Additive blending desc.RenderTarget[0].BlendEnable = true; desc.RenderTarget[0].SrcBlend = D3D11_BLEND_ONE; desc.RenderTarget[0].DestBlend = D3D11_BLEND_ONE; desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE; desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ONE; desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; d3dDevice->CreateBlendState(&desc, &mLightingBlendState); } // Create constant buffers { CD3D11_BUFFER_DESC desc( sizeof(PerFrameConstants), D3D11_BIND_CONSTANT_BUFFER, D3D11_USAGE_DYNAMIC, D3D11_CPU_ACCESS_WRITE); d3dDevice->CreateBuffer(&desc, 0, &mPerFrameConstants); } // Create sampler state { CD3D11_SAMPLER_DESC desc(D3D11_DEFAULT); desc.Filter = D3D11_FILTER_ANISOTROPIC; desc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; desc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; desc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; desc.MaxAnisotropy = 16; d3dDevice->CreateSamplerState(&desc, &mDiffuseSampler); } // Create skybox mesh mSkyboxMesh.Create(d3dDevice, L"Media\\Skybox\\Skybox.sdkmesh"); InitializeLightParameters(d3dDevice); SetActiveLights(d3dDevice, activeLights); #pragma endregion }
bool FontShaderHandler::InitializeShader(ID3D11Device* device, WCHAR* vsFilename, WCHAR* psFilename) { HRESULT hresult; ID3D10Blob* errorMessage; ID3D10Blob* vertexShaderBuffer; ID3D10Blob* pixelShaderBuffer; D3D11_INPUT_ELEMENT_DESC polygonLayout[2]; unsigned int numElements; D3D11_BUFFER_DESC matrixBufferDesc; D3D11_SAMPLER_DESC samplerDesc; //init pointers to nullptr errorMessage = nullptr; vertexShaderBuffer = nullptr; pixelShaderBuffer = nullptr; //Compile the vertex shader code hresult = D3DCompileFromFile(vsFilename, NULL, NULL, "main", "vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, &vertexShaderBuffer, &errorMessage); if (FAILED(hresult)) { if (errorMessage) { OutputShaderErrorMessage(errorMessage, vsFilename); } return false; } //Compile the pixel shader code hresult = D3DCompileFromFile(psFilename, NULL, NULL, "main", "ps_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, &pixelShaderBuffer, &errorMessage); if (FAILED(hresult)) { if (errorMessage) { OutputShaderErrorMessage(errorMessage, psFilename); } return false; } //Create the vertex shader from buffer hresult = device->CreateVertexShader(vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), NULL, &this->vertexShader); if (FAILED(hresult)) { return false; } //Create the pixel shader from buffer hresult = device->CreatePixelShader(pixelShaderBuffer->GetBufferPointer(), pixelShaderBuffer->GetBufferSize(), NULL, &this->pixelShader); if (FAILED(hresult)) { return false; } //Fill the vertex input layout description //This needs to match the Model and shader polygonLayout[0].SemanticName = "POSITION"; polygonLayout[0].SemanticIndex = 0; polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[0].InputSlot = 0; polygonLayout[0].AlignedByteOffset = 0; polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[0].InstanceDataStepRate = 0; polygonLayout[1].SemanticName = "TEXCOORD"; polygonLayout[1].SemanticIndex = 0; polygonLayout[1].Format = DXGI_FORMAT_R32G32_FLOAT; polygonLayout[1].InputSlot = 0; //polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; polygonLayout[1].AlignedByteOffset = 12; polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[1].InstanceDataStepRate = 0; //Get the number of elements in the layout numElements = sizeof(polygonLayout) / sizeof(polygonLayout[0]); //Create the vertex input layout. hresult = device->CreateInputLayout(polygonLayout, numElements, vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), &this->layout); if (FAILED(hresult)) { return false; } //Release and nullptr the buffers as they are no longer needed vertexShaderBuffer->Release(); vertexShaderBuffer = nullptr; pixelShaderBuffer->Release(); pixelShaderBuffer = nullptr; //Fill the description of the dynamic matrix constant buffer that is in the vertex shader matrixBufferDesc.Usage = D3D11_USAGE_DYNAMIC; matrixBufferDesc.ByteWidth = sizeof(MatrixBufferSimple); matrixBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; matrixBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; matrixBufferDesc.MiscFlags = 0; matrixBufferDesc.StructureByteStride = 0; // Create the constant buffer pointer so we can access the vertex shader constant buffer from within this class. hresult = device->CreateBuffer(&matrixBufferDesc, NULL, &this->matrixBuffer); if (FAILED(hresult)) { return false; } //Fill the texture sampler state description samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT; samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.MipLODBias = 0.0f; samplerDesc.MaxAnisotropy = 1; samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; samplerDesc.BorderColor[0] = 0; samplerDesc.BorderColor[1] = 0; samplerDesc.BorderColor[2] = 0; samplerDesc.BorderColor[3] = 0; samplerDesc.MinLOD = 0; samplerDesc.MaxLOD = D3D11_FLOAT32_MAX; //Create the texture sampler state hresult = device->CreateSamplerState(&samplerDesc, &this->samplerState); if (FAILED(hresult)) { return false; } D3D11_RENDER_TARGET_BLEND_DESC rtbd; ZeroMemory(&rtbd, sizeof(rtbd)); rtbd.BlendEnable = true; rtbd.SrcBlend = D3D11_BLEND_INV_SRC_ALPHA; rtbd.DestBlend = D3D11_BLEND_SRC_ALPHA; rtbd.BlendOp = D3D11_BLEND_OP_ADD; rtbd.SrcBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA; rtbd.DestBlendAlpha = D3D11_BLEND_SRC_ALPHA; rtbd.BlendOpAlpha = D3D11_BLEND_OP_ADD; rtbd.RenderTargetWriteMask = D3D10_COLOR_WRITE_ENABLE_ALL; D3D11_BLEND_DESC blendDesc; ZeroMemory(&blendDesc, sizeof(blendDesc)); blendDesc.AlphaToCoverageEnable = false; blendDesc.RenderTarget[0] = rtbd; device->CreateBlendState(&blendDesc, &this->transparencyBlendState); return true; }
bool FontShader::InitializeShader(ID3D11Device* device, HWND hwnd, LPCSTR vsFilename, LPCSTR psFilename) { //////////////// loads the shader files and makes it usable to DirectX and the GPU HRESULT result; ID3D10Blob* errorMessage; ID3D10Blob* vertexShaderBuffer; ID3D10Blob* pixelShaderBuffer; D3D11_INPUT_ELEMENT_DESC polygonLayout[2]; unsigned int numElements; D3D11_BUFFER_DESC matrixBufferDesc; D3D11_BUFFER_DESC transparentBufferDesc; D3D11_SAMPLER_DESC samplerDesc; errorMessage = nullptr; vertexShaderBuffer = nullptr; pixelShaderBuffer = nullptr; // shader compilation into buffers result = D3DX11CompileFromFile(vsFilename, NULL, NULL, "FontVertexShader", "vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &vertexShaderBuffer, &errorMessage, NULL); if (FAILED(result)) { if (errorMessage) { OutputShaderErrorMessage(errorMessage, hwnd, vsFilename); } else { MessageBox(hwnd, vsFilename, "Missing Vertex Shader file!", MB_OK); } return false; } result = D3DX11CompileFromFile(psFilename, NULL, NULL, "FontPixelShader", "ps_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &pixelShaderBuffer, &errorMessage, NULL); if (FAILED(result)) { if (errorMessage) { OutputShaderErrorMessage(errorMessage, hwnd, psFilename); } else { MessageBox(hwnd, psFilename, "Missing Pixel Shader file!", MB_OK); } return false; } // using buffers to create shader object themselves result = device->CreateVertexShader(vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), NULL, &m_vertexShader); if (FAILED(result)) return false; result = device->CreatePixelShader(pixelShaderBuffer->GetBufferPointer(), pixelShaderBuffer->GetBufferSize(), NULL, &m_pixelShader); if (FAILED(result)) return false; // setting up LAYOUT of data that goes into shader - matches Vertex type in Model class and Shader polygonLayout[0].SemanticName = "POSITION"; polygonLayout[0].SemanticIndex = 0; polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[0].InputSlot = 0; polygonLayout[0].AlignedByteOffset = 0; // important! polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[0].InstanceDataStepRate = 0; polygonLayout[1].SemanticName = "TEXCOORD"; polygonLayout[1].SemanticIndex = 0; polygonLayout[1].Format = DXGI_FORMAT_R32G32_FLOAT; polygonLayout[1].InputSlot = 0; polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; // "border" between position and color - automatically solved by DX11 polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[1].InstanceDataStepRate = 0; // size of layout desc numElements = sizeof(polygonLayout) / sizeof(polygonLayout[0]); // creating input layout result = device->CreateInputLayout(polygonLayout, numElements, vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), &m_layout); if (FAILED(result)) return false; vertexShaderBuffer->Release(); vertexShaderBuffer = nullptr; pixelShaderBuffer->Release(); vertexShaderBuffer = nullptr; // setting vertex buffer as constant buffer matrixBufferDesc.Usage = D3D11_USAGE_DYNAMIC; // because we want to refresh it every frame matrixBufferDesc.ByteWidth = sizeof(MatrixBuffer); matrixBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; // because I don't know :( matrixBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; matrixBufferDesc.MiscFlags = 0; matrixBufferDesc.StructureByteStride = 0; //creating pointer to constant buffer result = device->CreateBuffer(&matrixBufferDesc, NULL, &m_matrixBuffer); if (FAILED(result)) return false; // NEW - for texture sampler setup samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.MipLODBias = 0.0f; samplerDesc.MaxAnisotropy = 1; samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; samplerDesc.BorderColor[0] = 0; samplerDesc.BorderColor[1] = 0; samplerDesc.BorderColor[2] = 0; samplerDesc.BorderColor[3] = 0; samplerDesc.MinLOD = 0; samplerDesc.MaxLOD = D3D11_FLOAT32_MAX; //create texture sampler state result = device->CreateSamplerState(&samplerDesc, &m_sampleState); if (FAILED(result)) return false; // setup the constant buffer in the transparency pixel shader transparentBufferDesc.Usage = D3D11_USAGE_DYNAMIC; transparentBufferDesc.ByteWidth = sizeof(PixelBuffer); transparentBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; transparentBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; transparentBufferDesc.MiscFlags = 0; transparentBufferDesc.StructureByteStride = 0; result = device->CreateBuffer(&transparentBufferDesc, NULL, &m_pixelBuffer); if (FAILED(result)) return false; return true; }
bool Effect::Init(const std::string& aEffectFile) { myFileName = aEffectFile; HRESULT hr; unsigned int shaderFlags = 0; #if defined (DEBUG) || defined(_DEBUG) shaderFlags |= D3D10_SHADER_DEBUG; #endif ID3D10Blob* compiledShader = nullptr; ID3D10Blob* compilationMsgs = nullptr; hr = D3DX11CompileFromFile(aEffectFile.c_str(), 0, 0, 0, "fx_5_0", shaderFlags, 0, 0, &compiledShader, &compilationMsgs, 0); if (FAILED(hr)) { if (compilationMsgs != nullptr) { DL_MESSAGE_BOX((char*)compilationMsgs->GetBufferPointer(), "Effect Error", MB_ICONWARNING); } } if (compilationMsgs != nullptr) { compilationMsgs->Release(); } hr = D3DX11CreateEffectFromMemory(compiledShader->GetBufferPointer(), compiledShader->GetBufferSize(), NULL, Engine::GetInstance()->GetDevice(), &myEffect); if (FAILED(hr)) { DL_MESSAGE_BOX("Cant Create Effect", "Effect Error", MB_ICONWARNING); return false; } myTechnique = myEffect->GetTechniqueByName("Render"); if (myTechnique->IsValid() == false) { DL_MESSAGE_BOX("Failed to get Technique", "Effect Error", MB_ICONWARNING); return false; } myWorldMatrixVariable = myEffect->GetVariableByName("World")->AsMatrix(); if (myWorldMatrixVariable->IsValid() == false) { DL_MESSAGE_BOX("Failed to get WorldMatrix", "Effect Error", MB_ICONWARNING); return false; } myViewMatrixVariable = myEffect->GetVariableByName("View")->AsMatrix(); if (myViewMatrixVariable->IsValid() == false) { DL_MESSAGE_BOX("Failed to get ViewMatrix", "Effect Error", MB_ICONWARNING); return false; } myProjectionMatrixVariable = myEffect->GetVariableByName("Projection")->AsMatrix(); if (myProjectionMatrixVariable->IsValid() == false) { DL_MESSAGE_BOX("Failed to get ProjectionMatrix", "Effect Error", MB_ICONWARNING); return false; } myDirectionalLigthColor = myEffect->GetVariableByName("myLightColor")->AsVector(); if (myDirectionalLigthColor->IsValid() == false) { DL_MESSAGE_BOX("Failed to get LightColor", "Effect Error", MB_ICONWARNING); return false; } myDirectionalLightDirection = myEffect->GetVariableByName("myLightDir")->AsVector(); if (myDirectionalLightDirection->IsValid() == false) { DL_MESSAGE_BOX("Failed to get LightDirection", "Effect Error", MB_ICONWARNING); return false; } myTotalTimeVariable = nullptr; myTotalTimeVariable = myEffect->GetVariableByName("Time")->AsScalar(); if (myTotalTimeVariable->IsValid() == false) { myTotalTimeVariable = nullptr; } return true; }
bool LightShaderClass::initializeShader( ID3D11Device *aD3DDevice, HWND aHwnd, WCHAR *aVSFileName, WCHAR *aPSFileName ) { HRESULT result; ID3D10Blob* errorMessage; ID3D10Blob* vertexShaderBuffer; ID3D10Blob* pixelShaderBuffer; D3D11_INPUT_ELEMENT_DESC polygonLayout[3]; unsigned int numElements; D3D11_SAMPLER_DESC samplerDesc; D3D11_BUFFER_DESC matrixBufferDesc; D3D11_BUFFER_DESC lightBufferDesc; errorMessage = 0; vertexShaderBuffer = 0; pixelShaderBuffer = 0; result = D3DX11CompileFromFile( aVSFileName, NULL, NULL, "lightVertexShader", "vs_4_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &vertexShaderBuffer, &errorMessage, NULL); if(FAILED(result)) { if(errorMessage) { outputShaderErrorMessage( errorMessage, aHwnd, aVSFileName); } else { MessageBox(aHwnd, aVSFileName, L"Missing Shader File", MB_OK); } return false; } result = D3DX11CompileFromFile( aPSFileName, NULL, NULL, "lightPixelShader", "ps_4_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &pixelShaderBuffer, &errorMessage, NULL); if(FAILED(result)) { if(errorMessage) { outputShaderErrorMessage( errorMessage, aHwnd, aPSFileName); } else { MessageBox(aHwnd, aPSFileName, L"Missing Shader File", MB_OK); } return false; } result = aD3DDevice->CreateVertexShader( vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), NULL, &m_vertexShader); if(FAILED(result)) { return false; } result = aD3DDevice->CreatePixelShader( pixelShaderBuffer->GetBufferPointer(), pixelShaderBuffer->GetBufferSize(), NULL, &m_pixelShader); if(FAILED(result)) { return false; } polygonLayout[0].SemanticName = "POSITION"; polygonLayout[0].SemanticIndex = 0; polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[0].InputSlot = 0; polygonLayout[0].AlignedByteOffset = 0; polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[0].InstanceDataStepRate = 0; polygonLayout[1].SemanticName = "TEXCOORD"; polygonLayout[1].SemanticIndex = 0; polygonLayout[1].Format = DXGI_FORMAT_R32G32_FLOAT; polygonLayout[1].InputSlot = 0; polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[1].InstanceDataStepRate = 0; polygonLayout[2].SemanticName = "NORMAL"; polygonLayout[2].SemanticIndex = 0; polygonLayout[2].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[2].InputSlot = 0; polygonLayout[2].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; polygonLayout[2].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[2].InstanceDataStepRate = 0; numElements = sizeof(polygonLayout) / sizeof(polygonLayout[0]); result = aD3DDevice->CreateInputLayout( polygonLayout, numElements, vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), &m_layout); if(FAILED(result)) { return false; } vertexShaderBuffer->Release(); vertexShaderBuffer = 0; pixelShaderBuffer->Release(); pixelShaderBuffer = 0; samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.MipLODBias = 0.0f; samplerDesc.MaxAnisotropy = 1; samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; samplerDesc.BorderColor[0] = 0; samplerDesc.BorderColor[1] = 0; samplerDesc.BorderColor[2] = 0; samplerDesc.BorderColor[3] = 0; samplerDesc.MinLOD = 0; samplerDesc.MaxLOD = D3D11_FLOAT32_MAX; result = aD3DDevice->CreateSamplerState( &samplerDesc, &m_sampleState); if(FAILED(result)) { return false; } matrixBufferDesc.Usage = D3D11_USAGE_DYNAMIC; matrixBufferDesc.ByteWidth = sizeof(MatrixBufferType); matrixBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; matrixBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; matrixBufferDesc.MiscFlags = 0; matrixBufferDesc.StructureByteStride = 0; result = aD3DDevice->CreateBuffer( &matrixBufferDesc, NULL, &m_matrixBuffer); if(FAILED(result)) { return false; } lightBufferDesc.Usage = D3D11_USAGE_DYNAMIC; lightBufferDesc.ByteWidth = sizeof(LightBufferType); lightBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; lightBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; lightBufferDesc.MiscFlags = 0; lightBufferDesc.StructureByteStride = 0; result = aD3DDevice->CreateBuffer( &lightBufferDesc, NULL, &m_lightBuffer); if(FAILED(result)) { return false; } return true; }
// Loads the shader in from the file and gets the pointers to the variables within the shader // Complete with error feedback and debugging bool LightShaderClass::InitializeShader(ID3D10Device* device, HWND hwnd, WCHAR* filename) { HRESULT result; ID3D10Blob* errorMessage; D3D10_INPUT_ELEMENT_DESC polygonLayout[6]; unsigned int numElements; D3D10_PASS_DESC passDesc; // Initialize the error message. errorMessage = 0; // Load the shader in from the file. result = D3DX10CreateEffectFromFile(filename, NULL, NULL, "fx_4_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, device, NULL, NULL, &m_effect, &errorMessage, NULL); if(FAILED(result)) { if(errorMessage) { Log::COut("Shader failed to compile"); Log::COut((char*)(errorMessage->GetBufferPointer())); // Release the error message. errorMessage->Release(); errorMessage = 0; } else { Log::COut("Missing shader file"); } return false; } // Get a pointer to the technique inside the shader. m_technique = m_effect->GetTechniqueByName("LightTechnique"); if(!m_technique) { return false; } // Now setup the layout of the data that goes into the shader. // This setup needs to match the VertexType stucture in the ModelClass and in the shader. polygonLayout[0].SemanticName = "POSITION"; polygonLayout[0].SemanticIndex = 0; polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[0].InputSlot = 0; polygonLayout[0].AlignedByteOffset = 0; polygonLayout[0].InputSlotClass = D3D10_INPUT_PER_VERTEX_DATA; polygonLayout[0].InstanceDataStepRate = 0; polygonLayout[1].SemanticName = "TEXCOORD"; polygonLayout[1].SemanticIndex = 0; polygonLayout[1].Format = DXGI_FORMAT_R32G32_FLOAT; polygonLayout[1].InputSlot = 0; polygonLayout[1].AlignedByteOffset = D3D10_APPEND_ALIGNED_ELEMENT; polygonLayout[1].InputSlotClass = D3D10_INPUT_PER_VERTEX_DATA; polygonLayout[1].InstanceDataStepRate = 0; polygonLayout[2].SemanticName = "NORMAL"; polygonLayout[2].SemanticIndex = 0; polygonLayout[2].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[2].InputSlot = 0; polygonLayout[2].AlignedByteOffset = D3D10_APPEND_ALIGNED_ELEMENT; polygonLayout[2].InputSlotClass = D3D10_INPUT_PER_VERTEX_DATA; polygonLayout[2].InstanceDataStepRate = 0; polygonLayout[3].SemanticName = "TESTCOORD"; polygonLayout[3].SemanticIndex = 1; polygonLayout[3].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[3].InputSlot = 1; polygonLayout[3].AlignedByteOffset = 0; polygonLayout[3].InputSlotClass = D3D10_INPUT_PER_INSTANCE_DATA; polygonLayout[3].InstanceDataStepRate = 1; polygonLayout[4].SemanticName = "TANGENT"; polygonLayout[4].SemanticIndex = 0; polygonLayout[4].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[4].InputSlot = 0; polygonLayout[4].AlignedByteOffset = D3D10_APPEND_ALIGNED_ELEMENT; polygonLayout[4].InputSlotClass = D3D10_INPUT_PER_VERTEX_DATA; polygonLayout[4].InstanceDataStepRate = 0; polygonLayout[5].SemanticName = "BINORMAL"; polygonLayout[5].SemanticIndex = 0; polygonLayout[5].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[5].InputSlot = 0; polygonLayout[5].AlignedByteOffset = D3D10_APPEND_ALIGNED_ELEMENT; polygonLayout[5].InputSlotClass = D3D10_INPUT_PER_VERTEX_DATA; polygonLayout[5].InstanceDataStepRate = 0; // Get a count of the elements in the layout. numElements = sizeof(polygonLayout) / sizeof(polygonLayout[0]); // Get the description of the first pass described in the shader technique. m_technique->GetPassByIndex(0)->GetDesc(&passDesc); // Create the input layout. result = device->CreateInputLayout(polygonLayout, numElements, passDesc.pIAInputSignature, passDesc.IAInputSignatureSize, &m_layout); if(FAILED(result)) { return false; } // Get pointers to the variables within the shader m_worldMatrixPtr = m_effect->GetVariableByName("worldMatrix")->AsMatrix(); m_viewMatrixPtr = m_effect->GetVariableByName("viewMatrix")->AsMatrix(); m_projectionMatrixPtr = m_effect->GetVariableByName("projectionMatrix")->AsMatrix(); m_textureArrayPtr = m_effect->GetVariableByName("shaderTexture")->AsShaderResource(); m_lightDirectionPtr = m_effect->GetVariableByName("lightDirection")->AsVector(); m_ambientColorPtr = m_effect->GetVariableByName("ambientColor")->AsVector(); m_diffuseColorPtr = m_effect->GetVariableByName("diffuseColor")->AsVector(); cameraPositionPtr = m_effect->GetVariableByName("cameraPosition")->AsVector(); specularColorPtr = m_effect->GetVariableByName("specularColor")->AsVector(); specularPowerPtr = m_effect->GetVariableByName("specularPower")->AsScalar(); return true; }
bool TransparentShaderClass::InitializeShader(ID3D11Device* device, HWND hwnd, WCHAR* vsFilename, WCHAR* psFilename) { HRESULT result; ID3D10Blob* errorMessage; ID3D10Blob* vertexShaderBuffer; ID3D10Blob* pixelShaderBuffer; D3D11_INPUT_ELEMENT_DESC polygonLayout[2]; unsigned int numElements; D3D11_BUFFER_DESC matrixBufferDesc; D3D11_SAMPLER_DESC samplerDesc; D3D11_BUFFER_DESC transparentBufferDesc; // Initialize the pointers this function will use to null. errorMessage = 0; vertexShaderBuffer = 0; pixelShaderBuffer = 0; // Compile the vertex shader code. result = D3DX11CompileFromFile(vsFilename, NULL, NULL, "TransparentVertexShader", "vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &vertexShaderBuffer, &errorMessage, NULL); if (FAILED(result)) { // If the shader failed to compile it should have writen something to the error message. if (errorMessage) { OutputShaderErrorMessage(errorMessage, hwnd, vsFilename); } // If there was nothing in the error message then it simply could not find the shader file itself. else { MessageBox(hwnd, vsFilename, L"Missing Shader File", MB_OK); } return false; } // Compile the pixel shader code. result = D3DX11CompileFromFile(psFilename, NULL, NULL, "TransparentPixelShader", "ps_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &pixelShaderBuffer, &errorMessage, NULL); if (FAILED(result)) { // If the shader failed to compile it should have writen something to the error message. if (errorMessage) { OutputShaderErrorMessage(errorMessage, hwnd, psFilename); } // If there was nothing in the error message then it simply could not find the file itself. else { MessageBox(hwnd, psFilename, L"Missing Shader File", MB_OK); } return false; } // Create the vertex shader from the buffer. result = device->CreateVertexShader(vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), NULL, &m_vertexShader); if (FAILED(result)) { return false; } // Create the vertex shader from the buffer. result = device->CreatePixelShader(pixelShaderBuffer->GetBufferPointer(), pixelShaderBuffer->GetBufferSize(), NULL, &m_pixelShader); if (FAILED(result)) { return false; } // Create the vertex input layout description. // This setup needs to match the VertexType stucture in the ModelClass and in the shader. polygonLayout[0].SemanticName = "POSITION"; polygonLayout[0].SemanticIndex = 0; polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; polygonLayout[0].InputSlot = 0; polygonLayout[0].AlignedByteOffset = 0; polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[0].InstanceDataStepRate = 0; polygonLayout[1].SemanticName = "TEXCOORD"; polygonLayout[1].SemanticIndex = 0; polygonLayout[1].Format = DXGI_FORMAT_R32G32_FLOAT; polygonLayout[1].InputSlot = 0; polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[1].InstanceDataStepRate = 0; // Get a count of the elements in the layout. numElements = sizeof(polygonLayout) / sizeof(polygonLayout[0]); // Create the vertex input layout. result = device->CreateInputLayout(polygonLayout, numElements, vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), &m_layout); if (FAILED(result)) { return false; } // Release the vertex shader buffer and pixel shader buffer since they are no longer needed. vertexShaderBuffer->Release(); vertexShaderBuffer = 0; pixelShaderBuffer->Release(); pixelShaderBuffer = 0; // Setup the description of the dynamic constant buffer that is in the vertex shader. matrixBufferDesc.Usage = D3D11_USAGE_DYNAMIC; matrixBufferDesc.ByteWidth = sizeof(MatrixBufferType); matrixBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; matrixBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; matrixBufferDesc.MiscFlags = 0; matrixBufferDesc.StructureByteStride = 0; // Create the constant buffer pointer so we can access the vertex shader constant buffer from within this class. result = device->CreateBuffer(&matrixBufferDesc, NULL, &m_matrixBuffer); if (FAILED(result)) { return false; } // Create a texture sampler state description. samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.MipLODBias = 0.0f; samplerDesc.MaxAnisotropy = 1; samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; samplerDesc.BorderColor[0] = 0; samplerDesc.BorderColor[1] = 0; samplerDesc.BorderColor[2] = 0; samplerDesc.BorderColor[3] = 0; samplerDesc.MinLOD = 0; samplerDesc.MaxLOD = D3D11_FLOAT32_MAX; // Create the texture sampler state. result = device->CreateSamplerState(&samplerDesc, &m_sampleState); if (FAILED(result)) { return false; } // Setup the description of the transparent dynamic constant buffer that is in the pixel shader. transparentBufferDesc.Usage = D3D11_USAGE_DYNAMIC; transparentBufferDesc.ByteWidth = sizeof(TransparentBufferType); transparentBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; transparentBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; transparentBufferDesc.MiscFlags = 0; transparentBufferDesc.StructureByteStride = 0; // Create the constant buffer pointer so we can access the pixel shader constant buffer from within this class. result = device->CreateBuffer(&transparentBufferDesc, NULL, &m_transparentBuffer); if (FAILED(result)) { return false; } return true; }
bool CColorShaderClass::InitializeShader(ID3D11Device* device, HWND hwnd, WCHAR* vsFilename, WCHAR* psFilename) { HRESULT result; ID3D10Blob* errorMessage; ID3D10Blob* vertexShaderBuffer; ID3D10Blob* pixelShaderBuffer; D3D11_INPUT_ELEMENT_DESC polygonLayout[2]; unsigned int numElements; D3D11_BUFFER_DESC MatrixBufferDesc; //Inicializamos los valores errorMessage = 0; vertexShaderBuffer = 0; pixelShaderBuffer = 0; /************************************************************************/ /* Compilamos los Shaders */ /************************************************************************/ //Compilamos el vertex shader, si ay un error lo dira result = D3DX11CompileFromFile( vsFilename, NULL, NULL, "ColorVertexShader", "vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &vertexShaderBuffer, &errorMessage, NULL); if (FAILED(result)) { //Si hubo un error, lo debio de haber escrito if (errorMessage) { OutputShaderErrorMessage(errorMessage, hwnd, vsFilename); } //Si no esribio nada, significa que no encontro el archivo else { MessageBox(hwnd, L"no se encontro el archivo", L"Error", MB_OK); } return false; } //Compilamos el pixel shader, si ay un error lo dira result = D3DX11CompileFromFile( psFilename, NULL, NULL, "ColorPixelShader", "ps_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &pixelShaderBuffer, &errorMessage, NULL); if (FAILED(result)) { //Si hubo un error, lo debio de haber escrito if (errorMessage) { OutputShaderErrorMessage(errorMessage, hwnd, psFilename); } //Si no esribio nada, significa que no encontro el archivo else { MessageBox(hwnd, L"no se encontro el archivo", L"Error", MB_OK); } return false; } /************************************************************************/ /* Creamos los buffers a partir de la compilacion */ /************************************************************************/ //creamos el vertex shader del buffer result = device->CreateVertexShader(vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), NULL, &m_vertexShader); if (FAILED(result)) { return false; } //creamos el pixel shader del buffer result = device->CreatePixelShader(pixelShaderBuffer->GetBufferPointer(), pixelShaderBuffer->GetBufferSize(), NULL, &m_pixelShader); if (FAILED(result)) { return false; } /************************************************************************/ /* Creamos el Layout */ /************************************************************************/ polygonLayout[0].SemanticName = "POSITION"; polygonLayout[0].SemanticIndex = 0; polygonLayout[0].Format = DXGI_FORMAT_R32G32B32A32_FLOAT; polygonLayout[0].InputSlot = 0; polygonLayout[0].AlignedByteOffset = 0; polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[0].InstanceDataStepRate = 0; polygonLayout[1].SemanticName = "COLOR"; polygonLayout[1].SemanticIndex = 0; polygonLayout[1].Format = DXGI_FORMAT_R32G32B32A32_FLOAT; polygonLayout[1].InputSlot = 0; polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; polygonLayout[1].InstanceDataStepRate = 0; //Obtenemos el numero de elementos del Layout numElements = sizeof(polygonLayout) / sizeof(polygonLayout[0]); //Creamos el Layout del vertex result = device->CreateInputLayout(polygonLayout, numElements, vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), &m_layout); if (FAILED(result)) { return false; } //Liberamos memoria vertexShaderBuffer->Release(); vertexShaderBuffer = 0; pixelShaderBuffer->Release(); pixelShaderBuffer = 0; /************************************************************************/ /* creamos el buffer de constantes */ /************************************************************************/ //Creamos el descriptor del buffer de constantes MatrixBufferDesc.Usage = D3D11_USAGE_DYNAMIC; MatrixBufferDesc.ByteWidth = sizeof(MatrixBufferType); MatrixBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; MatrixBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; MatrixBufferDesc.MiscFlags = 0; MatrixBufferDesc.StructureByteStride = 0; //Creamos el buffer de contsntantes result = device->CreateBuffer(&MatrixBufferDesc, NULL, &m_matrixBuffer); if (FAILED(result)) { return false; } return true; }