真正简化的双通效果中的透明度或深度测试误差

时间:2014-05-09 18:08:18

标签: opengl rendering glsl jogl

我想设置一个非常简单的双通效果。第一遍将纹理对象绘制到纹理。第二遍在几何着色器中创建一个全屏四边形,并使用第一遍中写的纹理对其进行纹理化。

纹理和帧缓冲按以下方式设置:

gl.glGenFramebuffers(1, frameBufferHandle, 0);
gl.glBindFramebuffer(GL3.GL_FRAMEBUFFER, frameBufferHandle[0]);

texture = new Texture(gl, new TextureData(gl.getGLProfile(), GL3.GL_RGB, viewportWidth, viewportHeight,
    0, GL3.GL_RGB, GL3.GL_UNSIGNED_BYTE, false, false, false, null, null));
texture.setTexParameteri(gl, GL3.GL_TEXTURE_MAG_FILTER, GL3.GL_LINEAR);
texture.setTexParameteri(gl, GL3.GL_TEXTURE_MIN_FILTER, GL3.GL_LINEAR);
gl.glFramebufferTexture(GL3.GL_FRAMEBUFFER, GL3.GL_COLOR_ATTACHMENT0, texture.getTextureObject(), 0);

int drawBuffers[] = {GL3.GL_COLOR_ATTACHMENT0};
gl.glDrawBuffers(1, drawBuffers, 0);

if (gl.glCheckFramebufferStatus(GL3.GL_FRAMEBUFFER) != GL3.GL_FRAMEBUFFER_COMPLETE)
    throw new Exception("error while creating framebuffer");

渲染功能如下:

// 1st pass
gl.glBindFramebuffer(GL3.GL_FRAMEBUFFER, frameBufferHandle[0]);
gl.glClearColor(0.2f, 0.2f, 0.2f, 1.0f); 
gl.glClear(GL3.GL_STENCIL_BUFFER_BIT | GL3.GL_COLOR_BUFFER_BIT | GL3.GL_DEPTH_BUFFER_BIT);

texturePass.apply();
texturePass.updatePerObject(world);
texturePass.updateTexture(object.getDiffuseMap());
object.draw(gl);    

// 2nd pass
gl.glBindFramebuffer(GL3.GL_FRAMEBUFFER, 0);
gl.glClearColor(0.2f, 0.2f, 0.2f, 1.0f); 
gl.glClear(GL3.GL_STENCIL_BUFFER_BIT | GL3.GL_COLOR_BUFFER_BIT | GL3.GL_DEPTH_BUFFER_BIT);

fullscreenQuadPass.apply();
fullscreenQuadPass.updateTexture(texture)

gl.glDrawArrays(GL3.GL_POINTS,0,1);

下图显示了应用此效果的结果: Render-to-Texture error

正如你所希望的那样,人们可以透过魔像看到他的右手。似乎存在某种深度测试或透明度错误。

如果我评论第二次传出并替换

,一切看起来都很好
gl.glBindFramebuffer(GL3.GL_FRAMEBUFFER, frameBufferHandle[0]);

通过

gl.glBindFramebuffer(GL3.GL_FRAMEBUFFER, 0);

有没有人有想法,这里发生了什么?

编辑:事实上,我实际上错过了第二遍的深度缓冲区。因此,我已将初始化序列更新为

// Create framebuffer
gl.glGenFramebuffers(1, frameBufferHandle, 0);
gl.glBindFramebuffer(GL4.GL_FRAMEBUFFER, frameBufferHandle[0]);

// Set up color texture
colorTexture = new Texture(gl, new TextureData(gl.getGLProfile(),
    GL4.GL_RGBA, width, height, 0, GL4.GL_RGBA, GL4.GL_UNSIGNED_BYTE,
        false, false, false, null, null));
gl.glFramebufferTexture(GL4.GL_FRAMEBUFFER, GL4.GL_COLOR_ATTACHMENT0,
    colorTexture.getTextureObject(), 0);

// Create and set up depth renderbuffer
gl.glGenRenderbuffers(GL4.GL_RENDERBUFFER, depthRenderBufferHandle, 0);
gl.glBindRenderbuffer(GL4.GL_RENDERBUFFER, depthRenderBufferHandle[0]);
gl.glRenderbufferStorage(GL4.GL_RENDERBUFFER, GL4.GL_DEPTH_COMPONENT,
    width, height);
gl.glFramebufferRenderbuffer(GL4.GL_FRAMEBUFFER, GL4.GL_DEPTH_ATTACHMENT,
    GL4.GL_RENDERBUFFER, depthRenderBufferHandle[0]);

int drawBuffers[] = {GL4.GL_COLOR_ATTACHMENT0};
gl.glDrawBuffers(1, drawBuffers, 0);

然而,现在我的系统崩溃了一个"致命错误"由Java运行时环境。如果我对新添加的行进行评论,那么所有内容都可以正常运行"。现在重点是什么?

EDIT2 :我不知道我为什么写了

gl.glGenRenderbuffers(GL4.GL_RENDERBUFFER, depthRenderBufferHandle, 0);

当然,它应该是

gl.glGenRenderbuffers(1, depthRenderBufferHandle, 0);

这解决了我的问题。

1 个答案:

答案 0 :(得分:1)

您的Framebuffer对象目前缺少深度附件。

以下是一些可以解决您问题的C伪代码:

GLuint depth_rbo;
glGenRenderbuffers (1, &depth_rbo);

glBindRenderbuffer (GL_RENDERBUFFER, depth_rbo);

glRenderbufferStorage     (GL_RENDERBUFFER, GL_DEPTH_COMPONENT,  width, height);
glFramebufferRenderbuffer (GL_FRAMEBUFFER,  GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth_rbo);

事实上,它也没有模板附件,所以我不确定你为什么要清除模板缓冲区?

如果要执行模板操作,则还需要为其分配存储空间。此外,如果您在FBO中需要 深度和模板,则必须使用压缩的 Depth-Stencil 格式(GL_DEPTH_STENCIL_ATTACHMENT