Page 10 of 14

Re: OpenGL 3+ RenderSystem

Posted: Sat Apr 06, 2013 1:38 pm
by scrawl
I tried the workaround. It seems to fix it.

Code: Select all

GL_VERSION = 4.3.0 NVIDIA 310.14
And yeah, I definitely have updated drivers since then.

Re: OpenGL 3+ RenderSystem

Posted: Sun Apr 14, 2013 8:39 pm
by Ident
I would like to use this RenderSystem for a research project. For this we would need the Tesselation shaders of OpenGL 4.X+. I saw there was some talk in here about them already and i saw they are part of the 1.9 roadmap and also the source code seems to contain some fragments of tesselation shader support. I wanted to ask how far the tesselation shader progress is right now and to what extent they are functional?

The use-case would be to tesselate objects depending on proximity to the camera, similar to how it would be done for bump mapping tesselation.

Edit: fixed a sentence

Re: OpenGL 3+ RenderSystem

Posted: Sun Apr 14, 2013 11:34 pm
by masterfalcon
There is some work on supporting them, but I have not yet had a successful test.

Re: OpenGL 3+ RenderSystem

Posted: Sun Apr 14, 2013 11:52 pm
by holocronweaver
masterfalcon wrote:There is some work on supporting them, but I have not yet had a successful test.
Do you mean you have not tested tessellation, or that all your tests have not succeeded?

Re: OpenGL 3+ RenderSystem

Posted: Mon Apr 15, 2013 12:02 am
by masterfalcon
The tests have not been successful. Furthermore, I don't have a system that has decent GL debugging tools and supports GL 4. So it's slow going.

If anyone wants to help, it would be greatly appreciated.

Re: OpenGL 3+ RenderSystem

Posted: Mon Apr 15, 2013 12:15 am
by holocronweaver
masterfalcon wrote:If anyone wants to help, it would be greatly appreciated.
*raises hand in the air so quickly his arm nearly comes out of socket* Meeeeeeeee!

I have an AMD Radeon 6950 (currently OpenGL 4.2 capable) and am fairly well acquainted with OpenGL 4 tessellation shaders. I am currently finishing up work on a paging system for the Ogre Volume component, but I cannot work on that during my lunch breaks so possibly tessellation shaders in OpenGL can fill the void. I need tessellation shaders for my personal Ogre project, so I have a personal stake in ensuring their successful impelmentation. That and I love new shiny things.

So what can I do to help?

Re: OpenGL 3+ RenderSystem

Posted: Mon Apr 15, 2013 12:36 am
by masterfalcon
Well, my understanding and experience with tessellation shaders is confined to trying to get this work. Very much a beginner. I get how it works, just have very little experience with them.

Re: OpenGL 3+ RenderSystem

Posted: Mon Apr 15, 2013 1:47 am
by holocronweaver
Do you have particular test systems that need debugging or additional work? I have never debugged tessellation shaders using software debuggers, so that would be new to me. Up to now I always fix things the old fashion way by visualizing the tessellation grid and tweaking the shader until everything works.

Re: OpenGL 3+ RenderSystem

Posted: Mon Apr 15, 2013 2:14 am
by masterfalcon
So far I have only tried the tessellation sample. I'm not even sure if the shaders I wrote are correct.

Re: OpenGL 3+ RenderSystem

Posted: Mon Apr 15, 2013 7:45 pm
by Ident
Once there is a working simple test-case I can also step in to help,test and find bugs and debug, because from then on I will be able to use this in my project.

Re: OpenGL 3+ RenderSystem

Posted: Mon Apr 15, 2013 7:48 pm
by bvanevery
I can test whether it screws anything up on a 3d card that doesn't have tessellation.

Re: OpenGL 3+ RenderSystem

Posted: Tue Apr 16, 2013 5:14 am
by masterfalcon
I tried a little work recently. It didn't seem to help but may be in the right direction. I'm attaching the diff just in case it helps anyone.

Re: OpenGL 3+ RenderSystem

Posted: Wed Apr 17, 2013 1:37 pm
by holocronweaver
@masterfalcon: Do you think finishing up the OpenGL 3+ render system and creating samples would make a good GSoC project?

Re: OpenGL 3+ RenderSystem

Posted: Wed Apr 17, 2013 9:13 pm
by masterfalcon
Possibly. I'm afraid that there wouldn't be enough but we could probably come up with a good sized list of things to implement.

Re: OpenGL 3+ RenderSystem

Posted: Thu Apr 18, 2013 5:45 am
by masterfalcon
Another update to my tessellation work. It's rendering something at least, if you move the mouse around you'll see it. I suspect that there is something wrong with how I translated the shaders. Would anyone be able to verify?

Re: OpenGL 3+ RenderSystem

Posted: Tue Apr 30, 2013 6:23 pm
by holocronweaver
masterfalcon wrote:Another update to my tessellation work. It's rendering something at least, if you move the mouse around you'll see it. I suspect that there is something wrong with how I translated the shaders. Would anyone be able to verify?
I will check this out when I get home today.

BTW, besides the samples, are there any visual tests for OpenGL 3+?

Re: OpenGL 3+ RenderSystem

Posted: Tue Apr 30, 2013 8:04 pm
by Klaim
masterfalcon wrote:Another update to my tessellation work. It's rendering something at least, if you move the mouse around you'll see it. I suspect that there is something wrong with how I translated the shaders. Would anyone be able to verify?
Sorry I will not be able to test until at least thursday.

Re: OpenGL 3+ RenderSystem

Posted: Tue Apr 30, 2013 9:21 pm
by masterfalcon
@holocronweaver Nothing specific, just the normal tests. I have them partially running but they crash part way through. I know why, just haven't gotten to fixing it yet.

@Klaim No problem. Take your time.

Re: OpenGL 3+ RenderSystem

Posted: Thu May 09, 2013 11:18 am
by dermont
Not sure if I should be posting this in Help (if so sorry).

I'm trying to create a simple example using OpenGL3+ from looking at the Sdk Samples.

From trial and error and with the ShaderGeneratorTechniqueResolverListener where it appears that the Ogre::RTShader creates shaders for material's (with DEFAULT_SCHEME_NAME) techniques I can display a mesh on the screen.

The problem I encounter is creating a manual video texture to play a gstreamer video.

With OpenGL everything works fine where I use a shader to swap the gstreamer data red and blue components.

With OpenGL3+ it just doesn't work and I'm not sure how to do this, whether it is a problem in my version 150 shaders or I'm not understanding something basic (most likely). I've disabled the ShaderGeneratorTechniqueResolverListener for testing this. Any help or pointers would be greatly appreciated, failing that I guess I'll have to test with a native GL demo.

The video texture:

Code: Select all

// Create new texture with updated dimensions.
    mVideoTexture = Ogre::TextureManager::getSingleton().createManual(
                    mName + "_Texture",
                    ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
                    TEX_TYPE_2D,
                    mVideoWidth, mVideoHeight,
                    0,PF_X8R8G8B8,
                    //0, PF_B8G8R8A8,
                    //0, PF_R8G8B8A8, //THIS ONE
                    //0,PF_A8R8G8B8,
                    TU_DYNAMIC_WRITE_ONLY);

    //mVideoMaterial->getTechnique(0)->setSchemeName("ShaderScheme");
    mVideoMaterial->getTechnique(0)->getPass(0)->removeAllTextureUnitStates();
    mVideoMaterial->getTechnique(0)->getPass(0)->createTextureUnitState(
                    mVideoTexture->getName());

The shaders, for OpenGL these were used to swap the red and blue components.

Code: Select all

    String customVideoMatVp_GLSL =
        "#version 150 \n"
        "in vec2 uv0;\n"
        "in vec4 vertex;\n"
        "out vec2 oUv0;\n"
        "uniform mat4 worldViewProj;\n"
        "void main()\n"
        "{\n"
            " gl_Position = worldViewProj * vertex;\n"
            " oUv0.xy = uv0.xy;\n"
        "}\n";

    String customVideoMatFp_GLSL =
        "#version 150 \n"
        "in vec2 oUv0;\n"
        "out vec4 fragColour;\n"
        "uniform sampler2D diffuseMap;\n"
        "void main()\n"
        "{\n"
           " fragColour = vec4(texture(diffuseMap, oUv0.xy).zyx,1.0);\n"
        "}\n";

        String customVideoMatVp_GLSL_120 =
            " #version 120 \n"
            " varying vec2 UV;\n"
            " uniform mat4 worldViewProj;\n"
            " void main()\n"
            " {\n"
                " gl_Position = worldViewProj * gl_Vertex;\n"
                " UV = gl_MultiTexCoord0.xy;"
            " }\n";
        String customVideoMatFp_GLSL_120 =
            " varying vec2 UV;\n"
            " uniform sampler2D diffuseMap;\n"
            " void main()\n"
            "{\n"
                " gl_FragColor = vec4(texture2D(diffuseMap, UV).zyx,1.0);\n"
            "}\n";

    bool useCG = false;
    bool useGLSL120 = false;
   bool useGLSL150 = true;

    String mLanguage;
    if (useCG)
        mLanguage = "cg";
    else
        mLanguage = "glsl";

    HighLevelGpuProgramPtr vp = HighLevelGpuProgramManager::getSingleton()
                .createProgram("VideoVp",
                        ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
                        mLanguage, GPT_VERTEX_PROGRAM);
    HighLevelGpuProgramPtr fp = HighLevelGpuProgramManager::getSingleton()
            .createProgram("VideoFp",
            ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
                mLanguage, GPT_FRAGMENT_PROGRAM);


    if (vp->getLanguage()=="cg") {
        vp->setSource(customVideoMatVp_CG);
        vp->setParameter("profiles", "vs_1_1 arbvp1");
        vp->setParameter("entry_point", "VideoVp");
    }
    else {
        if (useGLSL120) {
            vp->setParameter("syntax", "glsl");
            vp->setSource(customVideoMatVp_GLSL_120);
        }
        else
        {
            vp->setParameter("syntax", "glsl150");
            vp->setSource(customVideoMatVp_GLSL);
        }
    }

    if (fp->getLanguage()=="cg") {
        fp->setSource(customVideoMatFp_CG);
        fp->setParameter("profiles", "ps_1_1 arbfp1");
        fp->setParameter("entry_point", "VideoFp");
    }
    else
    {
        if (useGLSL120) {
            fp->setParameter("syntax", "glsl");
            fp->setSource(customVideoMatFp_GLSL_120);
        }
        else
        {
            fp->setParameter("syntax", "glsl150");
            fp->setSource(customVideoMatFp_GLSL);
        }
    }

    vp->load();
    fp->load();

    p->setVertexProgram("VideoVp");
    p->setFragmentProgram("VideoFp");

    p->getVertexProgramParameters()->setNamedAutoConstant(
                "worldViewProj", 
                GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX);

    if (!useCG)
        p->getFragmentProgramParameters()->setNamedConstant(
                "diffuseMap", 
                0);
Updating the texture data where memory/size is the GStreamer memory/size of data.

Code: Select all


//guint8* memory, gsize size

HardwarePixelBufferSharedPtr pixelBuffer = mVideoTexture->getBuffer();
void* textureData = pixelBuffer->lock(HardwareBuffer::HBL_DISCARD);
memcpy(textureData, &memory[0], (int)size);
pixelBuffer->unlock();

Re: OpenGL 3+ RenderSystem

Posted: Thu May 09, 2013 6:57 pm
by masterfalcon
Is it crashing or are you just not getting the output you expect? You could try turning on GL error checks in OgreGL3PlusPrerequisites.h and see if that reveals part of the problem. Otherwise I can try to take a look later using your sample.

Re: OpenGL 3+ RenderSystem

Posted: Thu May 09, 2013 7:50 pm
by dermont
masterfalcon wrote:Is it crashing or are you just not getting the output you expect?
No it just outputs something unrelated to whatever the video is.
http://img818.imageshack.us/img818/4985/gstreamer.png
masterfalcon wrote:You could try turning on GL error checks in OgreGL3PlusPrerequisites.h and see if that reveals part of the problem.
Yeah I'll try that and running through apitrace.
masterfalcon wrote:Otherwise I can try to take a look later using your sample.
No need, you have enough on your plate. I was just hoping that I had was doing something so dumb due to me misunderstanding the differences between GL and GL3+ that it would be blatantly obvious.

I'll try implementing one of the demos that has a manual texture and work from there.

Re: OpenGL 3+ RenderSystem

Posted: Sun May 12, 2013 11:08 am
by dermont
dermont wrote:
masterfalcon wrote:
masterfalcon wrote:You could try turning on GL error checks in OgreGL3PlusPrerequisites.h and see if that reveals part of the problem.
Yeah I'll try that and running through apitrace.
To debug this:

a) I disabled the Vertex/FragmentProgram creation. The video played OK with the shaders generated via ShaderGeneratorTechniqueResolverListener.

However I need a straightforward way to update the shader code, e.g. swap red and blue components.

b) I wrote out the material from the MaterialSerializer, and obtained a copy of the vertex/fragment shaders ShaderGeneratorTechniqueResolverListener. I combined these into material/shader files and everything works fine using these media. The ShaderGeneratorTechniqueResolverListener was never invoked.

c) I returned to creating the programs in code noticed that there was an additional technique, so I removed the technique(1) and it segfaulted in ShaderGeneratorTechniqueResolverListener. There appears to be no difference in my code and that of (b). I set technique(0) setSchemeName to Ogre::RTShader::ShaderGenerator::DEFAULT_SCHEME_NAME and it worked fine.

I understand that the problem is probably with my understanding of scheme usage and that I probably need to update shader listener to handle my particular case (i.e. no GL2 shaders etc).

Thanks for all your advice anyway.

Re: OpenGL 3+ RenderSystem

Posted: Wed May 15, 2013 3:00 pm
by Syniurge
On Mesa's current R600 driver the plugin fails to load with:

Code: Select all

symbol lookup error: /home/syniurge/Projets/Dependencies/ogre_build/lib/RenderSystem_GL3Plus.so.1.9.0: undefined symbol: glXCreateContextAttribsARB
Is this because it's calling glXCreateContextAttribsARB directly instead of using glXGetProcAddressARB?

Re: OpenGL 3+ RenderSystem

Posted: Wed May 15, 2013 3:35 pm
by masterfalcon
Probably. Perhaps we need to add a function pointer and get the address.

Re: OpenGL 3+ RenderSystem

Posted: Thu May 16, 2013 6:44 am
by dermont
When running the animation demos from SampleBrowser OepnGL3 they are all software skinning. The following message is displayed:

Code: Select all

Error attaching FFPLib_Common_VS shader object to GLSL Program Object
Program binary could not be loaded. Binary is not compatible with current driver/hardware combination.
In SampleContext.h it appears to be adding resources for RTShaderLib/GLSL and RTShaderLib/GLSL150. Shouldn't it be one or the other?

Code: Select all

https://bitbucket.org/sinbad/ogre/raw/2ad4bd4336205e6964152141bcf15e105d215fea/Samples/Common/include/SampleContext.h

else if(Ogre::GpuProgramManager::getSingleton().isSyntaxSupported("glsl"))
            {
Ogre::ResourceGroupManager::getSingleton().addResourceLocation(arch + "/RTShaderLib/GLSL", type, sec);
                if(Ogre::GpuProgramManager::getSingleton().isSyntaxSupported("glsl150"))
                {
                    Ogre::ResourceGroupManager::getSingleton().addResourceLocation(arch + "/RTShaderLib/GLSL150", type, sec);
                }
            }
For the Skeletal Animation demo I removed the Software blending technique for jaiqua, updated SampleContext.h to load only RTShaderLib/GLSL or RTShaderLib/GLSL150. I get the following error:

Code: Select all

GLSL compile log: Ogre/HardwareSkinningTwoWeightsShadowCasterGLSL
0(43) : error C7533: global variable gl_TexCoord is deprecated after version 120
GLSL compile log: Ogre/HardwareSkinningTwoWeightsShadowCasterGLSL
https://bitbucket.org/sinbad/ogre/src/2 ... sl?at=v1-9

Indeed the deprecated function is in the gl_TexCoord GLSL150 programs. Does this mean that not all shaders have been updated or am I doing something wrong here.