Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java FBO深度缓冲区为红色_Java_Opengl_Fbo_Shadows - Fatal编程技术网

Java FBO深度缓冲区为红色

Java FBO深度缓冲区为红色,java,opengl,fbo,shadows,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.glBindTextur

我的阴影系统无法正常工作。 我使用以下代码生成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());
我的实体在默认渲染器(输出向量4)中渲染良好。 我的阴影着色器代码是直截了当的:

#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();”时,我还在右上角渲染一个四边形,它应该显示我的深度纹理。但我看到的只是一个红色的方形。 它不应该是黑/白的,并显示一些东西吗

这会将纹理附着到帧缓冲区对象的深度附着

这是一个很好的例子。用户定义的输出映射到片段颜色、FBO的颜色附件,而不是深度附件

片段的深度是写入深度附件的内容。在FS中,这就是。然而,你没有理由写信给它。如果您不向其写入,则它将由
gl_FragCoord.z
自动填写

事实上,如果您只想渲染深度,那么您可以

这会将纹理附着到帧缓冲区对象的深度附着

这是一个很好的例子。用户定义的输出映射到片段颜色、FBO的颜色附件,而不是深度附件

片段的深度是写入深度附件的内容。在FS中,这就是。然而,你没有理由写信给它。如果您不向其写入,则它将由
gl_FragCoord.z
自动填写


事实上,如果您只想渲染深度,您可以。

“我无法使阴影系统正常工作。”->“我无法使阴影系统正常工作。”深度缓冲区不是任何颜色,它存储深度。这是一个单一的组成部分,但可以解释为任何颜色你想要。。它通常会变成红色通道。“它不应该是黑色/白色并显示一些东西吗?”你把它渲染成“黑色/白色”吗?不,我没有。但是我如何告诉我的程序渲染黑/白?只输出一个vec4(color.r,color.r,color.r,1.0)?是的,我知道它存储深度。我只是用颜色来表示我的着色器工作正常。“我无法使我的阴影系统正常工作。”->“我无法使我的阴影系统正常工作。”深度缓冲区不是任何颜色,它存储深度。这是一个单一的组成部分,但可以解释为任何颜色你想要。。它通常会变成红色通道。“它不应该是黑色/白色并显示一些东西吗?”你把它渲染成“黑色/白色”吗?不,我没有。但是我如何告诉我的程序渲染黑/白?只输出一个vec4(color.r,color.r,color.r,1.0)?是的,我知道它存储深度。我只是用颜色来表示我的着色器工作得很好。在没有片段着色器的情况下渲染时,是否有此行为的规范参考?我唯一发现的是“如果顶点或片段着色器阶段没有活动程序,顶点和/或片段处理的结果将是未定义的”。因为
gl\u FragDepth
是片段处理的结果,所以这并没有告诉我在这种情况下它会被定义。OMG it works!!!:)谢谢你,尼科·博拉斯。我刚刚删除了片段着色器中的所有内容,并将显示纹理更改为显示黑/白。非常感谢!!:)@RetoKoradi:“因为
gl_FragDepth
是片段处理的结果”,这并不重要,因为:“如果活动片段着色器没有静态地将值指定给
gl_FragDepth
,那么光栅化过程中生成的深度值将由管道的后续阶段使用。”如果没有片段着色器,然后它不能分配给
gl\u FragDepth
。因此,使用光栅化过程中生成的深度值。@RetoKoradi:Plus,这里有这样一句话:“片段着色器确定片段的颜色值,还可以修改或替换其指定的深度值。”请注意,它并没有说FS“确定”深度值,而只是说它可以“修改或替换”当在没有片段着色器的情况下渲染时,是否有此行为的规范参考?我唯一发现的是“如果顶点或片段着色器阶段没有活动程序,顶点和/或片段处理的结果将是未定义的”。因为
gl\u FragDepth
是片段处理的结果,所以这并没有告诉我在这种情况下它会被定义。OMG it works!!!:)谢谢你,尼科·博拉斯。我刚刚删除了片段着色器中的所有内容,并将显示纹理更改为显示黑/白。非常感谢!!:)@RetoKoradi:“因为
gl_FragDepth
是片段处理的结果”,这并不重要,因为:“如果活动片段着色器没有静态地将值指定给
gl_FragDepth
,那么光栅化过程中生成的深度值将由管道的后续阶段使用。”如果没有片段着色器,然后它不能分配给
gl\u FragDepth
。因此,将使用光栅化过程中生成的深度值。@RetoKoradi:Plus,这里有这样一句话:“片段着色器确定片段的颜色值,还可以修改或替换其指定的深度值。”请注意,它并没有说FS“确定”深度值,而只是说它可以“修改或替换”深度值。
GL32.glFramebufferTexture(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, texture, 0);
layout(location = 0) out float fragmentdepth;