mirror of
https://github.com/TomHarte/CLK.git
synced 2025-02-19 23:29:05 +00:00
Corrects stencil buffer creation, and edges towards using it for [guaranteed] full-screen decay.
This commit is contained in:
parent
75bc0e451d
commit
97c5ee6c0a
@ -41,7 +41,10 @@ TextureTarget::TextureTarget(GLsizei width, GLsizei height, GLenum texture_unit,
|
|||||||
|
|
||||||
// Also add a stencil buffer if requested.
|
// Also add a stencil buffer if requested.
|
||||||
if(has_stencil_buffer) {
|
if(has_stencil_buffer) {
|
||||||
|
glGenRenderbuffers(1, &renderbuffer_);
|
||||||
|
glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer_);
|
||||||
glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX1, expanded_width_, expanded_height_);
|
glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX1, expanded_width_, expanded_height_);
|
||||||
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderbuffer_);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for successful construction.
|
// Check for successful construction.
|
||||||
@ -52,6 +55,7 @@ TextureTarget::TextureTarget(GLsizei width, GLsizei height, GLenum texture_unit,
|
|||||||
TextureTarget::~TextureTarget() {
|
TextureTarget::~TextureTarget() {
|
||||||
glDeleteFramebuffers(1, &framebuffer_);
|
glDeleteFramebuffers(1, &framebuffer_);
|
||||||
glDeleteTextures(1, &texture_);
|
glDeleteTextures(1, &texture_);
|
||||||
|
if(renderbuffer_) glDeleteRenderbuffers(1, &renderbuffer_);
|
||||||
if(drawing_vertex_array_) glDeleteVertexArrays(1, &drawing_vertex_array_);
|
if(drawing_vertex_array_) glDeleteVertexArrays(1, &drawing_vertex_array_);
|
||||||
if(drawing_array_buffer_) glDeleteBuffers(1, &drawing_array_buffer_);
|
if(drawing_array_buffer_) glDeleteBuffers(1, &drawing_array_buffer_);
|
||||||
}
|
}
|
||||||
|
@ -78,7 +78,7 @@ class TextureTarget {
|
|||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GLuint framebuffer_ = 0, texture_ = 0;
|
GLuint framebuffer_ = 0, texture_ = 0, renderbuffer_ = 0;
|
||||||
GLsizei width_ = 0, height_ = 0;
|
GLsizei width_ = 0, height_ = 0;
|
||||||
GLsizei expanded_width_ = 0, expanded_height_ = 0;
|
GLsizei expanded_width_ = 0, expanded_height_ = 0;
|
||||||
GLenum texture_unit_ = 0;
|
GLenum texture_unit_ = 0;
|
||||||
|
@ -488,10 +488,11 @@ void ScanTarget::draw(bool synchronous, int output_width, int output_height) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Ensure the accumulation buffer is properly sized.
|
// Ensure the accumulation buffer is properly sized.
|
||||||
if(!accumulation_texture_ || (!synchronous && (accumulation_texture_->get_width() != output_width || accumulation_texture_->get_height() != output_height))) {
|
const int proportional_width = (output_height * 4) / 3;
|
||||||
|
if(!accumulation_texture_ || (!synchronous && (accumulation_texture_->get_width() != proportional_width || accumulation_texture_->get_height() != output_height))) {
|
||||||
std::unique_ptr<OpenGL::TextureTarget> new_framebuffer(
|
std::unique_ptr<OpenGL::TextureTarget> new_framebuffer(
|
||||||
new TextureTarget(
|
new TextureTarget(
|
||||||
GLsizei(output_width),
|
GLsizei(proportional_width),
|
||||||
GLsizei(output_height),
|
GLsizei(output_height),
|
||||||
AccumulationTextureUnit,
|
AccumulationTextureUnit,
|
||||||
GL_LINEAR,
|
GL_LINEAR,
|
||||||
@ -511,6 +512,12 @@ void ScanTarget::draw(bool synchronous, int output_width, int output_height) {
|
|||||||
|
|
||||||
// Bind the accumulation texture.
|
// Bind the accumulation texture.
|
||||||
accumulation_texture_->bind_framebuffer();
|
accumulation_texture_->bind_framebuffer();
|
||||||
|
glClear(GL_STENCIL_BUFFER_BIT);
|
||||||
|
|
||||||
|
// Enable stenciling and ensure spans increment the stencil buffer.
|
||||||
|
glEnable(GL_STENCIL_TEST);
|
||||||
|
glStencilFunc(GL_EQUAL, 0, GLuint(-1));
|
||||||
|
glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
|
||||||
|
|
||||||
// Output all lines except the one currently being worked on.
|
// Output all lines except the one currently being worked on.
|
||||||
glBindVertexArray(line_vertex_array_);
|
glBindVertexArray(line_vertex_array_);
|
||||||
@ -518,6 +525,10 @@ void ScanTarget::draw(bool synchronous, int output_width, int output_height) {
|
|||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, GLsizei(line_buffer_.size() - 2));
|
glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, GLsizei(line_buffer_.size() - 2));
|
||||||
|
|
||||||
|
// Clear untouched parts of the display. (TODO: at vertical sync, probably)
|
||||||
|
full_display_rectangle_.draw(0.0, 0.0, 0.0);
|
||||||
|
glDisable(GL_STENCIL_TEST);
|
||||||
|
|
||||||
// Copy the accumulatiion texture to the target (TODO: don't assume framebuffer 0).
|
// Copy the accumulatiion texture to the target (TODO: don't assume framebuffer 0).
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
glViewport(0, 0, (GLsizei)output_width, (GLsizei)output_height);
|
glViewport(0, 0, (GLsizei)output_width, (GLsizei)output_height);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user