Exemple #1
0
HdStGLSLProgramSharedPtr
HdStGLSLProgram::GetComputeProgram(
        TfToken const &shaderToken,
        HdStResourceRegistry *resourceRegistry)
{
    // Find the program from registry
    HdInstance<HdStGLSLProgram::ID, HdStGLSLProgramSharedPtr> programInstance;

    std::unique_lock<std::mutex> regLock = 
        resourceRegistry->RegisterGLSLProgram(
            HdStGLSLProgram::ComputeHash(shaderToken), &programInstance);

    if (programInstance.IsFirstInstance()) {
        // if not exists, create new one
        HdStGLSLProgramSharedPtr newProgram(
            new HdStGLSLProgram(HdTokens->computeShader));

        GlfGLSLFX glslfx(HdStPackageComputeShader());
        std::string version = "#version 430\n";
        if (!newProgram->CompileShader(
                GL_COMPUTE_SHADER, version + glslfx.GetSource(shaderToken))) {
            TF_CODING_ERROR("Fail to compile " + shaderToken.GetString());
            return HdStGLSLProgramSharedPtr();
        }
        if (!newProgram->Link()) {
            TF_CODING_ERROR("Fail to link " + shaderToken.GetString());
            return HdStGLSLProgramSharedPtr();
        }
        programInstance.SetValue(newProgram);
    }
    return programInstance.GetValue();
}
bool
HdxColorCorrectionTask::_CreateShaderResources()
{
    if (_shaderProgram) {
        return true;
    }

    // Client can choose to use Hydra's build-in sRGB color correction or use
    // OpenColorIO for color correction in which case we insert extra OCIO code.
    #ifdef PXR_OCIO_PLUGIN_ENABLED
        bool useOCIO = 
            _colorCorrectionMode == HdxColorCorrectionTokens->openColorIO;
    #else
        bool useOCIO = false;
    #endif

    _shaderProgram.reset(new HdStGLSLProgram(_tokens->colorCorrectionShader));

    HioGlslfx glslfx(HdxPackageColorCorrectionShader());

    std::string fragCode = "#version 120\n";

    if (useOCIO) {
        fragCode += "#define GLSLFX_USE_OCIO\n";
    }

    fragCode += glslfx.GetSource(_tokens->colorCorrectionFragment);

    if (useOCIO) {
        std::string ocioGpuShaderText = _CreateOpenColorIOResources();
        fragCode += ocioGpuShaderText;
    }

    if (!_shaderProgram->CompileShader(GL_VERTEX_SHADER,
            glslfx.GetSource(_tokens->colorCorrectionVertex)) ||
        !_shaderProgram->CompileShader(GL_FRAGMENT_SHADER, fragCode) ||
        !_shaderProgram->Link()) {
        TF_CODING_ERROR("Failed to load color correction shader");
        _shaderProgram.reset();
        return false;
    }

    GLuint programId = _shaderProgram->GetProgram().GetId();
    _locations[COLOR_IN]  = glGetUniformLocation(programId, "colorIn");
    _locations[POSITION] = glGetAttribLocation(programId, "position");
    _locations[UV_IN]     = glGetAttribLocation(programId, "uvIn");
    
    if (useOCIO) {
        _locations[LUT3D_IN] = glGetUniformLocation(programId, "LUT3dIn");
    }

    GLF_POST_PENDING_GL_ERRORS();
    return true;
}
Exemple #3
0
HdSprim *
HdStreamRenderDelegate::_CreateFallbackShaderPrim()
{
    GlfGLSLFXSharedPtr glslfx(new GlfGLSLFX(HdPackageFallbackSurfaceShader()));

    HdSurfaceShaderSharedPtr fallbackShaderCode(new HdGLSLFXShader(glslfx));

    HdStShader *shader = new HdStShader(SdfPath::EmptyPath());
    shader->SetSurfaceShader(fallbackShaderCode);

    return shader;
}
Exemple #4
0
void
HdxCompositor::_CreateShaderResources(bool useDepthProgram)
{
    _compositorProgram.reset(new HdStGLSLProgram(_tokens->fullscreenShader));
    GlfGLSLFX glslfx(HdxPackageFullscreenShader());
    TfToken fsToken = useDepthProgram ? _tokens->compositeFragmentWithDepth
                                      : _tokens->compositeFragmentNoDepth;
    if (!_compositorProgram->CompileShader(GL_VERTEX_SHADER,
            glslfx.GetSource(_tokens->fullscreenVertex)) ||
        !_compositorProgram->CompileShader(GL_FRAGMENT_SHADER,
            glslfx.GetSource(fsToken)) ||
        !_compositorProgram->Link()) {
        TF_CODING_ERROR("Failed to load compositing shader");
        _compositorProgram.reset();
        return;
    }
    GLuint programId = _compositorProgram->GetProgram().GetId();
    _locations[colorIn]  = glGetUniformLocation(programId, "colorIn");
    _locations[depthIn]  = glGetUniformLocation(programId, "depthIn");
    _locations[position] = glGetAttribLocation(programId, "position");
    _locations[uvIn]     = glGetAttribLocation(programId, "uvIn");
    _locations[remapDepthIn] = glGetUniformLocation(programId, "remapDepthIn");
}