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 <[email protected] > 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 > [email protected] > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org >
_______________________________________________ osg-users mailing list [email protected] http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

