[osg-users] Pragmatic shader - a new #pragma directive proposition

Robert Milharcic robert.milharcic at ib-caddy.si
Thu Jan 14 03:26:26 PST 2016


Hi Robert Osfield,

On 14.1.2016 10:10, Robert Osfield wrote:
> Hi Robert M, et. al,
>
> I understand the motivation the proposal but it does look like it'll
> complicate the parsing significantly so am inclined to suggest we look
> at the problem at look for easier ways to implement it.

Actually, while I was waiting for a feedback I made a proof of concept implementation which turns out to be relatively straightforward task. For the parser part I have to add only a few more lines (excluding sanity checks):

void Shader::_computeShaderDefines()
{
     ...

     if (keyword == "import_defines") _parseShaderDefines(str, _shaderDefines);
     else if (keyword == "requires") _parseShaderDefines(str, _shaderRequirements);
     else if (keyword == "repeat_begin")
     {
         ShaderDefines shaderCodeBlockIdentifers;
         _parseShaderDefines(str, shaderCodeBlockIdentifers);

         ShaderCodeBlock shaderCodeBlock;

         shaderCodeBlock._begin = eol;
         shaderCodeBlock._end = std::string::npos;

         shaderCodeBlock._identifier = *shaderCodeBlockIdentifers.begin();
         _shaderCodeBlocks.push_back(shaderCodeBlock);
     }
     else if (keyword == "repeat_end")
     {
         ShaderCodeBlock& shaderCodeBlock = _shaderCodeBlocks.back();
         shaderCodeBlock._end = _shaderSource.find_last_not_of(" \t", pos - 8);
     }

     ...
}
> In terms of code bloat in shaders, the #pragma(tic) shader composition
> ensures that the final code passed the OpenGL will have all the
> unimplemented paths removed so performance won't be an issue.  For
> developers code bloat in shaders is an potential issue, one thing you
> do to help would be to wrap up all the lighting calls into a small set
> of functions that are called from the main, these functions are
> implemented in separate shaders that handle all the different code
> paths so at least the complexity is kept in one place and can be
> reused easily.
Agreed.

> A second possibility would be to have developers auto generate shaders
> so avoid creating bloated shaders directly.
>
> A third approach might be to have the ability to provide a custom
> parser to the OSG so that it can handle custom syntax that developers
> feel suits their needs better than the default set of features
> provided by the core #pragma(tic) shader composition.
>
Third approach is the approach I like most. I wonder what others have to say about this, though...

Robert Milharcic


More information about the osg-users mailing list