diff --git a/enginecustom/applicationclass.cpp b/enginecustom/applicationclass.cpp index 4df57f1..e5efc37 100644 --- a/enginecustom/applicationclass.cpp +++ b/enginecustom/applicationclass.cpp @@ -5,6 +5,8 @@ ApplicationClass::ApplicationClass() m_Direct3D = 0; m_Camera = 0; m_Model = 0; + m_Model1 = 0; + m_Model2 = 0; m_LightShader = 0; m_Light = 0; m_TextureShader = 0; @@ -26,6 +28,7 @@ ApplicationClass::ApplicationClass() m_Frustum = 0; m_DisplayPlane = 0; m_ReflectionShader = 0; + m_TransparentShader = 0; } @@ -140,6 +143,9 @@ bool ApplicationClass::Initialize(int screenWidth, int screenHeight, HWND hwnd) return false; } + + + // Create and initialize the render to texture object. m_RenderTexture = new RenderTextureClass; @@ -233,6 +239,37 @@ bool ApplicationClass::Initialize(int screenWidth, int screenHeight, HWND hwnd) return false; } + // Create and initialize the first model object that will use the dirt texture. + m_Model1 = new ModelClass; + + result = m_Model1->Initialize(m_Direct3D->GetDevice(), m_Direct3D->GetDeviceContext(), modelFilename, textureFilename1, textureFilename2, textureFilename3, textureFilename4, + textureFilename5, textureFilename6); + if (!result) + { + MessageBox(hwnd, L"Could not initialize the model object.", L"Error", MB_OK); + return false; + } + + // Create and initialize the second model object that will use the stone texture. + m_Model2 = new ModelClass; + + result = m_Model2->Initialize(m_Direct3D->GetDevice(), m_Direct3D->GetDeviceContext(), modelFilename, textureFilename1, textureFilename2, textureFilename3, textureFilename4, + textureFilename5, textureFilename6); + if (!result) + { + return false; + } + + // Create and initialize the transparent shader object. + m_TransparentShader = new TransparentShaderClass; + + result = m_TransparentShader->Initialize(m_Direct3D->GetDevice(), hwnd); + if (!result) + { + MessageBox(hwnd, L"Could not initialize the transparent shader object.", L"Error", MB_OK); + return false; + } + // Create and initialize the light shader object. m_LightShader = new LightShaderClass; @@ -364,6 +401,29 @@ bool ApplicationClass::Initialize(int screenWidth, int screenHeight, HWND hwnd) void ApplicationClass::Shutdown() { + // Release the transparent shader object. + if (m_TransparentShader) + { + m_TransparentShader->Shutdown(); + delete m_TransparentShader; + m_TransparentShader = 0; + } + + // Release the model object. + if (m_Model2) + { + m_Model2->Shutdown(); + delete m_Model2; + m_Model2 = 0; + } + + // Release the model object. + if (m_Model1) + { + m_Model1->Shutdown(); + delete m_Model1; + m_Model1 = 0; + } // Release the shader manager object. if (m_ShaderManager) @@ -703,6 +763,10 @@ bool ApplicationClass::Render(float rotation, float x, float y, float z, float t XMFLOAT4 diffuseColor[4], lightPosition[4]; int modelCount, renderCount, i; bool result, renderModel; + float blendAmount; + + // Set the blending amount to 50%. + blendAmount = 0.5f; // Clear the buffers to begin the scene. m_Direct3D->BeginScene(0.0f, 0.0f, 0.0f, 1.0f); @@ -710,6 +774,38 @@ bool ApplicationClass::Render(float rotation, float x, float y, float z, float t // Generate the view matrix based on the camera's position. m_Camera->Render(); + // Get the world, view, and projection matrices from the camera and d3d objects. + m_Direct3D->GetWorldMatrix(worldMatrix); + m_Camera->GetViewMatrix(viewMatrix); + m_Direct3D->GetProjectionMatrix(projectionMatrix); + + // Render the first model that is using the dirt texture using the regular texture shader. + m_Model1->Render(m_Direct3D->GetDeviceContext()); + + result = m_TextureShader->Render(m_Direct3D->GetDeviceContext(), m_Model1->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix, m_Model1->GetTexture(0)); + if (!result) + { + return false; + } + + // Translate to the right by one unit and towards the camera by one unit. + worldMatrix = XMMatrixTranslation(1.0f, 0.0f, -1.0f); + + // Turn on alpha blending for the transparency to work. + m_Direct3D->EnableAlphaBlending(); + + // Render the second square model with the stone texture and use the 50% blending amount for transparency. + m_Model2->Render(m_Direct3D->GetDeviceContext()); + + result = m_TransparentShader->Render(m_Direct3D->GetDeviceContext(), m_Model2->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix, m_Model2->GetTexture(5), blendAmount); + if (!result) + { + return false; + } + + // Turn off alpha blending. + m_Direct3D->DisableAlphaBlending(); + // Get the world, view, and projection matrices from the camera and d3d objects. m_Direct3D->GetWorldMatrix(worldMatrix); m_Camera->GetViewMatrix(viewMatrix); diff --git a/enginecustom/applicationclass.h b/enginecustom/applicationclass.h index 0cfc8f0..1ffcbf5 100644 --- a/enginecustom/applicationclass.h +++ b/enginecustom/applicationclass.h @@ -30,6 +30,7 @@ #include "rendertextureclass.h" #include "displayplaneclass.h" #include "reflectionshaderclass.h" +#include "transparentshaderclass.h" @@ -91,7 +92,9 @@ private : D3DClass* m_Direct3D; IDXGISwapChain* m_swapChain; ModelClass* m_Model; + ModelClass* m_Model1, * m_Model2; TextureShaderClass* m_TextureShader; + TransparentShaderClass* m_TransparentShader; ShaderManagerClass* m_ShaderManager; ModelListClass* m_ModelList; diff --git a/enginecustom/enginecustom.vcxproj b/enginecustom/enginecustom.vcxproj index 68ebf0c..a249d9b 100644 --- a/enginecustom/enginecustom.vcxproj +++ b/enginecustom/enginecustom.vcxproj @@ -60,6 +60,7 @@ + @@ -103,6 +104,7 @@ + @@ -124,6 +126,8 @@ + + diff --git a/enginecustom/enginecustom.vcxproj.filters b/enginecustom/enginecustom.vcxproj.filters index 44441ea..265e054 100644 --- a/enginecustom/enginecustom.vcxproj.filters +++ b/enginecustom/enginecustom.vcxproj.filters @@ -156,6 +156,12 @@ Fichiers sources + + Fichiers sources + + + Fichiers sources + @@ -281,6 +287,12 @@ Fichiers d%27en-tête + + Fichiers d%27en-tête + + + Fichiers d%27en-tête + @@ -313,6 +325,9 @@ Assets + + Assets + @@ -376,8 +391,18 @@ shader - - + + shader + + + shader + + + shader + + + shader + @@ -398,8 +423,5 @@ assets - - - \ No newline at end of file diff --git a/enginecustom/shadermanagerclass.cpp b/enginecustom/shadermanagerclass.cpp index 4a7a99c..5666332 100644 --- a/enginecustom/shadermanagerclass.cpp +++ b/enginecustom/shadermanagerclass.cpp @@ -8,6 +8,7 @@ ShaderManagerClass::ShaderManagerClass() m_TranslateShader = 0; m_AlphaMapShader = 0; m_SpecMapShader = 0; + m_TransparentShader = 0; } @@ -79,6 +80,15 @@ bool ShaderManagerClass::Initialize(ID3D11Device* device, HWND hwnd) return false; } + // Create and initialize the specular map shader object. + m_TransparentShader = new TransparentShaderClass; + + result = m_TransparentShader->Initialize(device, hwnd); + if (!result) + { + return false; + } + return true; } @@ -132,6 +142,14 @@ void ShaderManagerClass::Shutdown() m_SpecMapShader = 0; } + // Release the transparent shader object. + if (m_TransparentShader) + { + m_TransparentShader->Shutdown(); + delete m_TransparentShader; + m_TransparentShader = 0; + } + return; } diff --git a/enginecustom/shadermanagerclass.h b/enginecustom/shadermanagerclass.h index 23a3a50..7736f1c 100644 --- a/enginecustom/shadermanagerclass.h +++ b/enginecustom/shadermanagerclass.h @@ -11,6 +11,7 @@ #include "translateshaderclass.h" #include "alphamapshaderclass.h" #include "specmapshaderclass.h" +#include "transparentshaderclass.h" //////////////////////////////////////////////////////////////////////////////// @@ -32,6 +33,7 @@ public: bool RenderAlphaMapShader(ID3D11DeviceContext*, int, XMMATRIX, XMMATRIX, XMMATRIX, ID3D11ShaderResourceView*, ID3D11ShaderResourceView*, ID3D11ShaderResourceView*); bool RenderSpecMapShader(ID3D11DeviceContext*, int, XMMATRIX, XMMATRIX, XMMATRIX, ID3D11ShaderResourceView*, ID3D11ShaderResourceView*, ID3D11ShaderResourceView*, XMFLOAT3, XMFLOAT4, XMFLOAT3, XMFLOAT4, float); + bool RenderTransparentShader(ID3D11DeviceContext*, int, XMMATRIX, XMMATRIX, XMMATRIX, ID3D11ShaderResourceView*, ID3D11ShaderResourceView*); private: TextureShaderClass* m_TextureShader; @@ -40,6 +42,7 @@ private: TranslateShaderClass* m_TranslateShader; AlphaMapShaderClass* m_AlphaMapShader; SpecMapShaderClass* m_SpecMapShader; + TransparentShaderClass* m_TransparentShader; }; #endif diff --git a/enginecustom/transparent.ps b/enginecustom/transparent.ps new file mode 100644 index 0000000..47e0417 --- /dev/null +++ b/enginecustom/transparent.ps @@ -0,0 +1,38 @@ +///////////// +// GLOBALS // +///////////// +Texture2D shaderTexture : register(t0); +SamplerState SampleType : register(s0); + +cbuffer TransparentBuffer +{ + float blendAmount; +}; + + +////////////// +// TYPEDEFS // +////////////// +struct PixelInputType +{ + float4 position : SV_POSITION; + float2 tex : TEXCOORD0; +}; + + +//////////////////////////////////////////////////////////////////////////////// +// Pixel Shader +//////////////////////////////////////////////////////////////////////////////// +float4 TransparentPixelShader(PixelInputType input) : SV_TARGET +{ + float4 color; + + + // Sample the texture pixel at this location. + color = shaderTexture.Sample(SampleType, input.tex); + + // Set the alpha value of this pixel to the blending amount to create the alpha blending effect. + color.a = blendAmount; + + return color; +} \ No newline at end of file diff --git a/enginecustom/transparent.vs b/enginecustom/transparent.vs new file mode 100644 index 0000000..3c73098 --- /dev/null +++ b/enginecustom/transparent.vs @@ -0,0 +1,48 @@ +///////////// +// GLOBALS // +///////////// +cbuffer MatrixBuffer +{ + matrix worldMatrix; + matrix viewMatrix; + matrix projectionMatrix; +}; + + +////////////// +// TYPEDEFS // +////////////// +struct VertexInputType +{ + float4 position : POSITION; + float2 tex : TEXCOORD0; +}; + +struct PixelInputType +{ + float4 position : SV_POSITION; + float2 tex : TEXCOORD0; +}; + + +//////////////////////////////////////////////////////////////////////////////// +// Vertex Shader +//////////////////////////////////////////////////////////////////////////////// +PixelInputType TransparentVertexShader(VertexInputType input) +{ + PixelInputType output; + + + // Change the position vector to be 4 units for proper matrix calculations. + input.position.w = 1.0f; + + // Calculate the position of the vertex against the world, view, and projection matrices. + output.position = mul(input.position, worldMatrix); + output.position = mul(output.position, viewMatrix); + output.position = mul(output.position, projectionMatrix); + + // Store the texture coordinates for the pixel shader. + output.tex = input.tex; + + return output; +} diff --git a/enginecustom/transparentshaderclass.cpp b/enginecustom/transparentshaderclass.cpp new file mode 100644 index 0000000..e257abc --- /dev/null +++ b/enginecustom/transparentshaderclass.cpp @@ -0,0 +1,413 @@ +#include "transparentshaderclass.h" + + +TransparentShaderClass::TransparentShaderClass() +{ + m_vertexShader = 0; + m_pixelShader = 0; + m_layout = 0; + m_matrixBuffer = 0; + m_sampleState = 0; + m_transparentBuffer = 0; +} + + +TransparentShaderClass::TransparentShaderClass(const TransparentShaderClass& other) +{ +} + + +TransparentShaderClass::~TransparentShaderClass() +{ +} + + +bool TransparentShaderClass::Initialize(ID3D11Device* device, HWND hwnd) +{ + bool result; + wchar_t vsFilename[128]; + wchar_t psFilename[128]; + int error; + + // Set the filename of the vertex shader. + error = wcscpy_s(vsFilename, 128, L"transparent.vs"); + if (error != 0) + { + return false; + } + + // Set the filename of the pixel shader. + error = wcscpy_s(psFilename, 128, L"transparent.ps"); + if (error != 0) + { + return false; + } + + // Initialize the vertex and pixel shaders. + result = InitializeShader(device, hwnd, vsFilename, psFilename); + if (!result) + { + return false; + } + + return true; +} + + +void TransparentShaderClass::Shutdown() +{ + // Shutdown the vertex and pixel shaders as well as the related objects. + ShutdownShader(); + + return; +} + +bool TransparentShaderClass::Render(ID3D11DeviceContext* deviceContext, int indexCount, XMMATRIX worldMatrix, XMMATRIX viewMatrix, + XMMATRIX projectionMatrix, ID3D11ShaderResourceView* texture, float blend) +{ + bool result; + + + // Set the shader parameters that it will use for rendering. + result = SetShaderParameters(deviceContext, worldMatrix, viewMatrix, projectionMatrix, texture, blend); + if (!result) + { + return false; + } + + // Now render the prepared buffers with the shader. + RenderShader(deviceContext, indexCount); + + 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 = D3DCompileFromFile(vsFilename, NULL, NULL, "TransparentVertexShader", "vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, + &vertexShaderBuffer, &errorMessage); + 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 = D3DCompileFromFile(psFilename, NULL, NULL, "TransparentPixelShader", "ps_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, + &pixelShaderBuffer, &errorMessage); + 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; + } + + // 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; + + // 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; + } + + // 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; +} + + +void TransparentShaderClass::ShutdownShader() +{ + // Release the transparent constant buffer. + if (m_transparentBuffer) + { + m_transparentBuffer->Release(); + m_transparentBuffer = 0; + } + + // Release the sampler state. + if (m_sampleState) + { + m_sampleState->Release(); + m_sampleState = 0; + } + + // Release the matrix constant buffer. + if (m_matrixBuffer) + { + m_matrixBuffer->Release(); + m_matrixBuffer = 0; + } + + // Release the layout. + if (m_layout) + { + m_layout->Release(); + m_layout = 0; + } + + // Release the pixel shader. + if (m_pixelShader) + { + m_pixelShader->Release(); + m_pixelShader = 0; + } + + // Release the vertex shader. + if (m_vertexShader) + { + m_vertexShader->Release(); + m_vertexShader = 0; + } + + return; +} + + +void TransparentShaderClass::OutputShaderErrorMessage(ID3D10Blob* errorMessage, HWND hwnd, WCHAR* shaderFilename) +{ + char* compileErrors; + unsigned long long bufferSize, i; + ofstream fout; + + + // Get a pointer to the error message text buffer. + compileErrors = (char*)(errorMessage->GetBufferPointer()); + + // Get the length of the message. + bufferSize = errorMessage->GetBufferSize(); + + // Open a file to write the error message to. + fout.open("shader-error.txt"); + + // Write out the error message. + for (i = 0; i < bufferSize; i++) + { + fout << compileErrors[i]; + } + + // Close the file. + fout.close(); + + // Release the error message. + errorMessage->Release(); + errorMessage = 0; + + // Pop a message up on the screen to notify the user to check the text file for compile errors. + MessageBox(hwnd, L"Error compiling shader. Check shader-error.txt for message.", shaderFilename, MB_OK); + + return; +} + +bool TransparentShaderClass::SetShaderParameters(ID3D11DeviceContext* deviceContext, XMMATRIX worldMatrix, XMMATRIX viewMatrix, + XMMATRIX projectionMatrix, ID3D11ShaderResourceView* texture, float blend) +{ + HRESULT result; + D3D11_MAPPED_SUBRESOURCE mappedResource; + MatrixBufferType* dataPtr; + unsigned int bufferNumber; + TransparentBufferType* dataPtr2; + + + // Transpose the matrices to prepare them for the shader. + worldMatrix = XMMatrixTranspose(worldMatrix); + viewMatrix = XMMatrixTranspose(viewMatrix); + projectionMatrix = XMMatrixTranspose(projectionMatrix); + + // Lock the constant buffer so it can be written to. + result = deviceContext->Map(m_matrixBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + if (FAILED(result)) + { + return false; + } + + // Get a pointer to the data in the constant buffer. + dataPtr = (MatrixBufferType*)mappedResource.pData; + + // Copy the matrices into the constant buffer. + dataPtr->world = worldMatrix; + dataPtr->view = viewMatrix; + dataPtr->projection = projectionMatrix; + + // Unlock the constant buffer. + deviceContext->Unmap(m_matrixBuffer, 0); + + // Set the position of the constant buffer in the vertex shader. + bufferNumber = 0; + + // Finally set the constant buffer in the vertex shader with the updated values. + deviceContext->VSSetConstantBuffers(bufferNumber, 1, &m_matrixBuffer); + + // Set shader texture resource in the pixel shader. + deviceContext->PSSetShaderResources(0, 1, &texture); + + // Lock the transparent constant buffer so it can be written to. + result = deviceContext->Map(m_transparentBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + if (FAILED(result)) + { + return false; + } + + // Get a pointer to the data in the transparent constant buffer. + dataPtr2 = (TransparentBufferType*)mappedResource.pData; + + // Copy the alpha blending value into the transparent constant buffer. + dataPtr2->blendAmount = blend; + + // Unlock the buffer. + deviceContext->Unmap(m_transparentBuffer, 0); + + // Set the position of the transparent constant buffer in the pixel shader. + bufferNumber = 0; + + // Now set the transparent constant buffer in the pixel shader with the updated values. + deviceContext->PSSetConstantBuffers(bufferNumber, 1, &m_transparentBuffer); + + return true; +} + + +void TransparentShaderClass::RenderShader(ID3D11DeviceContext* deviceContext, int indexCount) +{ + // Set the vertex input layout. + deviceContext->IASetInputLayout(m_layout); + + // Set the vertex and pixel shaders that will be used to render the geometry. + deviceContext->VSSetShader(m_vertexShader, NULL, 0); + deviceContext->PSSetShader(m_pixelShader, NULL, 0); + + // Set the sampler state in the pixel shader. + deviceContext->PSSetSamplers(0, 1, &m_sampleState); + + // Render the geometry. + deviceContext->DrawIndexed(indexCount, 0, 0); + + return; +} \ No newline at end of file diff --git a/enginecustom/transparentshaderclass.h b/enginecustom/transparentshaderclass.h new file mode 100644 index 0000000..aa0ba22 --- /dev/null +++ b/enginecustom/transparentshaderclass.h @@ -0,0 +1,61 @@ +#ifndef _TRANSPARENTSHADERCLASS_H_ +#define _TRANSPARENTSHADERCLASS_H_ + + +////////////// +// INCLUDES // +////////////// +#include +#include +#include +#include +using namespace DirectX; +using namespace std; + + +//////////////////////////////////////////////////////////////////////////////// +// Class name: TransparentShaderClass +//////////////////////////////////////////////////////////////////////////////// +class TransparentShaderClass +{ +private: + struct MatrixBufferType + { + XMMATRIX world; + XMMATRIX view; + XMMATRIX projection; + }; + + struct TransparentBufferType + { + float blendAmount; + XMFLOAT3 padding; + }; + +public: + TransparentShaderClass(); + TransparentShaderClass(const TransparentShaderClass&); + ~TransparentShaderClass(); + + bool Initialize(ID3D11Device*, HWND); + void Shutdown(); + bool Render(ID3D11DeviceContext*, int, XMMATRIX, XMMATRIX, XMMATRIX, ID3D11ShaderResourceView*, float); + +private: + bool InitializeShader(ID3D11Device*, HWND, WCHAR*, WCHAR*); + void ShutdownShader(); + void OutputShaderErrorMessage(ID3D10Blob*, HWND, WCHAR*); + + bool SetShaderParameters(ID3D11DeviceContext*, XMMATRIX, XMMATRIX, XMMATRIX, ID3D11ShaderResourceView*, float); + void RenderShader(ID3D11DeviceContext*, int); + +private: + ID3D11VertexShader* m_vertexShader; + ID3D11PixelShader* m_pixelShader; + ID3D11InputLayout* m_layout; + ID3D11Buffer* m_matrixBuffer; + ID3D11SamplerState* m_sampleState; + ID3D11Buffer* m_transparentBuffer; +}; + +#endif