qzdoom/src/gl/renderer/gl_renderbuffers.h

148 lines
4 KiB
C
Raw Normal View History

#ifndef __GL_RENDERBUFFERS_H
#define __GL_RENDERBUFFERS_H
#include "gl/shaders/gl_shader.h"
2016-07-27 19:50:30 +00:00
class FGLBloomTextureLevel
{
public:
GLuint VTexture = 0;
GLuint VFramebuffer = 0;
GLuint HTexture = 0;
GLuint HFramebuffer = 0;
GLuint Width = 0;
GLuint Height = 0;
};
class FGLExposureTextureLevel
{
public:
GLuint Texture = 0;
GLuint Framebuffer = 0;
GLuint Width = 0;
GLuint Height = 0;
};
class FGLRenderBuffers
{
public:
FGLRenderBuffers();
~FGLRenderBuffers();
bool Setup(int width, int height, int sceneWidth, int sceneHeight);
2016-08-04 15:16:49 +00:00
2016-08-29 11:10:22 +00:00
void BindSceneFB(bool sceneData);
void BindSceneColorTexture(int index);
void BindSceneFogTexture(int index);
void BindSceneNormalTexture(int index);
2016-08-29 11:10:22 +00:00
void BindSceneDepthTexture(int index);
2016-08-04 15:16:49 +00:00
void BlitSceneToTexture();
void BindCurrentTexture(int index);
void BindCurrentFB();
void BindNextFB();
void NextTexture();
void BindOutputFB();
void BlitToEyeTexture(int eye);
void BindEyeTexture(int eye, int texunit);
2016-09-07 19:52:43 +00:00
void BindEyeFB(int eye, bool readBuffer = false);
void BindShadowMapFB();
void BindShadowMapTexture(int index);
2016-07-27 19:50:30 +00:00
enum { NumBloomLevels = 4 };
FGLBloomTextureLevel BloomLevels[NumBloomLevels];
TArray<FGLExposureTextureLevel> ExposureLevels;
GLuint ExposureTexture = 0;
GLuint ExposureFB = 0;
bool FirstExposureFrame = true;
2016-08-29 11:10:22 +00:00
// Ambient occlusion buffers
GLuint LinearDepthTexture = 0;
GLuint LinearDepthFB = 0;
2016-08-29 11:10:22 +00:00
GLuint AmbientTexture0 = 0;
GLuint AmbientTexture1 = 0;
GLuint AmbientFB0 = 0;
GLuint AmbientFB1 = 0;
int AmbientWidth = 0;
int AmbientHeight = 0;
2016-10-06 05:36:49 +00:00
enum { NumAmbientRandomTextures = 3 };
GLuint AmbientRandomTexture[NumAmbientRandomTextures];
2016-08-29 11:10:22 +00:00
static bool IsEnabled();
int GetWidth() const { return mWidth; }
int GetHeight() const { return mHeight; }
2016-09-01 05:15:40 +00:00
int GetSceneWidth() const { return mSceneWidth; }
int GetSceneHeight() const { return mSceneHeight; }
private:
void ClearScene();
2016-08-04 15:16:49 +00:00
void ClearPipeline();
void ClearEyeBuffers();
void ClearBloom();
void ClearExposureLevels();
2016-08-29 11:10:22 +00:00
void ClearAmbientOcclusion();
void CreateScene(int width, int height, int samples, bool needsSceneTextures);
2016-08-04 15:16:49 +00:00
void CreatePipeline(int width, int height);
void CreateBloom(int width, int height);
void CreateExposureLevels(int width, int height);
void CreateEyeBuffers(int eye);
void CreateShadowMap();
2016-08-29 11:10:22 +00:00
void CreateAmbientOcclusion(int width, int height);
GLuint Create2DTexture(const FString &name, GLuint format, int width, int height, const void *data = nullptr);
2016-08-29 11:10:22 +00:00
GLuint Create2DMultisampleTexture(const FString &name, GLuint format, int width, int height, int samples, bool fixedSampleLocations);
2016-08-17 21:18:47 +00:00
GLuint CreateRenderBuffer(const FString &name, GLuint format, int width, int height);
GLuint CreateRenderBuffer(const FString &name, GLuint format, int width, int height, int samples);
2016-08-17 21:18:47 +00:00
GLuint CreateFrameBuffer(const FString &name, GLuint colorbuffer);
GLuint CreateFrameBuffer(const FString &name, GLuint colorbuffer, GLuint depthstencil, bool colorIsARenderBuffer);
GLuint CreateFrameBuffer(const FString &name, GLuint colorbuffer0, GLuint colorbuffer1, GLuint colorbuffer2, GLuint depthstencil, bool multisample);
bool CheckFrameBufferCompleteness();
2016-08-17 22:21:33 +00:00
void ClearFrameBuffer(bool stencil, bool depth);
void DeleteTexture(GLuint &handle);
void DeleteRenderBuffer(GLuint &handle);
void DeleteFrameBuffer(GLuint &handle);
2016-07-27 19:50:30 +00:00
int mWidth = 0;
int mHeight = 0;
int mSamples = 0;
2016-08-17 15:59:47 +00:00
int mMaxSamples = 0;
int mSceneWidth = 0;
int mSceneHeight = 0;
2016-08-04 15:16:49 +00:00
static const int NumPipelineTextures = 2;
int mCurrentPipelineTexture = 0;
// Buffers for the scene
GLuint mSceneMultisample = 0;
GLuint mSceneDepthStencil = 0;
GLuint mSceneFog = 0;
GLuint mSceneNormal = 0;
GLuint mSceneFB = 0;
2016-08-29 11:10:22 +00:00
GLuint mSceneDataFB = 0;
bool mSceneUsesTextures = false;
2016-08-04 15:16:49 +00:00
// Effect/HUD buffers
GLuint mPipelineTexture[NumPipelineTextures];
GLuint mPipelineFB[NumPipelineTextures];
// Back buffer frame buffer
GLuint mOutputFB = 0;
// Eye buffers
TArray<GLuint> mEyeTextures;
TArray<GLuint> mEyeFBs;
// Shadow map texture
GLuint mShadowMapTexture = 0;
GLuint mShadowMapFB = 0;
static bool FailedCreate;
static bool BuffersActive;
};
#endif