【问题标题】:"objects map" in openglopengl中的“对象映射”
【发布时间】:2023-03-26 11:22:01
【问题描述】:

简而言之:众所周知,opengl 在屏幕上绘制了许多三角形。

我想知道的:

如果opengl画三角形,它必须知道,哪个三角形属于屏幕上的哪个像素,对吧?

我也可以获得这些信息吗?例如,在绘制后调用一个函数(如gl_retrieve_object_map() 或类似的东西),让我知道哪个像素显示哪个三角形?

就像为每个像素进行挑选

我正在考虑一个二维数组,告诉我三角形索引或其他:

例如在 10x10 像素的屏幕上:

0 0 1 1 1 1 1 0 0 0
0 0 0 1 1 1 1 0 2 0
0 0 0 0 1 1 1 2 2 0
0 0 0 0 0 1 1 2 2 0
0 0 0 0 0 2 1 2 2 0
0 0 0 0 2 2 2 2 2 0
0 0 0 2 2 2 2 2 2 0
0 0 2 2 2 2 2 2 2 0
0 2 2 2 2 2 2 2 2 0
0 0 0 0 0 0 0 0 0 0

对于像这样的图像:

   ___
  \  |
   \ |  
    \|/|
     / |
    /  |
   /   |
  /____|

有什么可以用的吗?

【问题讨论】:

    标签: c++ opengl picking ray-picking


    【解决方案1】:

    OpenGL 在绘制后实际上并没有这些信息。 OpenGL 有一些缓冲区,包括(除其他外)颜色缓冲区和深度缓冲区,但它没有为每个绘制的图元保存索引的缓冲区。

    但这并不意味着你不走运。我见过应用程序做的一件事是移除所有的光照效果,并为每个对象赋予独特的颜色。然后,它将场景渲染到屏幕外缓冲区。然后,屏幕外缓冲区就包含您想要的信息。

    【讨论】:

    • 尽管这是一个很大的 hack,但它是一个非常酷的解决方案!非常感谢你!但是opengl不能在绘图时存储这些信息吗?它如何获得其他对象的颜色和正确的着色器?
    • @Malte:OpenGL 有变量存储当前着色器和绘制对象时使用的颜色。当它绘制该对象时,它会为每个像素计算出该位置的对象深度,如果它比先前记录的深度更近,它将计算该像素的颜色并将其覆盖在颜色缓冲区中并注意深度缓冲区中的新最小深度。然后,当您渲染一个新对象时,它会覆盖这些变量。上一个对象被渲染的唯一痕迹是颜色缓冲区中的颜色和深度缓冲区中的深度。
    • 好吧,有好有坏 :) 我的第一个想法是:这个来自 ogl 的方法不应该非常慢吗?而且如果它可以确定那里的物体,为什么我们不能?
    • @Malte:嗯,它显然并不慢。据我所知,Direct3D 也是这样做的。它的优势之一是非常适合并行化,因此现代 GPU 专为高度并行的任务量身定制。
    • @Malte:部分原因是它知道那里有什么对象。一个物体被画出来后,就没有它的记录了;它在位图中,已展平。不再有任何原始数据或索引的痕迹。它完全基于它已经绘制的位图和一个附加的图元进行渲染,从而产生一个新的位图。再次强调,没有记录关于它刚刚绘制的内容的数据
    【解决方案2】:

    如果opengl画三角形,它必须知道,哪个三角形属于屏幕上的哪个像素,对吧?

    没有。 OpenGL 按照要求绘制的顺序绘制三角形,一次绘制一个三角形。程序要求它“在坐标 A、B 和 C 之间绘制一个三角形”,然后 OpenGL 会在那里完成(嗯,实际上它会批量处理这些命令)。

    所以在绘制三角形之前,只有顶点属性决定了它的位置。然后对于列表中的每个三角形,它都会被绘制出来,然后唯一剩下的是没有颜色的像素,以及哪些三角形创建了它们的信息。

    【讨论】:

      猜你喜欢
      • 2019-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多