43 LOG_ERROR(
"RenderTarget::Create called with invalid size %dx%d", w, h);
48 glGenFramebuffers(1, &m_fbo);
49 glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
52 glGenTextures(1, &m_color);
53 glBindTexture(GL_TEXTURE_2D, m_color);
54 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE,
nullptr);
55 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
56 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
57 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
58 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
59 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_color, 0);
62 glGenTextures(1, &m_normal);
63 glBindTexture(GL_TEXTURE_2D, m_normal);
64 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE,
nullptr);
65 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
66 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
67 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
68 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
69 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, m_normal, 0);
72 glGenTextures(1, &m_depth);
73 glBindTexture(GL_TEXTURE_2D, m_depth);
74 glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, w, h, 0, GL_DEPTH_COMPONENT, GL_FLOAT,
nullptr);
75 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
76 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
77 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
78 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
80 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
81 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_depth, 0);
83 const GLenum bufs[2] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
84 glDrawBuffers(2, bufs);
86 GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
87 glBindFramebuffer(GL_FRAMEBUFFER, 0);
89 if (status != GL_FRAMEBUFFER_COMPLETE)
91 LOG_ERROR(
"RenderTarget FBO incomplete (%s, 0x%x) at %dx%d",
92 FramebufferStatusName(status),
243 EnsureBlitResources();
249 glViewport(0, 0, dstW, dstH);
250 glDisable(GL_DEPTH_TEST);
251 glDisable(GL_CULL_FACE);
254 glUseProgram(gBlitProg);
255 glActiveTexture(GL_TEXTURE0);
256 glBindTexture(GL_TEXTURE_2D, srcTexture);
257 if (gBlitTexLoc >= 0) glUniform1i(gBlitTexLoc, 0);
258 if (gBlitModeLoc >= 0) glUniform1i(gBlitModeLoc,
static_cast<int>(mode));
260 glBindVertexArray(gBlitVao);
261 glDrawArrays(GL_TRIANGLES, 0, 3);
262 glBindVertexArray(0);
264 glEnable(GL_DEPTH_TEST);