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:
@@ -21,6 +21,7 @@
|
||||
#include <osg/StateSet>
|
||||
#include <osg/Texture2D>
|
||||
#include <osg/Texture3D>
|
||||
#include <osg/Texture2DArray>
|
||||
|
||||
#include "dxtctool.h"
|
||||
|
||||
@@ -522,14 +523,25 @@ void Image::readImageFromCurrentTexture(unsigned int contextID, bool copyMipMaps
|
||||
{
|
||||
const osg::Texture::Extensions* extensions = osg::Texture::getExtensions(contextID,true);
|
||||
const osg::Texture3D::Extensions* extensions3D = osg::Texture3D::getExtensions(contextID,true);
|
||||
const osg::Texture2DArray::Extensions* extensions2DArray = osg::Texture2DArray::getExtensions(contextID,true);
|
||||
|
||||
|
||||
GLboolean binding1D, binding2D, binding3D;
|
||||
GLboolean binding1D, binding2D, binding3D, binding2DArray;
|
||||
glGetBooleanv(GL_TEXTURE_BINDING_1D, &binding1D);
|
||||
glGetBooleanv(GL_TEXTURE_BINDING_2D, &binding2D);
|
||||
glGetBooleanv(GL_TEXTURE_BINDING_3D, &binding3D);
|
||||
|
||||
|
||||
if (extensions2DArray->isTexture2DArraySupported())
|
||||
{
|
||||
glGetBooleanv(GL_TEXTURE_BINDING_2D_ARRAY_EXT, &binding2DArray);
|
||||
}
|
||||
else
|
||||
{
|
||||
binding2DArray - GL_FALSE;
|
||||
}
|
||||
|
||||
GLenum textureMode = binding1D ? GL_TEXTURE_1D : binding2D ? GL_TEXTURE_2D : binding3D ? GL_TEXTURE_3D : 0;
|
||||
GLenum textureMode = binding1D ? GL_TEXTURE_1D : binding2D ? GL_TEXTURE_2D : binding3D ? GL_TEXTURE_3D : binding2DArray ? GL_TEXTURE_2D_ARRAY_EXT : 0;
|
||||
|
||||
if (textureMode==0) return;
|
||||
|
||||
@@ -562,14 +574,21 @@ void Image::readImageFromCurrentTexture(unsigned int contextID, bool copyMipMaps
|
||||
{
|
||||
if (extensions->isCompressedTexImage2DSupported())
|
||||
{
|
||||
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPRESSED_ARB,&compressed);
|
||||
glGetTexLevelParameteriv(textureMode, 0, GL_TEXTURE_COMPRESSED_ARB,&compressed);
|
||||
}
|
||||
}
|
||||
else if (textureMode==GL_TEXTURE_3D)
|
||||
{
|
||||
if (extensions3D->isCompressedTexImage3DSupported())
|
||||
{
|
||||
glGetTexLevelParameteriv(GL_TEXTURE_3D, 0, GL_TEXTURE_COMPRESSED_ARB,&compressed);
|
||||
glGetTexLevelParameteriv(textureMode, 0, GL_TEXTURE_COMPRESSED_ARB,&compressed);
|
||||
}
|
||||
}
|
||||
else if (textureMode==GL_TEXTURE_2D_ARRAY_EXT)
|
||||
{
|
||||
if (extensions2DArray->isCompressedTexImage3DSupported())
|
||||
{
|
||||
glGetTexLevelParameteriv(textureMode, 0, GL_TEXTURE_COMPRESSED_ARB,&compressed);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user