Java 为什么深度测试在颜色拾取的屏幕外渲染中不起作用?
我正在使用着色和屏幕外渲染来实现OpenGL上四边形的选择工具。但是深度测试在屏幕外渲染中似乎不起作用,在某些角度和旋转中,前面的四元体后面的四元体被选中。我该如何设置缓冲区和/或附件? 这个问题与我的法线有关吗???还是只是深度测试??我个人认为这是深度测试,我就是不能让这该死的东西工作 以下是我的缓冲区初始化函数:Java 为什么深度测试在颜色拾取的屏幕外渲染中不起作用?,java,opengl,off-screen,depth-testing,Java,Opengl,Off Screen,Depth Testing,我正在使用着色和屏幕外渲染来实现OpenGL上四边形的选择工具。但是深度测试在屏幕外渲染中似乎不起作用,在某些角度和旋转中,前面的四元体后面的四元体被选中。我该如何设置缓冲区和/或附件? 这个问题与我的法线有关吗???还是只是深度测试??我个人认为这是深度测试,我就是不能让这该死的东西工作 以下是我的缓冲区初始化函数: public void init(final GL2 gl) { // setup gl.glGenFramebuffers(frameBufferIds.cap
public void init(final GL2 gl) {
// setup
gl.glGenFramebuffers(frameBufferIds.capacity(), frameBufferIds);
gl.glGenRenderbuffers(renderBufferIds.capacity(), renderBufferIds);
gl.glBindRenderbuffer(GL2.GL_RENDERBUFFER, renderBufferIds.get(0));
//
ViewPort viewPort = ViewPort.getCurrent(gl);
gl.glRenderbufferStorage(GL2.GL_RENDERBUFFER, GL2.GL_RGBA, viewPort.getWidth(), viewPort.getHeight());
/**
* Comment 1
*/
// gl.glRenderbufferStorage(GL2.GL_RENDERBUFFER, GL2.GL_DEPTH_COMPONENT, viewPort.getWidth(), viewPort.getHeight());
// attach the render buffer to color attachment point
gl.glBindFramebuffer(GL2.GL_FRAMEBUFFER, frameBufferIds.get(0));
gl.glFramebufferRenderbuffer(GL2.GL_FRAMEBUFFER, GL2.GL_COLOR_ATTACHMENT0, GL2.GL_RENDERBUFFER, renderBufferIds.get(0));
/**
* Comment 2
*/
// gl.glFramebufferRenderbuffer(GL2.GL_FRAMEBUFFER, GL2.GL_DEPTH_ATTACHMENT, GL2.GL_RENDERBUFFER, renderBufferIds.get(0));
//
if (gl.glCheckFramebufferStatus(GL.GL_FRAMEBUFFER) != GL2.GL_FRAMEBUFFER_COMPLETE) {
System.out.println("Render Buffer problem!");
}
}
当我取消注释“注释1”和“注释2”部分时,会出现渲染缓冲区问题。但我听说我应该“除了颜色附件之外,还要在GL_DEPTH_附件上附加一个渲染缓冲区。”(来源:。我想知道如何才能做到这一点
另外,这是我的使用代码:
gl.glDisable(GL2.GL_DITHER);
// 1. render in offscreen
init(gl);
gl.glEnable(GL2.GL_DEPTH_TEST);
offscreenRender(gl, selectionType);
// 2. read pixel
gl.glReadBuffer(GL2.GL_DEPTH_ATTACHMENT);
gl.glReadBuffer(GL2.GL_COLOR_ATTACHMENT0);
gl.glReadPixels((int) (pos.x - pickWidth / 2), (int) (viewPort.getHeight() - pos.y - pickWidth / 2), pickWidth, pickWidth, GL2.GL_RGBA, GL2.GL_FLOAT, pointSelectionPixels);
当然,深度测试不起作用;您没有创建深度缓冲区。FBO本质上没有深度缓冲区,就像它们本质上没有颜色缓冲区一样。如果您想要两者,则必须同时创建两者
因此,使用
GL\u DEPTH\u component 24
或创建渲染缓冲区,并将其附加到FBO的GL\u DEPTH\u附件上。当然深度测试不起作用;您没有创建深度缓冲区。FBO本质上没有深度缓冲区,就像它们本质上没有颜色缓冲区一样。如果您想要两者,您必须两者兼而有之
因此,使用GL\u DEPTH\u component 24
或创建一个渲染缓冲区,并将其附加到FBO的GL\u DEPTH\u附件上。我在互联网上读了几个小时关于帧和渲染缓冲区的内容。最后我发现了我在这方面的问题。该网站说我们必须将颜色渲染到纹理和深度中进入渲染缓冲区。这就是重点
设置好缓冲区和纹理后,就可以使用glReadPixels
方法读取深度和颜色值了
// reading color
glReadBuffer( GL_COLOR_ATTACHMENT0_EXT );
glReadPixels( 0, 0, WIDTH, HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, color );
// reading depth
glReadBuffer( GL_DEPTH_ATTACHMENT_EXT );
glReadPixels( 0, 0, WIDTH, HEIGHT, GL_DEPTH_COMPONENT, GL_FLOAT, depth );
谢谢!:D我在互联网上读了几个小时关于帧和渲染缓冲区的文章。最后我发现了我的问题。这个网站说我们必须将颜色渲染到纹理中,将深度渲染到渲染缓冲区中。这就是重点
设置好缓冲区和纹理后,就可以使用glReadPixels
方法读取深度和颜色值了
// reading color
glReadBuffer( GL_COLOR_ATTACHMENT0_EXT );
glReadPixels( 0, 0, WIDTH, HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, color );
// reading depth
glReadBuffer( GL_DEPTH_ATTACHMENT_EXT );
glReadPixels( 0, 0, WIDTH, HEIGHT, GL_DEPTH_COMPONENT, GL_FLOAT, depth );
谢谢!:D谢谢你的回答!我在“评论1”和“评论2”部分那样做了,但它不起作用!谢谢你的回答!我在“评论1”和“评论2”部分那样做了,但它不起作用!