FBO深度缓冲区为红色

时间:2016-12-03 21:45:40

标签: java opengl fbo shadows

我无法让我的影子系统正常工作。 我使用以下代码生成我的FBO:

int frameBuffer = GL30.glGenFramebuffers();
GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, frameBuffer);
GL11.glDrawBuffer(GL11.GL_NONE);
GL11.glReadBuffer(GL11.GL_NONE);

int texture = GL11.glGenTextures();
GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture);
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL14.GL_DEPTH_COMPONENT16, WIDTH, HEIGHT, 0,
GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, (ByteBuffer) null);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);
GL32.glFramebufferTexture(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, texture, 0);

GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
GL11.glViewport(0, 0, Display.getDisplayMode().getWidth(), Display.getDisplayMode().getHeight());

我的实体在我的默认渲染器(输出vec4)中呈现正常。 我的阴影着色器代码很简单:

#version 430
layout(location = 0) out float fragmentdepth;

void main(void){
    fragmentdepth =  gl_FragCoord.z;
}

我试图在不使用任何FBO的情况下输出vec4(1.0)并且一切正常,所以我的计算是正确的,我的着色器代码也应该可以正常工作。

我的抽奖电话如下:

GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, frameBuffer);
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT|GL11.GL_DEPTH_BUFFER_BIT);
renderShadows();
GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
renderAllItems();
Display.sync(FPS_CAP);
Display.update();
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT|GL11.GL_DEPTH_BUFFER_BIT);
GL11.glClearColor(0.2f,0.1f,0.1f , 1f);

当我打电话给" renderAllItems();"我也在右上角渲染一个四边形,它应该显示我的深度纹理。但我所看到的只是一个红色四边形。 它不应该是黑/白并显示一些东西吗?

1 个答案:

答案 0 :(得分:2)

GL32.glFramebufferTexture(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, texture, 0);

这会将纹理附加到帧缓冲对象的深度附件。

layout(location = 0) out float fragmentdepth;

那是user-defined output from a fragment shader。用户定义的输出映射到FBO的片段颜色which get written颜色附件,而不是深度附件。

片段的深度是写入深度附件的内容。在FS中,built-in gl_FragDepth output就是shouldn't even have a fragment shader。但是,没有理由你写信给它。如果您没有写信给它,则会自动填写gl_FragCoord.z

事实上,如果您想要的只是渲染深度,那么https://bugs.webkit.org/show_bug.cgi?id=26559