⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rendertexture.h

📁 PDE simulator on GPU.
💻 H
字号:
//------------------------------------------------------------------------------
// File : rendertexture.h
//------------------------------------------------------------------------------
// Copyright 2002 Mark J. Harris and
// The University of North Carolina at Chapel Hill
//------------------------------------------------------------------------------
// Permission to use, copy, modify, distribute and sell this software and its 
// documentation for any purpose is hereby granted without fee, provided that 
// the above copyright notice appear in all copies and that both that copyright 
// notice and this permission notice appear in supporting documentation. 
// Binaries may be compiled with this software without any royalties or 
// restrictions. 
//
// The author(s) and The University of North Carolina at Chapel Hill make no 
// representations about the suitability of this software for any purpose. 
// It is provided "as is" without express or implied warranty.
// -----------------------------------------------------------------------------
// Credits:
// Original RenderTexture code: Mark J. Harris
// Original Render-to-depth-texture support: Thorsten Scheuermann
// Linux Copy-to-texture: Eric Werness
// Various Bug Fixes: Daniel (Redge) Sperl 
//                    Bill Baxter
//
// -----------------------------------------------------------------------------
/**
 * @file RenderTexture.h
 * 
 * Interface definition for class RenderTexture.  A multi-format render to 
 * texture wrapper.
 */
#ifndef __RENDERTEXTURE_HPP__
#define __RENDERTEXTURE_HPP__

#include <GL/glew.h>
#ifdef _WIN32
#include <GL/wglew.h>
#else
#include <GL/glxew.h>
#endif

class RenderTexture
{
public: // enums
  enum UpdateMode
  {
    RT_RENDER_TO_TEXTURE,
    RT_COPY_TO_TEXTURE
  };
  
public: // interface
  RenderTexture(int iWidth, int iHeight, 
                bool bIsTexture = true,
                bool bIsDepthTexture = false);
  ~RenderTexture();

  //! Call this once before use.  Set bShare to true to share lists, textures, 
  //! and program objects between the render texture context and the 
  //! current active GL context.
  bool Initialize(bool bShare             = true, 
                  bool bDepth             = false, 
                  bool bStencil           = false,
                  bool bMipmap            = false, 
                  bool bAnisoFilter       = false,
                  unsigned int iRBits     = 8,
                  unsigned int iGBits     = 8,
                  unsigned int iBBits     = 8,
                  unsigned int iABits     = 8,
		  // Only Win32 has RT now, so only make it default there
#ifdef _WIN32
                  UpdateMode   updateMode = RT_RENDER_TO_TEXTURE
#else
		              UpdateMode   updateMode = RT_COPY_TO_TEXTURE
#endif
);

  // !Change the render texture resolution.
  bool Reset(int iWidth, int iHeight, bool bIsTexture = true,
             bool bIsDepthTexture = false);

  // !Begin drawing to the texture. (i.e. use as "output" texture)
  bool BeginCapture();
  // !End drawing to the texture.
  bool EndCapture();

  // [Redge] 'const's added
  // !Bind the texture to the active texture unit for use as an "input" texture
  void Bind() const;   // [Redge] moved definition to cpp-file (since it's longer now)
  // !Bind the depth texture to the active texture unit for use as an "input" texture
  void BindDepth() const;  // [Redge] moved definition to cpp-file

  //! Enables the texture target appropriate for this render texture.
  void EnableTextureTarget() const { if (_bInitialized) glEnable(_iTextureTarget); }
  //! Disables the texture target appropriate for this render texture.
  void DisableTextureTarget() const { if (_bInitialized) glDisable(_iTextureTarget); }
  // [/Redge]

  //! Returns the texture ID.  Useful in Cg applications.
  unsigned int GetTextureID() const { return _iTextureID; }
  //! Returns the depth texture ID.  Useful in Cg applications.
  unsigned int GetDepthTextureID() const { return _iDepthTextureID; }
  //! Returns the texture target this texture is bound to.
  unsigned int GetTextureTarget() const { return _iTextureTarget; }

  //! Returns the width of the offscreen buffer.
  int GetWidth() const   { return _iWidth;  } 
  //! Returns the width of the offscreen buffer.
  int GetHeight() const  { return _iHeight; }     

  //! Returns the number of red bits allocated.
  int GetRedBits() const   { return _iBits[0]; }
  //! Returns the number of green bits allocated.
  int GetGreenBits() const { return _iBits[1]; }
  //! Returns the number of blue bits allocated.
  int GetBlueBits() const  { return _iBits[2]; }
  //! Returns the number of alpha bits allocated.
  int GetAlphaBits() const { return _iBits[3]; }
  //! Returns the number of depth bits allocated.
  int GetDepthBits() const { return _iBits[4]; }
  //! Returns the number of stencil bits allocated.
  int GetStencilBits() const { return _iBits[5]; }

  //! True if this RenderTexture has been properly initialized.
  bool IsInitialized() const      { return _bInitialized; }
  //! True if this is a texture and not just an offscreen buffer.
  bool IsTexture() const          { return _bIsTexture; }
  //! True if this is a depth texture and not just an offscreen buffer.
  bool IsDepthTexture() const     { return _bIsDepthTexture; }
  //! True if this is a floating point buffer / texture.
  bool IsFloatTexture() const     { return _bFloat; }
  //! True if this texture has non-power-of-two dimensions.
  bool IsRectangleTexture() const { return _bRectangle; }
  //! True if this pbuffer has a depth buffer.
  bool HasDepth() const           { return _bHasDepth; }
  //! True if this pbuffer has a stencil buffer.
  bool HasStencil() const         { return _bHasStencil; }
  //! True if this texture has mipmaps.
  bool IsMipmapped() const        { return _bMipmap; }
  //! True if this texture is anisotropically filtered.
  bool HasAnisoFilter() const     { return _bAnisoFilter; }

protected: // methods
  bool         _Invalidate();
#ifdef _WIN32
  void         _wglGetLastError();
#endif

protected: // data
  int          _iWidth;     // width of the pbuffer
  int          _iHeight;    // height of the pbuffer

  bool         _bIsTexture;
  bool         _bIsDepthTexture;
  bool         _bHasArbDepthTexture; // [Redge]

  UpdateMode   _eUpdateMode;
  
  bool         _bInitialized;

  unsigned int _iBits[6];
  bool         _bFloat;
  bool         _bRectangle;
  bool         _bHasDepth;
  bool         _bHasStencil;
  bool         _bMipmap;
  bool         _bAnisoFilter;
  
#ifdef _WIN32
  HDC          _hDC;        // Handle to a device context.
  HGLRC        _hGLContext; // Handle to a GL context.
  HPBUFFERARB  _hPBuffer;   // Handle to a pbuffer.

  HDC          _hPreviousDC;
  HGLRC        _hPreviousContext;
#else
  Display      *_pDpy;
  GLXContext   _hGLContext;
  GLXPbuffer   _hPBuffer;

  GLXDrawable  _hPreviousDrawable;
  GLXContext   _hPreviousContext;
#endif
  
  GLenum       _iTextureTarget;
  unsigned int _iTextureID;
  unsigned int _iDepthTextureID;

  unsigned short* _pPoorDepthTexture; // [Redge]
};

#endif //__RENDERTEXTURE_HPP__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -