Rendering frame buffer texture
parent
b15e2f8421
commit
ad4d671344
|
@ -0,0 +1,17 @@
|
||||||
|
#version 330 core
|
||||||
|
|
||||||
|
in vec2 uv;
|
||||||
|
|
||||||
|
out vec3 color;
|
||||||
|
|
||||||
|
uniform sampler2D rendered_texture;
|
||||||
|
uniform float time;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
color = texture(rendered_texture, uv
|
||||||
|
+ 0.00 * vec2(
|
||||||
|
sin(time + 1024.0 * uv.x),
|
||||||
|
cos(time + 768.0 * uv.y)
|
||||||
|
)
|
||||||
|
).xyz;
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
#version 330 core
|
||||||
|
|
||||||
|
in vec3 vertex_position_modelspace;
|
||||||
|
|
||||||
|
out vec2 uv;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
gl_Position = vec4(vertex_position_modelspace, 1);
|
||||||
|
uv = (vertex_position_modelspace.xy + vec2(1,1)) / 2.0;
|
||||||
|
}
|
|
@ -1,6 +1,7 @@
|
||||||
#include "RuntimeModule.h"
|
#include "RuntimeModule.h"
|
||||||
#include "Globals.h"
|
#include "Globals.h"
|
||||||
#include "RenderModule.h"
|
#include "RenderModule.h"
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
struct Renderer;
|
struct Renderer;
|
||||||
|
|
||||||
|
@ -10,6 +11,15 @@ static const GLfloat g_vertex_buffer_data[] = {
|
||||||
0.0f, 1.0f, 0.0f
|
0.0f, 1.0f, 0.0f
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const GLfloat g_quad_vertex_buffer_data[] = {
|
||||||
|
-1.0f, -1.0f, 0.0f,
|
||||||
|
1.0f, -1.0f, 0.0f,
|
||||||
|
-1.0f, 1.0f, 0.0f,
|
||||||
|
-1.0f, 1.0f, 0.0f,
|
||||||
|
1.0f, -1.0f, 0.0f,
|
||||||
|
1.0f, 1.0f, 0.0f
|
||||||
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Module
|
// Module
|
||||||
//
|
//
|
||||||
|
@ -119,17 +129,39 @@ void Renderer::Initialize(int width, int height) {
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, mMesh.mVertexBuffer);
|
glBindBuffer(GL_ARRAY_BUFFER, mMesh.mVertexBuffer);
|
||||||
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
|
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
// Shaders
|
||||||
mProgram = RenderProgram("data/shaders/vs_simple.glsl", "data/shaders/fs_simple.glsl");
|
mProgram = RenderProgram("data/shaders/vs_simple.glsl", "data/shaders/fs_simple.glsl");
|
||||||
bool load_result = mProgram.Load();
|
bool load_result = mProgram.Load();
|
||||||
assert(load_result);
|
assert(load_result);
|
||||||
|
|
||||||
|
// Render Target
|
||||||
mRenderTarget = RenderTarget (width, height, RenderTarget::EnableColor | RenderTarget::EnableDepth);
|
mRenderTarget = RenderTarget (width, height, RenderTarget::EnableColor | RenderTarget::EnableDepth);
|
||||||
|
|
||||||
|
// Render Target Quad
|
||||||
|
glGenVertexArrays(1, &mRenderQuadVertexArrayId);
|
||||||
|
glBindVertexArray(mRenderQuadVertexArrayId);
|
||||||
|
|
||||||
|
glGenBuffers(1, &mRenderQuadVertexBufferId);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, mRenderQuadVertexBufferId);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(g_quad_vertex_buffer_data), g_quad_vertex_buffer_data, GL_STATIC_DRAW);
|
||||||
|
mRenderQuadProgramColor = RenderProgram("data/shaders/vs_passthrough.glsl", "data/shaders/fs_simpletexture.glsl");
|
||||||
|
load_result = mRenderQuadProgramColor.Load();
|
||||||
|
assert(load_result);
|
||||||
|
|
||||||
|
muRenderQuadTexture = glGetUniformLocation(mRenderQuadProgramColor.mProgramId, "rendered_texture");
|
||||||
|
muRenderQuadTime = glGetUniformLocation(mRenderQuadProgramColor.mProgramId, "time");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::Shutdown() {
|
void Renderer::Shutdown() {
|
||||||
glDeleteVertexArrays(1, &mMesh.mVertexArrayId);
|
glDeleteVertexArrays(1, &mMesh.mVertexArrayId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Renderer::RenderGl() {
|
void Renderer::RenderGl() {
|
||||||
|
int width, height;
|
||||||
|
glfwGetWindowSize(gWindow, &width, &height);
|
||||||
|
mRenderTarget.Resize(width, height);
|
||||||
|
|
||||||
// enable the render target
|
// enable the render target
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, mRenderTarget.mFrameBufferId);
|
glBindFramebuffer(GL_FRAMEBUFFER, mRenderTarget.mFrameBufferId);
|
||||||
GLenum DrawBuffers[1] = { GL_COLOR_ATTACHMENT0 };
|
GLenum DrawBuffers[1] = { GL_COLOR_ATTACHMENT0 };
|
||||||
|
@ -160,6 +192,31 @@ void Renderer::RenderGl() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::RenderGui() {
|
void Renderer::RenderGui() {
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
|
// Render the full screen quad
|
||||||
|
glUseProgram(mRenderQuadProgramColor.mProgramId);
|
||||||
|
|
||||||
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, mRenderTarget.mColorTexture);
|
||||||
|
glUniform1i(muRenderQuadTexture, 0);
|
||||||
|
glUniform1f(muRenderQuadTime, 0.0f * (float)(glfwGetTime() * 10.0f));
|
||||||
|
|
||||||
|
glEnableVertexAttribArray(0);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, mRenderQuadVertexBufferId);
|
||||||
|
glVertexAttribPointer(
|
||||||
|
0, // attribute 0
|
||||||
|
3, // size
|
||||||
|
GL_FLOAT, // type
|
||||||
|
GL_FALSE, // normalized?
|
||||||
|
0, // stride
|
||||||
|
(void*)0 // offset
|
||||||
|
);
|
||||||
|
|
||||||
|
glDrawArrays(GL_TRIANGLES, 0, 6); // starting from vertex 0; 3 vertices total
|
||||||
|
glDisableVertexAttribArray(0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::Resize (int width, int height) {
|
void Renderer::Resize (int width, int height) {
|
||||||
|
|
|
@ -107,19 +107,26 @@ struct Mesh {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Renderer {
|
struct Renderer {
|
||||||
bool initialized = false;
|
bool mInitialized = false;
|
||||||
uint32_t view_width = 1;
|
uint32_t mWidth = 1;
|
||||||
uint32_t view_height = 1;
|
uint32_t mHeight = 1;
|
||||||
|
|
||||||
std::vector<Camera> cameras;
|
std::vector<Camera> cameras;
|
||||||
Mesh mMesh;
|
Mesh mMesh;
|
||||||
RenderProgram mProgram;
|
RenderProgram mProgram;
|
||||||
RenderTarget mRenderTarget;
|
RenderTarget mRenderTarget;
|
||||||
|
|
||||||
|
GLuint mRenderQuadVertexArrayId;
|
||||||
|
GLuint mRenderQuadVertexBufferId;
|
||||||
|
RenderProgram mRenderQuadProgramColor;
|
||||||
|
RenderProgram mRenderQuadProgramDepth;
|
||||||
|
GLuint muRenderQuadTexture;
|
||||||
|
GLuint muRenderQuadTime;
|
||||||
|
|
||||||
Renderer() :
|
Renderer() :
|
||||||
initialized(false),
|
mInitialized(false),
|
||||||
view_width (0),
|
mWidth (0),
|
||||||
view_height (0)
|
mHeight (0)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
void Initialize(int width, int height);
|
void Initialize(int width, int height);
|
||||||
|
|
|
@ -117,14 +117,50 @@ bool RenderProgram::Load() {
|
||||||
// RenderTarget
|
// RenderTarget
|
||||||
//
|
//
|
||||||
RenderTarget::RenderTarget(int width, int height, int flags) {
|
RenderTarget::RenderTarget(int width, int height, int flags) {
|
||||||
|
mFlags = flags;
|
||||||
|
|
||||||
|
Cleanup();
|
||||||
|
Resize(width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
RenderTarget::~RenderTarget() {
|
||||||
|
Cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderTarget::Cleanup() {
|
||||||
|
if (mFrameBufferId != -1) {
|
||||||
|
glDeleteFramebuffers(1, &mFrameBufferId);
|
||||||
|
mFrameBufferId = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mColorTexture != -1) {
|
||||||
|
glDeleteTextures(1, &mColorTexture);
|
||||||
|
mColorTexture = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mDepthBuffer != -1) {
|
||||||
|
glDeleteRenderbuffers(1, &mDepthBuffer);
|
||||||
|
mDepthBuffer = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderTarget::Resize(int width, int height) {
|
||||||
|
if (width == mWidth || height == mHeight)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Cleanup();
|
||||||
|
|
||||||
|
mWidth = width;
|
||||||
|
mHeight = height;
|
||||||
|
|
||||||
glGenFramebuffers(1, &mFrameBufferId);
|
glGenFramebuffers(1, &mFrameBufferId);
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, mFrameBufferId);
|
glBindFramebuffer(GL_FRAMEBUFFER, mFrameBufferId);
|
||||||
|
|
||||||
if (flags & EnableColor) {
|
if (mFlags & EnableColor) {
|
||||||
glGenTextures(1, &mColorTexture);
|
glGenTextures(1, &mColorTexture);
|
||||||
glBindTexture(GL_TEXTURE_2D, mColorTexture);
|
glBindTexture(GL_TEXTURE_2D, mColorTexture);
|
||||||
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, mWidth, mHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
|
||||||
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
@ -132,16 +168,13 @@ RenderTarget::RenderTarget(int width, int height, int flags) {
|
||||||
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mColorTexture, 0);
|
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mColorTexture, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags & EnableDepth) {
|
if (mFlags & EnableDepth) {
|
||||||
glGenRenderbuffers(1, &mDepthBuffer);
|
glGenRenderbuffers(1, &mDepthBuffer);
|
||||||
glBindRenderbuffer(GL_RENDERBUFFER, mDepthBuffer);
|
glBindRenderbuffer(GL_RENDERBUFFER, mDepthBuffer);
|
||||||
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);
|
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, mWidth, mHeight);
|
||||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mDepthBuffer);
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mDepthBuffer);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
RenderTarget::~RenderTarget() {
|
|
||||||
// TODO: cleanup
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -145,6 +145,8 @@ struct RenderProgram {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RenderTarget {
|
struct RenderTarget {
|
||||||
|
int mWidth = 0;
|
||||||
|
int mHeight = 0;
|
||||||
GLuint mFrameBufferId = -1;
|
GLuint mFrameBufferId = -1;
|
||||||
GLuint mColorTexture = -1;
|
GLuint mColorTexture = -1;
|
||||||
GLuint mDepthBuffer = -1;
|
GLuint mDepthBuffer = -1;
|
||||||
|
@ -154,9 +156,14 @@ struct RenderTarget {
|
||||||
EnableDepth = 2
|
EnableDepth = 2
|
||||||
} Flags;
|
} Flags;
|
||||||
|
|
||||||
|
int mFlags = 0;
|
||||||
|
|
||||||
RenderTarget() {};
|
RenderTarget() {};
|
||||||
RenderTarget(int width, int height, int flags);
|
RenderTarget(int width, int height, int flags);
|
||||||
~RenderTarget();
|
~RenderTarget();
|
||||||
|
|
||||||
|
void Cleanup();
|
||||||
|
void Resize(int width, int height);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue