[osg-users] Bindless Textures
Glenn Waldron
gwaldron at gmail.com
Fri Jul 15 08:33:44 PDT 2016
David,
This may or may not be helpful, but a while back I made a bindless version
of osg::Texture2D here you can look at. It's mostly a experiment but you
might be able to glean something front it:
https://github.com/gwaldron/osgearth/blob/bindless/src/osgEarth/Texture
https://github.com/gwaldron/osgearth/blob/bindless/src/osgEarth/Texture.cpp
Glenn Waldron
On Fri, Jul 15, 2016 at 10:21 AM, David Heitbrink <david-heitbrink at uiowa.edu
> wrote:
> Has any one implemented bindless textures? I am trying to add this to my
> app to improve batching. I have a large scene, with lots of unique draw
> calls. We do use texture atlas's, the number of small objects is limited. I
> would like to further improve batching without having to redo textures. I
> do have LODs and occluder nodes as well.
>
> Conveniently most of my objects use triangle list, so merging those worked
> out pretty well. I am using a shader storage buffer object to upload the
> texture handles to the shader. I have confirmed the value for the handles
> that I have set are getting into the shader.
>
> Here is the segment of my shader where I get the texture:
>
> Code:
>
>
> layout (binding = 0, std140) coherent buffer TEXTURE_BLOCK
> {
> uint64_t tex[512];
> };
> uniform int textureIndex;
> void doTexture(inout vec4 color) {
> sampler2D s = sampler2D(tex[textureIndex]);
> vec4 texel = texture2D(s,TexCoord[0]);
> color.rgb = texel.rgb*color.rgb;
> }
>
>
>
>
> I have a draw call back that grabs the extensions:
> glGetTextureHandleARB
> glMakeTextureHandleResidentARB
>
> Also it grabs the texture handles, I have visitor go and grab references
> to all the relevant textures (when the scene is loaded and the objects are
> merged), and I do:
>
> Code:
>
> osg::UIntArray* array =
> static_cast<osg::UIntArray*>(m_ssbo->getBufferData(0));
> vector<GLuint> &rawData = array->asVector();
> GLuint64* raw64ptr = (GLuint64*)(rawData.data());
>
>
> if (!bindings)
> return false;
> for (auto itr = m_textureIdMap.begin(); itr != m_textureIdMap.end();
> ++itr){
> osg::Texture* text= m_textureMap[itr->first];
> int id = itr->second;
> auto textObject = text->getTextureObject(rinfo.getContextID());
> if (!textObject){
> text->apply(*rinfo.getState());
> textObject = text->getTextureObject(rinfo.getContextID());
> if (!textObject) return false;
> }
> uint64 textId = glGetTextureHandleARB(textObject->_id);
> if (glIsTextureHandleResidentARB(textId)==GL_FALSE)
> glMakeTextureHandleResidentARB(textObject->_id);
> raw64ptr[id] = textId;
> }
>
>
>
> Right now I am getting black for my texture, I cycle through textureIndex
> from my first texture to my last, I plan on replacing this with an
> attribute later, but there is not much point right now if I cannot get any
> textures to show up. If I do get this to work I do plan on building an
> example app and submitting it.
>
> #version 430 compatibility
> #extension GL_NV_bindless_texture : require
> #extension GL_NV_shader_buffer_load : require
> #extension GL_NV_gpu_shader5 : require // uint64_t
>
> I am not sure doing a apply() to the texture and grabbing the id is the
> best idea.
>
> I am using OSG 3.4.0, I did make some modifications to support unsigned 64
> bit uniforms, and to built OSG built-ins to after the last #extension. I
> have not checked to see if some has added this to the most recent
> development branch, if not I would gladly
>
> ------------------
> Read this topic online here:
> http://forum.openscenegraph.org/viewtopic.php?p=68142#68142
>
>
>
>
>
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/attachments/20160715/cb954be9/attachment-0003.htm>
More information about the osg-users
mailing list