1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-10 18:51:21 +03:00
occt/src/OpenGl/OpenGl_Texture.hxx
kgv ba00aab7a0 0029528: Visualization, TKOpenGl - allow defining sRGB textures
OpenGL rendering is now done into sRGB framebuffer.
OpenGl_ShaderManager::prepareStdProgramFboBlit() has been extended
by programs resolving MSAA texture and applying gamma correction as fallbacks.

Quantity_Color definition has been modified to store RGB components
in linear color space within Quantity_TOC_RGB type.
Standard colors defined by Quantity_NameOfColor enumeration has been updated accordingly.
New Quantity_TOC_sRGB type has been introduced to handle RGB components in non-linear sRGB color space.

OpenGl_TextureFormat class definition has been moved to dedicated files.
New method OpenGl_TextureFormat::FindFormat() replaces OpenGl_Texture::GetDataFormat().
New method OpenGl_TextureFormat::FindSizedFormat() replaces OpenGl_FrameBuffer::getColorDataFormat()
and OpenGl_FrameBuffer::getDepthDataFormat().

Graphic3d_TextureRoot::IsColorMap() - introduced new property defining
if RGB(A)8 image formats should be loaded as sRGB(A) textures or as data RGB(A) textures.
OpenGl_Texture initialization methods have been extended with new theIsColorMap argument.

vreadpixel - added argument -sRGB printing color in sRGB color space.

Test cases have been updated to new sRGB rendered results.
2019-10-22 15:15:52 +03:00

289 lines
13 KiB
C++

// Created by: Kirill GAVRILOV
// Copyright (c) 2013-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef _OpenGl_Texture_H__
#define _OpenGl_Texture_H__
#include <Graphic3d_CubeMap.hxx>
#include <OpenGl_TextureFormat.hxx>
#include <OpenGl_NamedResource.hxx>
#include <OpenGl_Sampler.hxx>
#include <Graphic3d_TextureUnit.hxx>
#include <Graphic3d_TypeOfTexture.hxx>
class Graphic3d_TextureParams;
class Image_PixMap;
//! Texture resource.
class OpenGl_Texture : public OpenGl_NamedResource
{
DEFINE_STANDARD_RTTIEXT(OpenGl_Texture, OpenGl_NamedResource)
public:
//! Helpful constants
static const GLuint NO_TEXTURE = 0;
//! Return pixel size of pixel format in bytes.
//! Note that this method considers that OpenGL natively supports this pixel format,
//! which might be not the case - in the latter case, actual pixel size might differ!
Standard_EXPORT static Standard_Size PixelSizeOfPixelFormat (Standard_Integer theInternalFormat);
public:
//! Create uninitialized texture.
Standard_EXPORT OpenGl_Texture (const TCollection_AsciiString& theResourceId = TCollection_AsciiString(),
const Handle(Graphic3d_TextureParams)& theParams = Handle(Graphic3d_TextureParams)());
//! Destroy object.
Standard_EXPORT virtual ~OpenGl_Texture();
//! @return true if current object was initialized
bool IsValid() const { return myTextureId != NO_TEXTURE; }
//! @return target to which the texture is bound (GL_TEXTURE_1D, GL_TEXTURE_2D)
GLenum GetTarget() const { return myTarget; }
//! @return texture width (0 LOD)
GLsizei SizeX() const { return mySizeX; }
//! @return texture height (0 LOD)
GLsizei SizeY() const { return mySizeY; }
//! @return texture ID
GLuint TextureId() const { return myTextureId; }
//! @return texture format (not sized)
GLenum GetFormat() const { return myTextFormat; }
//! @return texture format (sized)
GLint SizedFormat() const { return mySizedFormat; }
//! Return true for GL_RED and GL_ALPHA formats.
bool IsAlpha() const { return myIsAlpha; }
//! Setup to interprete the format as Alpha by Shader Manager
//! (should be GL_ALPHA within compatible context or GL_RED otherwise).
void SetAlpha (const bool theValue) { myIsAlpha = theValue; }
//! Creates Texture id if not yet generated.
//! Data should be initialized by another method.
Standard_EXPORT bool Create (const Handle(OpenGl_Context)& theCtx);
//! Destroy object - will release GPU memory if any.
Standard_EXPORT virtual void Release (OpenGl_Context* theCtx) Standard_OVERRIDE;
//! Return texture sampler.
const Handle(OpenGl_Sampler)& Sampler() const { return mySampler; }
//! Set texture sampler.
void SetSampler (const Handle(OpenGl_Sampler)& theSampler) { mySampler = theSampler; }
//! Initialize the Sampler Object (as OpenGL object).
//! @param theCtx currently bound OpenGL context
Standard_EXPORT bool InitSamplerObject (const Handle(OpenGl_Context)& theCtx);
//! Bind this Texture to the unit specified in sampler parameters.
//! Also binds Sampler Object if it is allocated.
void Bind (const Handle(OpenGl_Context)& theCtx) const
{
Bind (theCtx, mySampler->Parameters()->TextureUnit());
}
//! Unbind texture from the unit specified in sampler parameters.
//! Also unbinds Sampler Object if it is allocated.
void Unbind (const Handle(OpenGl_Context)& theCtx) const
{
Unbind (theCtx, mySampler->Parameters()->TextureUnit());
}
//! Bind this Texture to specified unit.
//! Also binds Sampler Object if it is allocated.
Standard_EXPORT void Bind (const Handle(OpenGl_Context)& theCtx,
const Graphic3d_TextureUnit theTextureUnit) const;
//! Unbind texture from specified unit.
//! Also unbinds Sampler Object if it is allocated.
Standard_EXPORT void Unbind (const Handle(OpenGl_Context)& theCtx,
const Graphic3d_TextureUnit theTextureUnit) const;
//! Revision of associated data source.
Standard_Size Revision() const { return myRevision; }
//! Set revision of associated data source.
void SetRevision (const Standard_Size theRevision) { myRevision = theRevision; }
//! Notice that texture will be unbound after this call.
Standard_EXPORT bool Init (const Handle(OpenGl_Context)& theCtx,
const Image_PixMap& theImage,
const Graphic3d_TypeOfTexture theType,
const Standard_Boolean theIsColorMap);
//! Initialize the texture with specified format, size and texture type.
//! If theImage is empty the texture data will contain trash.
//! Notice that texture will be unbound after this call.
Standard_EXPORT bool Init (const Handle(OpenGl_Context)& theCtx,
const OpenGl_TextureFormat& theFormat,
const Graphic3d_Vec2i& theSizeXY,
const Graphic3d_TypeOfTexture theType,
const Image_PixMap* theImage = NULL);
//! Initialize the texture with Graphic3d_TextureMap.
//! It is an universal way to initialize.
//! Sitable initialization method will be chosen.
Standard_EXPORT bool Init (const Handle(OpenGl_Context)& theCtx,
const Handle(Graphic3d_TextureMap)& theTextureMap);
//! Initialize the 2D multisampling texture using glTexImage2DMultisample().
Standard_EXPORT bool Init2DMultisample (const Handle(OpenGl_Context)& theCtx,
const GLsizei theNbSamples,
const GLint theTextFormat,
const GLsizei theSizeX,
const GLsizei theSizeY);
//! Allocates texture rectangle with specified format and size.
//! \note Texture data is not initialized (will contain trash).
Standard_EXPORT bool InitRectangle (const Handle(OpenGl_Context)& theCtx,
const Standard_Integer theSizeX,
const Standard_Integer theSizeY,
const OpenGl_TextureFormat& theFormat);
//! Initializes 3D texture rectangle with specified format and size.
Standard_EXPORT bool Init3D (const Handle(OpenGl_Context)& theCtx,
const OpenGl_TextureFormat& theFormat,
const Graphic3d_Vec3i& theSizeXYZ,
const void* thePixels);
//! @return true if texture was generated within mipmaps
Standard_Boolean HasMipmaps() const { return myHasMipmaps; }
//! Returns estimated GPU memory usage for holding data without considering overheads and allocation alignment rules.
Standard_EXPORT virtual Standard_Size EstimatedDataSize() const Standard_OVERRIDE;
//! Returns TRUE for point sprite texture.
virtual bool IsPointSprite() const { return false; }
public:
Standard_DEPRECATED("Deprecated method, OpenGl_TextureFormat::FindFormat() should be used instead")
static bool GetDataFormat (const Handle(OpenGl_Context)& theCtx,
const Image_Format theFormat,
GLint& theTextFormat,
GLenum& thePixelFormat,
GLenum& theDataType)
{
OpenGl_TextureFormat aFormat = OpenGl_TextureFormat::FindFormat (theCtx, theFormat, false);
theTextFormat = aFormat.InternalFormat();
thePixelFormat = aFormat.PixelFormat();
theDataType = aFormat.DataType();
return aFormat.IsValid();
}
Standard_DEPRECATED("Deprecated method, OpenGl_TextureFormat::FindFormat() should be used instead")
static bool GetDataFormat (const Handle(OpenGl_Context)& theCtx,
const Image_PixMap& theData,
GLint& theTextFormat,
GLenum& thePixelFormat,
GLenum& theDataType)
{
OpenGl_TextureFormat aFormat = OpenGl_TextureFormat::FindFormat (theCtx, theData.Format(), false);
theTextFormat = aFormat.InternalFormat();
thePixelFormat = aFormat.PixelFormat();
theDataType = aFormat.DataType();
return aFormat.IsValid();
}
Standard_DEPRECATED("Deprecated method, OpenGl_TextureFormat should be passed instead of separate parameters")
bool Init (const Handle(OpenGl_Context)& theCtx,
const GLint theTextFormat,
const GLenum thePixelFormat,
const GLenum theDataType,
const GLsizei theSizeX,
const GLsizei theSizeY,
const Graphic3d_TypeOfTexture theType,
const Image_PixMap* theImage = NULL)
{
OpenGl_TextureFormat aFormat;
aFormat.SetInternalFormat (theTextFormat);
aFormat.SetPixelFormat (thePixelFormat);
aFormat.SetDataType (theDataType);
return Init (theCtx, aFormat, Graphic3d_Vec2i (theSizeX, theSizeY), theType, theImage);
}
Standard_DEPRECATED("Deprecated method, theIsColorMap parameter should be explicitly specified")
bool Init (const Handle(OpenGl_Context)& theCtx,
const Image_PixMap& theImage,
const Graphic3d_TypeOfTexture theType)
{
return Init (theCtx, theImage, theType, true);
}
Standard_DEPRECATED("Deprecated method, OpenGl_TextureFormat should be passed instead of separate parameters")
bool Init3D (const Handle(OpenGl_Context)& theCtx,
const GLint theTextFormat,
const GLenum thePixelFormat,
const GLenum theDataType,
const Standard_Integer theSizeX,
const Standard_Integer theSizeY,
const Standard_Integer theSizeZ,
const void* thePixels)
{
OpenGl_TextureFormat aFormat;
aFormat.SetInternalFormat (theTextFormat);
aFormat.SetPixelFormat (thePixelFormat);
aFormat.SetDataType (theDataType);
return Init3D (theCtx, aFormat, Graphic3d_Vec3i (theSizeX, theSizeY, theSizeZ), thePixels);
}
protected:
//! Apply default sampler parameters after texture creation.
Standard_EXPORT void applyDefaultSamplerParams (const Handle(OpenGl_Context)& theCtx);
//! Initializes 6 sides of cubemap.
//! If theCubeMap is not NULL then size and format will be taken from it and corresponding arguments will be ignored.
//! Otherwise this parametres will be taken from arguments.
//! @param theCtx [in] active OpenGL context
//! @param theCubeMap [in] cubemap definition, can be NULL
//! @param theSize [in] cubemap dimensions
//! @param theFormat [in] image format
//! @param theToGenMipmap [in] flag to generate mipmaped cubemap
//! @param theIsColorMap [in] flag indicating cubemap storing color values
Standard_EXPORT bool initCubeMap (const Handle(OpenGl_Context)& theCtx,
const Handle(Graphic3d_CubeMap)& theCubeMap,
Standard_Size theSize,
Image_Format theFormat,
Standard_Boolean theToGenMipmap,
Standard_Boolean theIsColorMap);
protected:
Handle(OpenGl_Sampler) mySampler; //!< texture sampler
Standard_Size myRevision; //!< revision of associated data source
GLuint myTextureId; //!< GL resource ID
GLenum myTarget; //!< GL_TEXTURE_1D/GL_TEXTURE_2D/GL_TEXTURE_3D
GLsizei mySizeX; //!< texture width
GLsizei mySizeY; //!< texture height
GLsizei mySizeZ; //!< texture depth
GLenum myTextFormat; //!< texture format - GL_RGB, GL_RGBA,...
GLint mySizedFormat;//!< internal (sized) texture format
Standard_Integer myNbSamples; //!< number of MSAA samples
Standard_Boolean myHasMipmaps; //!< flag indicates that texture was uploaded with mipmaps
bool myIsAlpha; //!< indicates alpha format
};
DEFINE_STANDARD_HANDLE(OpenGl_Texture, OpenGl_NamedResource)
#endif // _OpenGl_Texture_H__