我在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修改为我的代码。如果您能帮助我,我将不胜感激。
这做起来很棘手,我只能建议一种“替代”方法,不一定是性能更高或更明智的设计方法。
如果您真的不需要知道绘制像素的确切数量,则可以近似。有一种称为Monte Carlo Integration的技术。
通过在屏幕上创建具有随机坐标的N点开始。您可以在这些点上检查并计算颜色。用对象颜色得到的点数除以测试点的总数(即N)。您得到的是对象在最终屏幕上占据的像素的[[近似比率。如果现在将此比率乘以屏幕上的像素总数(即WidthPx * HeightPx),将得到对象占用的近似像素数。
优点: