void CRtwShadowRenderer::InitImportanceShaders()
{
    HRESULT hr;
    {
        std::ifstream vsStream("..\\assets\\importanceMapVS.cso", std::ifstream::binary);
        if(vsStream.fail()) assert(false);

        std::string vsString((std::istreambuf_iterator<char>(vsStream)), std::istreambuf_iterator<char>());

        int vsSize = vsString.size();

        hr = Globals::Get().device.m_device->CreateVertexShader(vsString.c_str(), vsSize, NULL, &m_importanceVS);
        ASSERT_ON_FAIL(hr);

        hr = Globals::Get().device.m_device->CreateInputLayout(layoutPosTexNormalBitangentTangent, ARRAYSIZE(layoutPosTexNormalBitangentTangent), vsString.c_str(), vsSize, &m_inputLayout);
        ASSERT_ON_FAIL(hr);
    }

    ////////////////////////////////////////////
    {
        std::ifstream psStream("..\\assets\\importanceMapPS.cso", std::ifstream::binary);
        if(psStream.fail()) assert(false);

        std::string psString((std::istreambuf_iterator<char>(psStream)), std::istreambuf_iterator<char>());

        int psSize = psString.size();

        hr = GetDX11Device()->CreatePixelShader(psString.c_str(), psSize, NULL, &m_importancePS);
        ASSERT_ON_FAIL(hr);
        psStream.close();
    }
    /////////////////////////////////////////////

    {
        std::ifstream vsStream("..\\assets\\shadowmapRtwVS.cso", std::ifstream::binary);
        if(vsStream.fail()) assert(false);

        std::string vsString((std::istreambuf_iterator<char>(vsStream)), std::istreambuf_iterator<char>());

        int vsSize = vsString.size();

        hr = Globals::Get().device.m_device->CreateVertexShader(vsString.c_str(), vsSize, NULL, &m_shadowMapRtwVS);
        ASSERT_ON_FAIL(hr);
    }

    ////////////////////////////////////////////
    {
        std::ifstream psStream("..\\assets\\shadowmapRtwPS.cso", std::ifstream::binary);
        if(psStream.fail()) assert(false);

        std::string psString((std::istreambuf_iterator<char>(psStream)), std::istreambuf_iterator<char>());

        int psSize = psString.size();

        hr = GetDX11Device()->CreatePixelShader(psString.c_str(), psSize, NULL, &m_shadowMapRtwPS);
        ASSERT_ON_FAIL(hr);
        psStream.close();
    }

    ///////////////////////////////////////////

    {
        std::ifstream vsStream("..\\assets\\renderFinalVS.cso", std::ifstream::binary);
        if(vsStream.fail()) assert(false);

        std::string vsString((std::istreambuf_iterator<char>(vsStream)), std::istreambuf_iterator<char>());

        int vsSize = vsString.size();

        hr = Globals::Get().device.m_device->CreateVertexShader(vsString.c_str(), vsSize, NULL, &m_finalVS);
        ASSERT_ON_FAIL(hr);
    }

    ////////////////////////////////////////////
    {
        std::ifstream psStream("..\\assets\\renderFinalPS.cso", std::ifstream::binary);
        if(psStream.fail()) assert(false);

        std::string psString((std::istreambuf_iterator<char>(psStream)), std::istreambuf_iterator<char>());

        int psSize = psString.size();

        hr = GetDX11Device()->CreatePixelShader(psString.c_str(), psSize, NULL, &m_finalPS);
        ASSERT_ON_FAIL(hr);
        psStream.close();
    }
    {
        std::ifstream psStream("..\\assets\\warpMapPS.cso", std::ifstream::binary);
        if(psStream.fail()) assert(false);

        std::string psString((std::istreambuf_iterator<char>(psStream)), std::istreambuf_iterator<char>());

        int psSize = psString.size();

        hr = GetDX11Device()->CreatePixelShader(psString.c_str(), psSize, NULL, &m_calculateWarpPS);
        ASSERT_ON_FAIL(hr);
        psStream.close();
    }
    ////////////////////////////////////////////
    {
        std::ifstream vsStream("..\\assets\\depthOnly.cso", std::ifstream::binary);
        if(vsStream.fail()) assert(false);

        std::string vsString((std::istreambuf_iterator<char>(vsStream)), std::istreambuf_iterator<char>());

        int vsSize = vsString.size();

        hr = Globals::Get().device.m_device->CreateVertexShader(vsString.c_str(), vsSize, NULL, &m_depthVS);
        if(FAILED(hr)) assert(false);
    }
}
Example #2
0
bool CShader::CreateFromCompiledFile(EInputLayoutType type, const wchar* psPath, const wchar* vsPath, const wchar* gsPath, const wchar* dsPath, const wchar* hsPath)
{
    HRESULT hr;
    CompileFromFile(type, L"../assets/parallaxPS.fx", L"../assets/parallaxVS.fx");

//    D3DReadFileToBlob(vsPath, &m_vsBlob);

    std::ifstream vsStream(vsPath, std::ifstream::binary);
    if(vsStream.fail()) assert(false);

    std::string vsString((std::istreambuf_iterator<char>(vsStream)), std::istreambuf_iterator<char>());

    int vsSize = vsString.size();

    //      hr = GetDevice()->CreateVertexShader(m_vsBlob->GetBufferPointer(), m_vsBlob->GetBufferSize(), NULL, &m_vs);

    hr = GetDX11Device()->CreateVertexShader(vsString.c_str(), vsSize, NULL, &m_vs);


    if(FAILED(hr)) assert(false);

    switch(type)
    {
    case EInputLayoutType::Position:
        hr = GetDX11Device()->CreateInputLayout(layoutPos, ARRAYSIZE(layoutPos), vsString.c_str(), vsSize, &m_inputLayout);
        break;
    case EInputLayoutType::PositionTexture:
        hr = GetDX11Device()->CreateInputLayout(layoutPosTex, ARRAYSIZE(layoutPosTex), vsString.c_str(), vsSize, &m_inputLayout);
        break;
    case EInputLayoutType::PositionTextureNormal:
        hr = GetDX11Device()->CreateInputLayout(layoutPosTexNorm, ARRAYSIZE(layoutPosTexNorm), vsString.c_str(), vsSize, &m_inputLayout);
        break;
    case EInputLayoutType::PositionTextureNormalTangentBinormal:
        hr = GetDX11Device()->CreateInputLayout(layoutPosTexNormalBitangentTangent, ARRAYSIZE(layoutPosTexNormalBitangentTangent), vsString.c_str(), vsSize, &m_inputLayout);
        break;
    case EInputLayoutType::PositionTextureNormalTangentSkinned:
        hr = GetDX11Device()->CreateInputLayout(layoutPosTexNormalTangentSkinned, ARRAYSIZE(layoutPosTexNormalTangentSkinned), vsString.c_str(), vsSize, &m_inputLayout);
        break;
    case EInputLayoutType::BasicParticle:
        hr = GetDX11Device()->CreateInputLayout(basicParticlelayout, ARRAYSIZE(basicParticlelayout), vsString.c_str(), vsSize, &m_inputLayout);
        break;
    case EInputLayoutType::TerrainLayout:
        hr = GetDX11Device()->CreateInputLayout(layoutTerrain, ARRAYSIZE(layoutTerrain), vsString.c_str(), vsSize, &m_inputLayout);
        break;
    }

    if(FAILED(hr)) assert(false);
    vsStream.close();

    ////////////////////////////////////////////

    std::ifstream psStream(psPath, std::ifstream::binary);
    if(psStream.fail()) assert(false);

    std::string psString((std::istreambuf_iterator<char>(psStream)), std::istreambuf_iterator<char>());

    int psSize = psString.size();

    hr = GetDX11Device()->CreatePixelShader(psString.c_str(), psSize, NULL, &m_ps);
    if(FAILED(hr)) assert(false);
    psStream.close();

    /////////////////////////////////////////////

    if(gsPath != nullptr)
    {
        std::ifstream gsStream(gsPath, std::ifstream::binary);
        if(gsStream.fail()) assert(false);

        std::string gsString((std::istreambuf_iterator<char>(gsStream)), std::istreambuf_iterator<char>());

        int gsSize = gsString.size();
        hr = GetDX11Device()->CreateGeometryShader(gsString.c_str(), gsSize, NULL, &m_gs);

        if(FAILED(hr)) assert(false);
        gsStream.close();
    }

    if(hsPath != nullptr)
    {
        std::ifstream hsStream(hsPath, std::ifstream::binary);
        if(hsStream.fail()) assert(false);

        std::string hsString((std::istreambuf_iterator<char>(hsStream)), std::istreambuf_iterator<char>());

        int hsSize = hsString.size();
        hr = GetDX11Device()->CreateHullShader(hsString.c_str(), hsSize, NULL, &m_hs);

        if(FAILED(hr)) assert(false);
        hsStream.close();
    }

    if(dsPath != nullptr)
    {
        std::ifstream dsStream(dsPath, std::ifstream::binary);
        if(dsStream.fail()) assert(false);

        std::string dsString((std::istreambuf_iterator<char>(dsStream)), std::istreambuf_iterator<char>());

        int dsSize = dsString.size();
        hr = GetDX11Device()->CreateDomainShader(dsString.c_str(), dsSize, NULL, &m_ds);

        if(FAILED(hr)) assert(false);
        dsStream.close();
    }
    return true;
}
Example #3
0
CShader_GBuffer::CShader_GBuffer(std::string vs_path, std::string ps_path)
{
    GLuint vsID = glCreateShader(GL_VERTEX_SHADER);
    GLuint psID = glCreateShader(GL_FRAGMENT_SHADER);

    std::string vsCode;
    std::ifstream vsStream(vs_path.c_str(), std::ios::in);
    if (vsStream.is_open())
    {
        std::string line = "";
        while (getline(vsStream, line))
        {
            vsCode += "\n" + line;
        }

        vsStream.close();
    }

    std::string psCode;
    std::ifstream psStream(ps_path.c_str(), std::ios::in);
    if (psStream.is_open())
    {
        std::string line = "";
        while (getline(psStream, line))
        {
            psCode += "\n" + line;
        }

        psStream.close();
    }

    GLint result = GL_FALSE;
    int logLength;

    // Compile vertex shader
    log(LOG_TYPE_DEFAULT, "Compiling Shader: " +  vs_path + "..");
    const char* vsPointer = vsCode.c_str();
    glShaderSource(vsID, 1, &vsPointer, NULL);
    glCompileShader(vsID);

    // Check shader status
    glGetShaderiv(vsID, GL_COMPILE_STATUS, &result);
    if (!result)
    {
        glGetShaderiv(vsID, GL_INFO_LOG_LENGTH, &logLength);
        std::vector<char> vsError(logLength);
        glGetShaderInfoLog(vsID, logLength, NULL, &vsError[0]);

        if (vsError.size() - 1 >= 0)
        {
            vsError[vsError.size() - 1] = '\0';
        }

        log(LOG_TYPE_ERROR, std::string((char*)&vsError[0]));
    }

    // Compile pixel shader
    log(LOG_TYPE_DEFAULT, "Compiling Shader: " +  ps_path +  "..");
    const char* psPointer = psCode.c_str();
    glShaderSource(psID, 1, &psPointer, NULL);
    glCompileShader(psID);

    // Check shader status
    glGetShaderiv(psID, GL_COMPILE_STATUS, &result);
    if (!result)
    {
        glGetShaderiv(psID, GL_INFO_LOG_LENGTH, &logLength);
        std::vector<char> psError(logLength);
        glGetShaderInfoLog(psID, logLength, NULL, &psError[0]);

        if (psError.size() - 1 >= 0)
        {
            psError[psError.size() - 1] = '\0';
        }

        log(LOG_TYPE_ERROR, std::string((char*)&psError[0]));
    }

    // Link shader
    log(LOG_TYPE_DEFAULT, "Linking shader ..");
    GLuint shaderID = glCreateProgram();
    glAttachShader(shaderID, vsID);
    glAttachShader(shaderID, psID);
    glLinkProgram(shaderID);

    // Check final shader
    glGetProgramiv(shaderID, GL_LINK_STATUS, &result);
    if (!result)
    {
        glGetProgramiv(shaderID, GL_INFO_LOG_LENGTH, &logLength);
        std::vector<char> shaderError(logLength);
        glGetProgramInfoLog(shaderID, logLength, NULL, &shaderError[0]);

        if (shaderError.size() - 1 >= 0)
        {
            shaderError[shaderError.size() - 1] = '\0';
        }

        log(LOG_TYPE_ERROR, std::string((char*)&shaderError[0]));
    }

    // Clean up
    glDeleteShader(vsID);
    glDeleteShader(psID);

    // Save the ID
    m_Id = shaderID;
}