- predefine the vertex data for the blend overlay which will never change throughout the lifetime of the GLRenderer object.

This commit is contained in:
Christoph Oelckers 2016-08-08 14:24:48 +02:00
parent d7c0dda722
commit 8daaf61160
6 changed files with 24 additions and 18 deletions

View File

@ -109,7 +109,7 @@ void FSimpleVertexBuffer::set(FSimpleVertex *verts, int count)
//
//==========================================================================
FFlatVertexBuffer::FFlatVertexBuffer()
FFlatVertexBuffer::FFlatVertexBuffer(int width, int height)
: FVertexBuffer(gl.buffermethod == BM_PERSISTENT)
{
if (gl.buffermethod == BM_PERSISTENT)
@ -125,7 +125,22 @@ FFlatVertexBuffer::FFlatVertexBuffer()
vbo_shadowdata.Reserve(BUFFER_SIZE);
map = new FFlatVertex[BUFFER_SIZE];
}
mNumReserved = mIndex = mCurIndex = 0;
mIndex = mCurIndex = 0;
mNumReserved = 8;
vbo_shadowdata.Resize(mNumReserved);
// the first quad is reserved for handling coordinates through uniforms.
vbo_shadowdata[0].Set(1, 0, 0, 0, 0);
vbo_shadowdata[1].Set(2, 0, 0, 0, 0);
vbo_shadowdata[2].Set(3, 0, 0, 0, 0);
vbo_shadowdata[3].Set(4, 0, 0, 0, 0);
// and the second one for the fullscreen quad used for blend overlays.
vbo_shadowdata[4].Set(0, 0, 0, 0, 0);
vbo_shadowdata[5].Set(0, (float)height, 0, 0, 0);
vbo_shadowdata[6].Set((float)width, 0, 0, 0, 0);
vbo_shadowdata[7].Set((float)width, (float)height, 0, 0, 0);
}
FFlatVertexBuffer::~FFlatVertexBuffer()
@ -350,7 +365,6 @@ void FFlatVertexBuffer::UpdatePlaneVertices(sector_t *sec, int plane)
void FFlatVertexBuffer::CreateVBO()
{
vbo_shadowdata.Resize(mNumReserved);
CreateFlatVBO();
mCurIndex = mIndex = vbo_shadowdata.Size();
memcpy(map, &vbo_shadowdata[0], vbo_shadowdata.Size() * sizeof(FFlatVertex));

View File

@ -84,7 +84,7 @@ class FFlatVertexBuffer : public FVertexBuffer
public:
TArray<FFlatVertex> vbo_shadowdata; // this is kept around for updating the actual (non-readable) buffer and as stand-in for pre GL 4.x
FFlatVertexBuffer();
FFlatVertexBuffer(int width, int height);
~FFlatVertexBuffer();
void BindVBO();

View File

@ -113,7 +113,7 @@ FGLRenderer::FGLRenderer(OpenGLFrameBuffer *fb)
void gl_LoadModels();
void gl_FlushModels();
void FGLRenderer::Initialize()
void FGLRenderer::Initialize(int width, int height)
{
mBuffers = new FGLRenderBuffers();
mBloomExtractShader = new FBloomExtractShader();
@ -137,7 +137,7 @@ void FGLRenderer::Initialize()
glpart = FTexture::CreateTexture(Wads.GetNumForFullName("glstuff/glpart.png"), FTexture::TEX_MiscPatch);
mirrortexture = FTexture::CreateTexture(Wads.GetNumForFullName("glstuff/mirror.png"), FTexture::TEX_MiscPatch);
mVBO = new FFlatVertexBuffer;
mVBO = new FFlatVertexBuffer(width, height);
mSkyVBO = new FSkyVertexBuffer;
if (gl.lightmethod != LM_SOFTWARE) mLights = new FLightBuffer();
else mLights = NULL;

View File

@ -129,7 +129,7 @@ public:
void SetViewAngle(DAngle viewangle);
void SetupView(float viewx, float viewy, float viewz, DAngle viewangle, bool mirror, bool planemirror);
void Initialize();
void Initialize(int width, int height);
void CreateScene();
void RenderMultipassStuff();

View File

@ -525,16 +525,8 @@ void gl_FillScreen()
gl_RenderState.AlphaFunc(GL_GEQUAL, 0.f);
gl_RenderState.EnableTexture(false);
gl_RenderState.Apply();
FFlatVertex *ptr = GLRenderer->mVBO->GetBuffer();
ptr->Set(0, 0, 0, 0, 0);
ptr++;
ptr->Set(0, (float)SCREENHEIGHT, 0, 0, 0);
ptr++;
ptr->Set((float)SCREENWIDTH, 0, 0, 0, 0);
ptr++;
ptr->Set((float)SCREENWIDTH, (float)SCREENHEIGHT, 0, 0, 0);
ptr++;
GLRenderer->mVBO->RenderCurrent(ptr, GL_TRIANGLE_STRIP);
// The fullscreen quad is stored at index 4 in the main vertex buffer.
glDrawArrays(GL_TRIANGLE_STRIP, 4, 4);
}
//==========================================================================

View File

@ -164,7 +164,7 @@ void OpenGLFrameBuffer::InitializeState()
//int h = GetHeight();
//glViewport(0, (trueH - h)/2, GetWidth(), GetHeight());
GLRenderer->Initialize();
GLRenderer->Initialize(GetWidth(), GetHeight());
GLRenderer->SetOutputViewport(nullptr);
Begin2D(false);
}