------------------------------------------------------------------------------
| 2808 | |
| 2809 | //------------------------------------------------------------------------------ |
| 2810 | void vtkOpenGLGPUVolumeRayCastMapper::BuildShader(vtkRenderer* ren) |
| 2811 | { |
| 2812 | std::map<vtkShader::Type, vtkShader*> shaders; |
| 2813 | vtkShader* vertexShader = vtkShader::New(); |
| 2814 | vertexShader->SetType(vtkShader::Vertex); |
| 2815 | shaders[vtkShader::Vertex] = vertexShader; |
| 2816 | vtkShader* fragmentShader = vtkShader::New(); |
| 2817 | fragmentShader->SetType(vtkShader::Fragment); |
| 2818 | shaders[vtkShader::Fragment] = fragmentShader; |
| 2819 | vtkShader* geometryShader = vtkShader::New(); |
| 2820 | geometryShader->SetType(vtkShader::Geometry); |
| 2821 | shaders[vtkShader::Geometry] = geometryShader; |
| 2822 | |
| 2823 | auto vol = this->Impl->GetActiveVolume(); |
| 2824 | |
| 2825 | vtkOpenGLShaderProperty* sp = vtkOpenGLShaderProperty::SafeDownCast(vol->GetShaderProperty()); |
| 2826 | this->GetShaderTemplate(shaders, sp); |
| 2827 | |
| 2828 | // user specified pre replacements |
| 2829 | vtkOpenGLShaderProperty::ReplacementMap repMap = sp->GetAllShaderReplacements(); |
| 2830 | for (const auto& i : repMap) |
| 2831 | { |
| 2832 | if (i.first.ReplaceFirst) |
| 2833 | { |
| 2834 | std::string ssrc = shaders[i.first.ShaderType]->GetSource(); |
| 2835 | vtkShaderProgram::Substitute( |
| 2836 | ssrc, i.first.OriginalValue, i.second.Replacement, i.second.ReplaceAll); |
| 2837 | shaders[i.first.ShaderType]->SetSource(ssrc); |
| 2838 | } |
| 2839 | } |
| 2840 | |
| 2841 | auto numComp = this->AssembledInputs[0].Texture->GetLoadedScalars()->GetNumberOfComponents(); |
| 2842 | this->ReplaceShaderValues(shaders, ren, vol, numComp); |
| 2843 | |
| 2844 | // user specified post replacements |
| 2845 | for (const auto& i : repMap) |
| 2846 | { |
| 2847 | if (!i.first.ReplaceFirst) |
| 2848 | { |
| 2849 | std::string ssrc = shaders[i.first.ShaderType]->GetSource(); |
| 2850 | vtkShaderProgram::Substitute( |
| 2851 | ssrc, i.first.OriginalValue, i.second.Replacement, i.second.ReplaceAll); |
| 2852 | shaders[i.first.ShaderType]->SetSource(ssrc); |
| 2853 | } |
| 2854 | } |
| 2855 | |
| 2856 | // Now compile the shader |
| 2857 | //-------------------------------------------------------------------------- |
| 2858 | this->Impl->ShaderProgram = this->Impl->ShaderCache->ReadyShaderProgram(shaders); |
| 2859 | if (!this->Impl->ShaderProgram || !this->Impl->ShaderProgram->GetCompiled()) |
| 2860 | { |
| 2861 | vtkErrorMacro("Shader failed to compile"); |
| 2862 | } |
| 2863 | |
| 2864 | vertexShader->Delete(); |
| 2865 | fragmentShader->Delete(); |
| 2866 | geometryShader->Delete(); |
| 2867 |
no test coverage detected