From Art Tevs,
"A new texture class Texture2DArray derived from Texture extends the osg to support the new EXT_texture_array extensions. Texture arrays provides a feature for people interesting in GPGPU programming. Faetures and changes: - Full support for layered 2D textures. - New uniform types were added (sampler2DArray) - FrameBufferObject implementation were changed to support attaching of 2D array textures to the framebuffer - StateSet was slightly changed to support texture arrays. NOTE: array textures can not be used in fixed function pipeline. Thus using the layered texture as a statemode for a Drawable produce invalid enumerant OpenGL errors. - Image class was extended to support handling of array textures Tests: I have used this class as a new feature of my application. It works for me without problems (Note: Texture arrays were introduced only for shading languages and not for fixed function pipelines!!!). RTT with Texture2DArray works, as I have tested them as texture targets for a camera with 6 layers/faces (i.e. replacement for cube maps). I am using the array textures in shader programming. Array textures can be attached to the FBO and used as input and as output."
This commit is contained in:
@@ -44,6 +44,7 @@
|
||||
#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2
|
||||
#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3
|
||||
#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4
|
||||
#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4
|
||||
#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0
|
||||
#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1
|
||||
#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2
|
||||
@@ -105,13 +106,16 @@ namespace osg
|
||||
typedef void APIENTRY TglFramebufferTexture1DEXT(GLenum, GLenum, GLenum, GLuint, GLint);
|
||||
typedef void APIENTRY TglFramebufferTexture2DEXT(GLenum, GLenum, GLenum, GLuint, GLint);
|
||||
typedef void APIENTRY TglFramebufferTexture3DEXT(GLenum, GLenum, GLenum, GLuint, GLint, GLint);
|
||||
typedef void APIENTRY TglFramebufferTextureLayerEXT(GLenum, GLenum, GLuint, GLint, GLint);
|
||||
typedef void APIENTRY TglFramebufferRenderbufferEXT(GLenum, GLenum, GLenum, GLuint);
|
||||
typedef void APIENTRY TglGenerateMipmapEXT(GLenum);
|
||||
|
||||
typedef void APIENTRY TglRenderbufferStorageMultisampleCoverageNV(GLenum, GLuint, GLuint, GLenum, GLuint, GLuint);
|
||||
|
||||
TglBindRenderbufferEXT* glBindRenderbufferEXT;
|
||||
TglGenRenderbuffersEXT* glGenRenderbuffersEXT;
|
||||
TglDeleteRenderbuffersEXT* glDeleteRenderbuffersEXT;
|
||||
TglRenderbufferStorageEXT* glRenderbufferStorageEXT;
|
||||
TglRenderbufferStorageMultisampleCoverageNV* glRenderbufferStorageMultisampleCoverageNV;
|
||||
TglBindFramebufferEXT* glBindFramebufferEXT;
|
||||
TglDeleteFramebuffersEXT* glDeleteFramebuffersEXT;
|
||||
TglGenFramebuffersEXT* glGenFramebuffersEXT;
|
||||
@@ -119,6 +123,7 @@ namespace osg
|
||||
TglFramebufferTexture1DEXT* glFramebufferTexture1DEXT;
|
||||
TglFramebufferTexture2DEXT* glFramebufferTexture2DEXT;
|
||||
TglFramebufferTexture3DEXT* glFramebufferTexture3DEXT;
|
||||
TglFramebufferTextureLayerEXT* glFramebufferTextureLayerEXT;
|
||||
TglFramebufferRenderbufferEXT* glFramebufferRenderbufferEXT;
|
||||
TglGenerateMipmapEXT* glGenerateMipmapEXT;
|
||||
|
||||
@@ -246,6 +251,7 @@ namespace osg
|
||||
class Texture1D;
|
||||
class Texture2D;
|
||||
class Texture3D;
|
||||
class Texture2DArray;
|
||||
class TextureCubeMap;
|
||||
class TextureRectangle;
|
||||
|
||||
@@ -259,6 +265,7 @@ namespace osg
|
||||
explicit FrameBufferAttachment(Texture1D* target, int level = 0);
|
||||
explicit FrameBufferAttachment(Texture2D* target, int level = 0);
|
||||
explicit FrameBufferAttachment(Texture3D* target, int zoffset, int level = 0);
|
||||
explicit FrameBufferAttachment(Texture2DArray* target, int layer, int level = 0);
|
||||
explicit FrameBufferAttachment(TextureCubeMap* target, int face, int level = 0);
|
||||
explicit FrameBufferAttachment(TextureRectangle* target);
|
||||
explicit FrameBufferAttachment(Camera::Attachment& attachment);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
|
||||
* Copyright (C) 2003-2005 3Dlabs Inc. Ltd.
|
||||
* Copyright (C) 2004-2005 Nathan Cournia
|
||||
* Copyright (C) 2007 Art Tevs
|
||||
*
|
||||
* This application is open source and may be redistributed and/or modified
|
||||
* freely and without restriction, both in commericial and non commericial
|
||||
@@ -23,6 +24,17 @@
|
||||
|
||||
#include <string>
|
||||
|
||||
#ifndef GL_VERSION_2_1 //[
|
||||
#define GL_VERSION_2_1 1
|
||||
|
||||
#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0
|
||||
#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1
|
||||
#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3
|
||||
#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4
|
||||
|
||||
#endif //]
|
||||
|
||||
|
||||
#ifndef GL_VERSION_2_0 //[
|
||||
#define GL_VERSION_2_0 1
|
||||
typedef char GLchar;
|
||||
|
||||
@@ -156,6 +156,10 @@
|
||||
#define GL_TEXTURE_3D 0x806F
|
||||
#endif
|
||||
|
||||
#ifndef GL_TEXTURE_2D_ARRAY_EXT
|
||||
#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A
|
||||
#endif
|
||||
|
||||
#ifndef GL_TEXTURE_BINDING_3D
|
||||
#define GL_TEXTURE_BINDING_3D 0x806A
|
||||
#endif
|
||||
|
||||
239
include/osg/Texture2DArray
Normal file
239
include/osg/Texture2DArray
Normal file
@@ -0,0 +1,239 @@
|
||||
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
|
||||
*
|
||||
* This library is open source and may be redistributed and/or modified under
|
||||
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||
* (at your option) any later version. The full license is in LICENSE file
|
||||
* included with this distribution, and on the openscenegraph.org website.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* OpenSceneGraph Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef OSG_TEXTURE2DARRAY
|
||||
#define OSG_TEXTURE2DARRAY 1
|
||||
|
||||
#include <osg/Texture>
|
||||
#include <list>
|
||||
|
||||
#ifndef GL_TEXTURE_2D_ARRAY_EXT
|
||||
#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A
|
||||
#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B
|
||||
#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D
|
||||
#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF
|
||||
#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E
|
||||
#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1
|
||||
#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4
|
||||
#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4
|
||||
#endif
|
||||
|
||||
namespace osg {
|
||||
|
||||
/** Texture2DArray state class which encapsulates OpenGL 2D array texture functionality.
|
||||
* Texture arrays were introduced with Shader Model 4.0 hardware.
|
||||
*
|
||||
* A 2D texture array does contain textures sharing the same properties (e.g. size, bitdepth,...)
|
||||
* in a layered structure. See http://www.opengl.org/registry/specs/EXT/texture_array.txt for more info.
|
||||
*/
|
||||
class OSG_EXPORT Texture2DArray : public Texture
|
||||
{
|
||||
|
||||
public :
|
||||
|
||||
Texture2DArray();
|
||||
|
||||
/** Copy constructor using CopyOp to manage deep vs shallow copy. */
|
||||
Texture2DArray(const Texture2DArray& cm,const CopyOp& copyop=CopyOp::SHALLOW_COPY);
|
||||
|
||||
META_StateAttribute(osg, Texture2DArray, TEXTURE);
|
||||
|
||||
/** Return -1 if *this < *rhs, 0 if *this==*rhs, 1 if *this>*rhs. */
|
||||
virtual int compare(const StateAttribute& rhs) const;
|
||||
|
||||
virtual GLenum getTextureTarget() const { return GL_TEXTURE_2D_ARRAY_EXT; }
|
||||
|
||||
/** Set the texture image for specified layer. */
|
||||
virtual void setImage(unsigned int layer, Image* image);
|
||||
|
||||
/** Get the texture image for specified layer. */
|
||||
virtual Image* getImage(unsigned int layer);
|
||||
|
||||
/** Get the const texture image for specified layer. */
|
||||
virtual const Image* getImage(unsigned int layer) const;
|
||||
|
||||
/** Get the number of images that are assigned to the Texture.
|
||||
* The number is equal to the texture depth. To get the maximum possible
|
||||
* image/layer count, you have to use the extension subclass, since it provides
|
||||
* graphic context dependent information.
|
||||
*/
|
||||
virtual unsigned int getNumImages() const { return getTextureDepth(); }
|
||||
|
||||
/** Check how often was a certain layer in the given context modified */
|
||||
inline unsigned int& getModifiedCount(unsigned int layer, unsigned int contextID) const
|
||||
{
|
||||
// get the modified count for the current contextID.
|
||||
return _modifiedCount[layer][contextID];
|
||||
}
|
||||
|
||||
/** Set the texture width and height. If width or height are zero then
|
||||
* the repsective size value is calculated from the source image sizes.
|
||||
* Depth parameter specifies the number of layers to be used.
|
||||
*/
|
||||
void setTextureSize(int width, int height, int depth);
|
||||
|
||||
void setTextureWidth(int width) { _textureWidth=width; }
|
||||
void setTextureHeight(int height) { _textureHeight=height; }
|
||||
void setTextureDepth(int depth);
|
||||
|
||||
virtual int getTextureWidth() const { return _textureWidth; }
|
||||
virtual int getTextureHeight() const { return _textureHeight; }
|
||||
virtual int getTextureDepth() const { return _textureDepth; }
|
||||
|
||||
class OSG_EXPORT SubloadCallback : public Referenced
|
||||
{
|
||||
public:
|
||||
virtual void load(const Texture2DArray& texture,State& state) const = 0;
|
||||
virtual void subload(const Texture2DArray& texture,State& state) const = 0;
|
||||
};
|
||||
|
||||
|
||||
void setSubloadCallback(SubloadCallback* cb) { _subloadCallback = cb;; }
|
||||
|
||||
SubloadCallback* getSubloadCallback() { return _subloadCallback.get(); }
|
||||
|
||||
const SubloadCallback* getSubloadCallback() const { return _subloadCallback.get(); }
|
||||
|
||||
|
||||
|
||||
/** Set the number of mip map levels the the texture has been created with.
|
||||
* Should only be called within an osg::Texuture::apply() and custom OpenGL texture load.
|
||||
*/
|
||||
void setNumMipmapLevels(unsigned int num) const { _numMipmapLevels=num; }
|
||||
|
||||
/** Get the number of mip map levels the the texture has been created with. */
|
||||
unsigned int getNumMipmapLevels() const { return _numMipmapLevels; }
|
||||
|
||||
/** Copies a two-dimensional texture subimage, as per
|
||||
* glCopyTexSubImage3D. Updates a portion of an existing OpenGL
|
||||
* texture object from the current OpenGL background framebuffer
|
||||
* contents at position \a x, \a y with width \a width and height
|
||||
* \a height. Loads framebuffer data into the texture using offsets
|
||||
* \a xoffset and \a yoffset. \a zoffset specifies the layer of the texture
|
||||
* array to which the result is copied.
|
||||
*/
|
||||
void copyTexSubImage2DArray(State& state, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height );
|
||||
|
||||
/** Bind the texture if already compiled. Otherwise recompile.
|
||||
*/
|
||||
virtual void apply(State& state) const;
|
||||
|
||||
|
||||
/** Extensions class which encapsulates the querying of extensions and
|
||||
* associated function pointers, and provides convinience wrappers to
|
||||
* check for the extensions or use the associated functions.
|
||||
*/
|
||||
class OSG_EXPORT Extensions : public osg::Referenced
|
||||
{
|
||||
public:
|
||||
Extensions(unsigned int contextID);
|
||||
|
||||
Extensions(const Extensions& rhs);
|
||||
|
||||
void lowestCommonDenominator(const Extensions& rhs);
|
||||
|
||||
void setupGLExtensions(unsigned int contextID);
|
||||
|
||||
void setTexture2DArraySupported(bool flag) { _isTexture2DArraySupported=flag; }
|
||||
bool isTexture2DArraySupported() const { return _isTexture2DArraySupported; }
|
||||
|
||||
void setTexture3DSupported(bool flag) { _isTexture3DSupported=flag; }
|
||||
bool isTexture3DSupported() const { return _isTexture3DSupported; }
|
||||
|
||||
void setMaxLayerCount(GLint count) { _maxLayerCount = count; }
|
||||
GLint maxLayerCount() const { return _maxLayerCount; }
|
||||
|
||||
void setMax2DSize(GLint size) { _max2DSize = size; }
|
||||
GLint max2DSize() const { return _max2DSize; }
|
||||
|
||||
void setTexImage3DProc(void* ptr) { _glTexImage3D = ptr; }
|
||||
void glTexImage3D( GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels) const;
|
||||
|
||||
void setTexSubImage3DProc(void* ptr) { _glTexSubImage3D = ptr; }
|
||||
void glTexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels) const;
|
||||
|
||||
void setCopyTexSubImage3DProc(void* ptr) { _glCopyTexSubImage3D = ptr; }
|
||||
void glCopyTexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height ) const;
|
||||
|
||||
bool isCompressedTexImage3DSupported() const { return _glCompressedTexImage3D!=0; }
|
||||
void setCompressedTexImage3DProc(void* ptr) { _glCompressedTexImage3D = ptr; }
|
||||
void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data) const;
|
||||
|
||||
bool isCompressedTexSubImage3DSupported() const { return _glCompressedTexSubImage3D!=0; }
|
||||
void setCompressedTexSubImage3DProc(void* ptr) { _glCompressedTexSubImage3D = ptr; }
|
||||
void glCompressedTexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data ) const;
|
||||
|
||||
protected:
|
||||
|
||||
~Extensions() {}
|
||||
|
||||
bool _isTexture2DArraySupported;
|
||||
bool _isTexture3DSupported;
|
||||
|
||||
GLint _maxLayerCount;
|
||||
GLint _max2DSize;
|
||||
|
||||
void* _glTexImage3D;
|
||||
void* _glTexSubImage3D;
|
||||
void* _glCompressedTexImage3D;
|
||||
void* _glCompressedTexSubImage3D;
|
||||
void* _glCopyTexSubImage3D;
|
||||
|
||||
};
|
||||
|
||||
/** Function to call to get the extension of a specified context.
|
||||
* If the Exentsion object for that context has not yet been created
|
||||
* and the 'createIfNotInitalized' flag been set to false then returns NULL.
|
||||
* If 'createIfNotInitalized' is true then the Extensions object is
|
||||
* automatically created. However, in this case the extension object will
|
||||
* only be created with the graphics context associated with ContextID.
|
||||
*/
|
||||
static Extensions* getExtensions(unsigned int contextID,bool createIfNotInitalized);
|
||||
|
||||
/** The setExtensions method allows users to override the extensions across graphics contexts.
|
||||
* Typically used when you have different extensions supported across graphics pipes
|
||||
* but need to ensure that they all use the same low common denominator extensions.
|
||||
*/
|
||||
static void setExtensions(unsigned int contextID,Extensions* extensions);
|
||||
|
||||
|
||||
protected :
|
||||
|
||||
virtual ~Texture2DArray();
|
||||
|
||||
bool imagesValid() const;
|
||||
|
||||
virtual void computeInternalFormat() const;
|
||||
|
||||
void applyTexImage2DArray_subload(State& state, Image* image, GLsizei& inwidth, GLsizei& inheight, GLsizei& indepth, GLsizei& numMipmapLevels) const;
|
||||
|
||||
/**
|
||||
* Use std::vector to encapsulate referenced pointers to images of different layers.
|
||||
* Vectors gives us a random access iterator. The overhead of non-used elements is negligeable */
|
||||
std::vector<ref_ptr<Image> > _images;
|
||||
|
||||
// subloaded images can have different texture and image sizes.
|
||||
mutable GLsizei _textureWidth, _textureHeight, _textureDepth;
|
||||
|
||||
// number of mip map levels the the texture has been created with,
|
||||
mutable GLsizei _numMipmapLevels;
|
||||
|
||||
ref_ptr<SubloadCallback> _subloadCallback;
|
||||
|
||||
typedef buffered_value<unsigned int> ImageModifiedCount;
|
||||
mutable std::vector<ImageModifiedCount> _modifiedCount;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -165,6 +165,12 @@ class OSG_EXPORT Uniform : public Object
|
||||
SAMPLER_CUBE = GL_SAMPLER_CUBE,
|
||||
SAMPLER_1D_SHADOW = GL_SAMPLER_1D_SHADOW,
|
||||
SAMPLER_2D_SHADOW = GL_SAMPLER_2D_SHADOW,
|
||||
|
||||
SAMPLER_1D_ARRAY = GL_SAMPLER_1D_ARRAY_EXT,
|
||||
SAMPLER_2D_ARRAY = GL_SAMPLER_2D_ARRAY_EXT,
|
||||
SAMPLER_1D_ARRAY_SHADOW = GL_SAMPLER_1D_ARRAY_SHADOW_EXT,
|
||||
SAMPLER_2D_ARRAY_SHADOW = GL_SAMPLER_2D_ARRAY_SHADOW_EXT,
|
||||
|
||||
UNDEFINED = 0x0
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user