获取当前像素后面的像素 我在C++中用GLUT编码程序,在窗口中渲染3D模型。 我使用glReadPixels来获取窗口中显示的风景图像

获取当前像素后面的像素 我在C++中用GLUT编码程序,在窗口中渲染3D模型。 我使用glReadPixels来获取窗口中显示的风景图像,c++,opengl,glut,glreadpixels,C++,Opengl,Glut,Glreadpixels,我想知道,对于一个特定的像素(x,y),如何得到它的颜色,而不是直接得到它后面下一个物体的颜色 如果我渲染一个蓝色三角形,在它前面渲染一个红色三角形,glReadPixels会从红色三角形中生成红色 我想知道如何从蓝色三角形中获取颜色,如果红色三角形不在这里,我将从glReadPixels中获取颜色。默认帧缓冲区仅保留最上面的颜色。要获得您的建议,需要特定的渲染管道 例如,您可以: 创建与目标视口尺寸相同的屏幕外帧缓冲区 将仅深度过程渲染到屏幕外帧缓冲区,并将深度值存储在附加纹理中 使用特殊着色

我想知道,对于一个特定的像素(x,y),如何得到它的颜色,而不是直接得到它后面下一个物体的颜色

如果我渲染一个蓝色三角形,在它前面渲染一个红色三角形,glReadPixels会从红色三角形中生成红色


我想知道如何从蓝色三角形中获取颜色,如果红色三角形不在这里,我将从glReadPixels中获取颜色。

默认帧缓冲区仅保留最上面的颜色。要获得您的建议,需要特定的渲染管道

例如,您可以:

  • 创建与目标视口尺寸相同的屏幕外帧缓冲区
  • 将仅深度过程渲染到屏幕外帧缓冲区,并将深度值存储在附加纹理中
  • 使用特殊着色器重新渲染场景,该着色器仅绘制变换后Z值小于先前记录的深度缓冲区中的值的像素
  • 最后一次渲染的最终结果应该是剥离顶层的原始场景

    编辑:

    创建屏幕外帧缓冲区并向其渲染仅深度版本的场景只需要少量新代码,您可以将现有的渲染管道与此结合使用来执行步骤1和2

    但是,我想不出任何方法可以在没有着色器的情况下重新渲染场景以获得步骤3中所需的信息,因为它既包括标准深度测试,也包括针对提供的深度纹理的测试。这并不意味着没有一个,只是我不太精通GL技巧


    我可以通过摆弄渲染系统为屏幕上的特定点想出其他方法来完成相同的任务,但它们都比仅仅编写着色器复杂得多。

    默认帧缓冲区只保留最上面的颜色。要获得您的建议,需要特定的渲染管道

    例如,您可以:

  • 创建与目标视口尺寸相同的屏幕外帧缓冲区
  • 将仅深度过程渲染到屏幕外帧缓冲区,并将深度值存储在附加纹理中
  • 使用特殊着色器重新渲染场景,该着色器仅绘制变换后Z值小于先前记录的深度缓冲区中的值的像素
  • 最后一次渲染的最终结果应该是剥离顶层的原始场景

    编辑:

    创建屏幕外帧缓冲区并向其渲染仅深度版本的场景只需要少量新代码,您可以将现有的渲染管道与此结合使用来执行步骤1和2

    但是,我想不出任何方法可以在没有着色器的情况下重新渲染场景以获得步骤3中所需的信息,因为它既包括标准深度测试,也包括针对提供的深度纹理的测试。这并不意味着没有一个,只是我不太精通GL技巧


    我可以通过摆弄渲染系统为屏幕上的特定点想出其他方法来完成同样的任务,但它们都比仅仅编写着色器复杂得多。

    谢谢你的回答。如果我理解正确,这将需要着色器编程(GLSL)、VBO等?没办法吗?事实上,我的实际渲染是使用glBegin/glEnd/glVertex完成的。我知道这很糟糕,而且几年前就被弃用了,因为我在重用旧代码。我很想学习着色器编程,但事实上我现在真的没有时间,而这段特定的代码是一次性的…@Jherico非常感谢你的回答。您是否有推荐的资源、教程或其他学习方法(如着色器编程)?再次感谢。:)谢谢你的回答。如果我理解正确,这将需要着色器编程(GLSL)、VBO等?没办法吗?事实上,我的实际渲染是使用glBegin/glEnd/glVertex完成的。我知道这很糟糕,而且几年前就被弃用了,因为我在重用旧代码。我很想学习着色器编程,但事实上我现在真的没有时间,而这段特定的代码是一次性的…@Jherico非常感谢你的回答。您是否有推荐的资源、教程或其他学习方法(如着色器编程)?再次感谢。:)