如果这些像素具有某种颜色,如何从MonoGame的特定角度有效地看到这些像素的数目

问题描述 投票:0回答:1

我在monogame平台上有一个项目。该项目的目的是使用地形学方法计算放入平台中的几何图形的视场因数。在基本层次上,我将一个基本的多维数据集和相机放在该多维数据集对面。在这里,当我通过相机观察立方体时,需要计数通过透视法从透视图看到的对象的像素数。我已经有解决方案,但是速度很慢。在我的解决方案中,我计算某种颜色的像素数,然后将该数字除以屏幕上的像素总数。我听说过一种涉及使用OcclusionQuery的技术。但是我想我必须做一些着色器编程才能使用该技术,但我对此一无所知。如果还有另一种方法比我最近的方法更易于实现且速度更快,或者能解释OcclusionQuery的工作原理,请问一些建议。Here for example I count the total number of grey pixels then divide it to total screen area

在这里您可以找到下面编写的代码;

    private void CalculateViewFactor(Color[] data)
    {
        int objectPixelCount = 0;
        var color = new Color();
        color.R = data[0].R;
        color.G = data[0].G;
        color.B = data[0].B;
        foreach (Color item in data)
            if (item.R != color.R && item.G != color.G && item.B != color.B)
                objectPixelCount++;

        Console.WriteLine(objectPixelCount);
        Console.WriteLine(data.Length);
        Console.WriteLine( (float) objectPixelCount / data.Length);
    }

由于屏幕的第一个像素的颜色也是背景的颜色,因此,我将第一个像素的RGB值与屏幕上所有其他像素的RGB值进行比较,并对像素数进行计数颜色与第一个像素不同。但是据我所知,这种方法非常慢,我想将OcclusionQuery修改为我的代码。如果您能帮助我,我将不胜感激。

c# opengl monogame
1个回答
1
投票

这做起来很棘手,我只能建议一种“替代”方法,不一定是性能更高或更明智的设计方法。

如果您真的不需要知道绘制像素的确切数量,则可以近似。有一种称为Monte Carlo Integration的技术。

通过在屏幕上创建具有随机坐标的N点开始。您可以在这些点上检查并计算颜色。用对象颜色得到的点数除以测试点的总数(即N)。您得到的是对象在最终屏幕上占据的像素的[[近似比率。如果现在将此比率乘以屏幕上的像素总数(即WidthPx * HeightPx),将得到对象占用的近似像素数

enter image description here

优点:

    选择较大的
  • N可获得更准确的结果,选择较小的N可获得更好的性能
  • 算法很简单,很难搞定
  • 缺点:

      这是随机的,而且永远无法确定(每次都会得到不同的结果)
  • 它是近似值,从不精确
  • 您需要生成
  • 2 * N随机值(每个测试点两个),生成随机值是一个漫长的操作
  • 我确定以后您将要在屏幕上绘制纹理/阴影,然后此技术将不起作用,因为您将无法区分对象的像素和其他像素。
  • 仍然可以管理一个较小的看不见的缓冲区,在其中绘制相同的对象,但是没有任何阴影,并且每个对象都具有相同的唯一颜色,然后在其上应用蒙特卡洛算法,但是当然,这会浪费计算资源。
    © www.soinside.com 2019 - 2024. All rights reserved.