我正在编写一个FFGL视频效果插件(使用this shadertoy端口)。我想存储以前渲染的帧以用于将来的计算。具体来说,我试图相当于视频延迟。
是否可以从片段着色器写入外部缓冲区,然后在以后使用该存储的值(比如30帧之后)?
答案 0 :(得分:1)
创建一个FBO并绑定它。无论你渲染什么,它都会进入它。因此,如果你正在使用着色器,那仍然适用于默认的FBO。
这里有一些代码可以帮助你
import java.nio.ByteBuffer;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL14.*;
import static org.lwjgl.opengl.GL30.*;
public class FBO {
public int fbo,tex,depth;
public void delete() {glDeleteTextures(tex);glDeleteRenderbuffers(depth);glDeleteFramebuffers(fbo);}
public void bindTexture() {glBindTexture(GL_TEXTURE_2D,tex);}
public void bind() {glBindFramebuffer(GL_FRAMEBUFFER,fbo);}
public static void unbind() {glBindFramebuffer(GL_FRAMEBUFFER,0);}
public FBO(){ // create the fbo
glBindTexture(GL_TEXTURE_2D,tex=glGenTextures()); // create texture, set correct filters
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
glBindRenderbuffer(GL_RENDERBUFFER,depth=glGenRenderbuffers()); // create buffer for depth
glBindFramebuffer(GL_FRAMEBUFFER,fbo=glGenFramebuffers()); // create framebuffer
glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,tex,0); // attach texture
glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,GL_RENDERBUFFER,depth); // attach depth
unbind(); // incase not using immediately
}
public void resize(int w,int h) {
glBindTexture(GL_TEXTURE_2D,tex); // update texture size
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,w,h,0,GL_RGBA,GL_UNSIGNED_BYTE,(ByteBuffer)null);
glBindRenderbuffer(GL_RENDERBUFFER,depth); // update depth size
glRenderbufferStorage(GL_RENDERBUFFER,GL_DEPTH_COMPONENT24,w,h);
}
public void render() {
// glColor4f(1,1,1,1); // you may want to do these customly
// glDisable(GL_BLEND);
glBindTexture(GL_TEXTURE_2D, tex);
Tess.begin();
Tess.vertex( 0, height, 0, 0, 0);
Tess.vertex(width, height, 0, 1, 0);
Tess.vertex(width, 0, 0, 1, 1);
Tess.vertex( 0, 0, 0, 0, 1);
Tess.draw();
// Tess btw, just manually handles verts and tex coords
// that could be pure pipeline, or by vbo / vao / interleaved vbo
// width / height are just the 2d size. could render for post processing
}
}