コード例 #1
0
bool Terrain::Draw(RenderContext& renderContext)
{
    renderContext.ApplyShader(m_useShaderType);

    XCShaderHandle* shaderHandle = nullptr;

    // Set constants
    ICamera& cam = renderContext.GetGlobalShaderData().m_camera;
    PerObjectBuffer perObject = {
        MatrixTranspose(m_World).GetUnaligned(),
        MatrixTranspose(m_World * cam.GetViewMatrix() * cam.GetProjectionMatrix()).GetUnaligned(),
        MatrixInverseTranspose(m_World).GetUnaligned(),
        XCMatrix().GetUnaligned(),
        m_material
    };
    m_pCBPerObject->UploadDataOnGPU(renderContext.GetDeviceContext(), &perObject, sizeof(PerObjectBuffer));

    if (m_useShaderType == ShaderType_LightTexture)
    {
        shaderHandle = (XCShaderHandle*)renderContext.GetShader(ShaderType_LightTexture);
        shaderHandle->SetConstantBuffer("PerObjectBuffer", renderContext.GetDeviceContext(), *m_pCBPerObject);
        shaderHandle->SetResource("gDiffuseMap", renderContext.GetDeviceContext(), m_textures[0]);
    }
    else if (m_useShaderType == ShaderType_TerrainMultiTexture)
    {
        shaderHandle = (XCShaderHandle*)renderContext.GetShader(ShaderType_TerrainMultiTexture);
        shaderHandle->SetConstantBuffer("PerObjectBuffer", renderContext.GetDeviceContext(), *m_pCBPerObject);
        shaderHandle->SetResource("gDiffuseMap",  renderContext.GetDeviceContext(), m_textures[0]);
        shaderHandle->SetResource("gDiffuseMap1", renderContext.GetDeviceContext(), m_textures[1]);
        shaderHandle->SetResource("gDiffuseMap2", renderContext.GetDeviceContext(), m_textures[2]);
        shaderHandle->SetResource("gBlendMap",    renderContext.GetDeviceContext(), m_textures[3]);
    }

#if defined(FORWARD_LIGHTING)
    XCLightManager* lightMgr = (XCLightManager*)&SystemLocator::GetInstance()->RequestSystem("LightsManager");
    shaderHandle->SetConstantBuffer("cbLightsPerFrame", renderContext.GetDeviceContext(), lightMgr->GetLightConstantBuffer());
#endif

    shaderHandle->SetVertexBuffer(renderContext.GetDeviceContext(), &m_vertexPosNormTexBuffer);
    shaderHandle->SetIndexBuffer(renderContext.GetDeviceContext(), m_indexBuffer);

    renderContext.DrawIndexedInstanced(m_indexBuffer.m_indexData.size(), m_indexBuffer.GetIndexBufferInGPUMem());


    return true;
}