File indexing completed on 2025-02-21 10:11:22
0001
0002
0003
0004 #ifndef QOPENGLFRAMEBUFFEROBJECT_H
0005 #define QOPENGLFRAMEBUFFEROBJECT_H
0006
0007 #include <QtOpenGL/qtopenglglobal.h>
0008
0009 #include <QtGui/qopengl.h>
0010 #include <QtGui/qpaintdevice.h>
0011
0012 #include <QtCore/qscopedpointer.h>
0013
0014 #if defined(Q_QDOC)
0015 #undef GLuint
0016 typedef unsigned int GLuint;
0017 #undef GLenum
0018 typedef unsigned int GLenum;
0019 #undef GL_TEXTURE_2D
0020 #define GL_TEXTURE_2D 0x0DE1
0021 #undef GLbitfield
0022 typedef unsigned int GLbitfield;
0023 #endif
0024
0025 QT_BEGIN_NAMESPACE
0026
0027 class QOpenGLFramebufferObjectPrivate;
0028 class QOpenGLFramebufferObjectFormat;
0029
0030 class Q_OPENGL_EXPORT QOpenGLFramebufferObject
0031 {
0032 Q_DECLARE_PRIVATE(QOpenGLFramebufferObject)
0033 public:
0034 enum Attachment {
0035 NoAttachment,
0036 CombinedDepthStencil,
0037 Depth
0038 };
0039
0040 explicit QOpenGLFramebufferObject(const QSize &size, GLenum target = GL_TEXTURE_2D);
0041 QOpenGLFramebufferObject(int width, int height, GLenum target = GL_TEXTURE_2D);
0042
0043 QOpenGLFramebufferObject(const QSize &size, Attachment attachment,
0044 GLenum target = GL_TEXTURE_2D, GLenum internalFormat = 0);
0045 QOpenGLFramebufferObject(int width, int height, Attachment attachment,
0046 GLenum target = GL_TEXTURE_2D, GLenum internalFormat = 0);
0047
0048 QOpenGLFramebufferObject(const QSize &size, const QOpenGLFramebufferObjectFormat &format);
0049 QOpenGLFramebufferObject(int width, int height, const QOpenGLFramebufferObjectFormat &format);
0050
0051 virtual ~QOpenGLFramebufferObject();
0052
0053 void addColorAttachment(const QSize &size, GLenum internalFormat = 0);
0054 void addColorAttachment(int width, int height, GLenum internalFormat = 0);
0055
0056 QOpenGLFramebufferObjectFormat format() const;
0057
0058 bool isValid() const;
0059 bool isBound() const;
0060 bool bind();
0061 bool release();
0062
0063 int width() const { return size().width(); }
0064 int height() const { return size().height(); }
0065
0066 GLuint texture() const;
0067 QList<GLuint> textures() const;
0068
0069 GLuint takeTexture();
0070 GLuint takeTexture(int colorAttachmentIndex);
0071
0072 QSize size() const;
0073 QList<QSize> sizes() const;
0074
0075 QImage toImage(bool flipped = true) const;
0076 QImage toImage(bool flipped, int colorAttachmentIndex) const;
0077
0078 Attachment attachment() const;
0079 void setAttachment(Attachment attachment);
0080
0081 GLuint handle() const;
0082
0083 static bool bindDefault();
0084
0085 static bool hasOpenGLFramebufferObjects();
0086
0087 static bool hasOpenGLFramebufferBlit();
0088
0089 enum FramebufferRestorePolicy {
0090 DontRestoreFramebufferBinding,
0091 RestoreFramebufferBindingToDefault,
0092 RestoreFrameBufferBinding
0093 };
0094
0095 static void blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect,
0096 QOpenGLFramebufferObject *source, const QRect &sourceRect,
0097 GLbitfield buffers,
0098 GLenum filter,
0099 int readColorAttachmentIndex,
0100 int drawColorAttachmentIndex,
0101 FramebufferRestorePolicy restorePolicy);
0102 static void blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect,
0103 QOpenGLFramebufferObject *source, const QRect &sourceRect,
0104 GLbitfield buffers,
0105 GLenum filter,
0106 int readColorAttachmentIndex,
0107 int drawColorAttachmentIndex);
0108 static void blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect,
0109 QOpenGLFramebufferObject *source, const QRect &sourceRect,
0110 GLbitfield buffers = GL_COLOR_BUFFER_BIT,
0111 GLenum filter = GL_NEAREST);
0112 static void blitFramebuffer(QOpenGLFramebufferObject *target,
0113 QOpenGLFramebufferObject *source,
0114 GLbitfield buffers = GL_COLOR_BUFFER_BIT,
0115 GLenum filter = GL_NEAREST);
0116
0117 private:
0118 Q_DISABLE_COPY(QOpenGLFramebufferObject)
0119 QScopedPointer<QOpenGLFramebufferObjectPrivate> d_ptr;
0120 friend class QOpenGLPaintDevice;
0121 friend class QOpenGLFBOGLPaintDevice;
0122 };
0123
0124 class QOpenGLFramebufferObjectFormatPrivate;
0125 class Q_OPENGL_EXPORT QOpenGLFramebufferObjectFormat
0126 {
0127 public:
0128 QOpenGLFramebufferObjectFormat();
0129 QOpenGLFramebufferObjectFormat(const QOpenGLFramebufferObjectFormat &other);
0130 QOpenGLFramebufferObjectFormat &operator=(const QOpenGLFramebufferObjectFormat &other);
0131 ~QOpenGLFramebufferObjectFormat();
0132
0133 void setSamples(int samples);
0134 int samples() const;
0135
0136 void setMipmap(bool enabled);
0137 bool mipmap() const;
0138
0139 void setAttachment(QOpenGLFramebufferObject::Attachment attachment);
0140 QOpenGLFramebufferObject::Attachment attachment() const;
0141
0142 void setTextureTarget(GLenum target);
0143 GLenum textureTarget() const;
0144
0145 void setInternalTextureFormat(GLenum internalTextureFormat);
0146 GLenum internalTextureFormat() const;
0147
0148 bool operator==(const QOpenGLFramebufferObjectFormat& other) const;
0149 bool operator!=(const QOpenGLFramebufferObjectFormat& other) const;
0150
0151 private:
0152 QOpenGLFramebufferObjectFormatPrivate *d;
0153
0154 void detach();
0155 };
0156
0157 QT_END_NAMESPACE
0158
0159 #endif