标签: culling

提取视图Frustum平面(Hartmann&Gribbs方法)

我一直在努力解决Hartmann/Gribbs提取Frustum飞机一段时间的方法,但收效甚微.我想构建一个摄像机视图 - 视锥体来剔除我的场景.

我正在使用右手坐标系中的柱主矩阵.(OpenGL风格 - 我使用的是C#和Playstation Mobile,但数学应该是相同的)

我想让我的飞机进入World-Space,所以我从View-Projection Matrix(即projectionMatrix*viewMatrix)构建我的平截头体.视图矩阵与相机的世界变换相反.

问题是; 不管我调整什么,我似乎无法得到正确的截头.我想我可能会遗漏一些明显的东西.

如果我在俯视z轴时向左或向右"扫视"我的相机,我的平面的法线会发生变化,以至于它们总是指向场景的原点 - 这让我觉得它们不在世界空间中...

math 3d frustum culling occlusion-culling

10
推荐指数
1
解决办法
4028
查看次数

我应该总是使用GL_CULL_FACE吗?

渲染时我应该总是使用这种方法吗?在坏的gfx卡上它会减慢多少?

如果最终结果不会有很多剔除的面孔,那我甚至应该使用这种方法吗?

opengl culling

9
推荐指数
2
解决办法
1万
查看次数

什么是openGL中的顺时针面

在背面剔除时,您可以使用面法线来查看面部是否指向远离相机的情况,如果以时钟方式或逆时针方向绘制三角形,则可以采用某种技术.

我对顺时针方向的这种技术很困惑.看起来使用这种方法,发送到图形卡的顶点数据的排序决定了它是朝向还是远离摄像机.我没有看到这有什么意义,因为相机可以向任何方向看,就好像顶点数据必须根据相机位置而改变,而这显然不是在CPU上完成的.

我怎么能理解这个?

opengl graphics render raster culling

8
推荐指数
2
解决办法
3705
查看次数

基于平铺的剔除概念问题的延迟渲染

编辑:我仍在寻找有关使用OpenCL或计算着色器的一些帮助.我更喜欢继续使用OGL 3.3并且不必处理对OGL 4.3和OpenCL 1.2的坏驱动程序支持,但我无论如何都不能想到这种类型的着色而不使用其中一个(用于匹配灯和砖).是否可以在不使用GPGPU的情况下实现基于区块的剔除?

我在OpenGL 3.3中编写了一个延迟渲染.现在我没有对光通道进行任何剔除(我只为每个灯光渲染一个全屏四边形).这(显然)有很多透支.(有时它是~100%).因此,我一直在研究在光通过期间提高性能的方法.似乎(几乎)每个人的意见中最好的方法是使用屏幕空间图块来剔除场景.这是Frostbite 2中使用的方法.我在SIGGRAPH 2010期间阅读了Andrew Lauritzen的演示文稿(http://download-software.intel.com/sites/default/files/m/d/4/1/d/8 /lauritzen_deferred_shading_siggraph_2010.pdf),我不确定我是否完全理解这个概念.(为此,为什么它比其他任何东西都好,如果它对我更好)

在演示中,Laurtizen通过轻量,四边形和瓷砖进行延迟着色,以剔除场景.根据他的数据,基于区块的延迟渲染器是最快的(到目前为止).我不明白为什么会这样.我猜这与事实有关,即每个瓷砖都将所有灯光一起分批.在演示文稿中,它说要读取G-Buffer一次然后计算光照,但这对我来说没有意义.在我看来,我会这样实现:

for each tile {
  for each light effecting the tile {
    render quad (the tile) and compute lighting
    blend with previous tiles (GL_ONE, GL_ONE)
  }
}
Run Code Online (Sandbox Code Playgroud)

这仍然需要对G-Buffer进行大量采样.我认为这样做会产生与为每个灯光渲染四边形屏幕相同(如果不是更差)的性能.从它的措辞来看,似乎这就是发生的事情:

for each tile {
 render quad (the tile) and compute all lights
}
Run Code Online (Sandbox Code Playgroud)

但我没有看到如何在不超过某些GPU上片段着色器的指令限制的情况下执行此操作.谁能帮我这个?看起来几乎每个基于tile的延迟渲染器都使用计算着色器或OpenCL(批量灯),为什么会这样,如果我没有使用它们会发生什么?

opengl lighting culling deferred-rendering deferred-shading

8
推荐指数
1
解决办法
2230
查看次数

渲染中的最先进的剔除和批处理技术

我目前正在升级和重组OpenGL渲染引擎.该引擎用于可视化建筑数据的大场景(具有内部的建筑物),并且对象的数量可以变得相当大.与任何建筑物一样,墙内有很多被遮挡的物体,你自然只会看到与你在同一房间内的物体,或者如果你在外面则看到外部物体.这留下了大量的物体,应该通过遮挡剔除和截锥体剔除来遮挡.

同时,有许多可以在渲染块中进行批处理的重复几何体,以及可以使用实例渲染渲染的许多对象.

我看待它的方式,很难以最佳方式组合渲染和剔除.如果在同一个VBO中批处理太多对象,则很难剔除CPU上的对象以跳过渲染该批处理.同时,如果你跳过cpu上的剔除,GPU会在看不到它们时处理很多对象.如果为了更容易地剔除CPU而过度跳过批处理,则会有不必要的大量渲染调用.

我已经对现有技术和理论进行了一些研究,以了解如何在现代图形中解决这些问题,但我还没有找到任何具体的解决方案.一位同事和我想出的想法是将批次限制在相对靠近彼此的物体上,例如房间内或半径范围内的所有椅子.这可以通过使用oct-trees来简化和优化.

有没有人对现有的现代图形引擎中的场景管理,剔除,批处理等技术有任何指示?

opengl batching batch-processing culling occlusion-culling

8
推荐指数
1
解决办法
1404
查看次数

2D遮挡剔除的最佳解决方案

在我的2D游戏中,我有静态和动态对象.可以有多个摄像头.我的问题:确定与当前相机的视图矩形相交的对象.

目前,我只是遍历所有现有对象(不关心动态或静态)并使用相机视图对其进行AABB检查.这对于非常动态的对象来说似乎是可以接受的,但对于静态对象来说却是不可接受的,在静态对象中可能存在数以万计的静态对象(静态级别几

我已经研究了可以解决我的问题的多个数据结构:

  • 四叉树

这是我考虑的第一件事,但问题是它会迫使我的场景具有固定的大小.(可接受静态,但不适用于动态对象)

  • 动态AABB树

看起来不错,但重新平衡它的开销似乎对许多动态对象来说太大了.

  • 空间哈希

这里的主要问题是,如果你大量使用相机缩小,必须查询大量不存在的空间散列桶,导致性能低下.

总的来说,我对这个问题的良好解决方案的标准是:

  • 动态大小:解决方案不得导致场景大小受限,或者需要大量重新计算才能调整大小

  • 良好的查询性能(适用于相机)

  • 对非常动态对象的良好支持:处理不断变化位置的对象所需的计算应该是好的:

一次我游戏中动态对象的最大合理数量可能是5000.考虑它们每一帧都改变它们的位置.考虑到频繁的插入和删除,是否有一个数据结构可以更快,而不是每帧比较物体的AABB和相机?

2d occlusion spatial quadtree culling

7
推荐指数
1
解决办法
3835
查看次数

3d遮挡剔除

我正在用C++/openGL编写类似静态3d块世界的Minecraft.我正在努力提高帧速率,到目前为止,我已经使用八叉树实现了截锥体剔除.这有帮助,但我仍然看到中等到坏的帧速率.下一步是通过更近的立方体来剔除从视点隐藏的立方体.但是,我无法找到很多关于如何实现这一目标的资源.

opengl 3d occlusion culling

6
推荐指数
2
解决办法
1万
查看次数

Frustum Culling的"雷达方法":首次简单测试失败?

试图至少使用Lighthouse3D Radar Frustum Culling教程非常简单的 第1部分来工作......我绝对感到困惑,我甚至无法在我的渲染器中使用该部分.

所以第一步是:你测试一个点是在近平面前面还是在远平面后面,如果是这样的话就进行早期剔除.(如果没有,那么你会进行进一步的测试,但我只是坚持第一部分.)

我使用2x2立方体的世界空间中心(x1y2z3),并有一个可以自由移动和旋转的相机.所有我的矢量和矩阵的东西必须相当坚固,因为渲染器否则工作得很好.所以这是我对第一部分的看法(在Go中),简单的"Z vs near-or-far"测试:

func (cam *Camera) frustumHasPoint(point *Vec3) bool {
    var pc Vec3
    v := point.Sub(&cam.Controller.Pos)  // point minus camPos
    ref := cam.Controller.dir  // take a copy of camDir
    ref.Z = -ref.Z
    ref.Normalize() // camDir was already normalized but anyway...
    pc.Z = v.Dot(&ref)
    if pc.Z > cam.Perspective.ZFar || pc.Z < cam.Perspective.ZNear {
        return false
    }
    return true
}
Run Code Online (Sandbox Code Playgroud)

现在我为什么要反转ref的Z?因为在教程中他们写道:"请注意,图中的参考不是右手系统(如在OpenGL中),因为Z的方向已被颠倒以使教程更直观" - 好吧,在GL教程中当然这有相反的效果......

好吧,如果如上所述反转Z,它会剔除超过50%的时间; 如果我不这样做,那么大约98%的时间它会"过度剔除".

我错过了什么?

opengl frustum rendering-engine go culling

6
推荐指数
1
解决办法
709
查看次数

OPENGL ARB_occlusion_query遮挡剔除

for (int i = 0; i < Number_Of_queries; i++)
{
    glBeginQueryARB(GL_SAMPLES_PASSED_ARB, queries[i]);

    Box[i]

    glEndQueryARB(GL_SAMPLES_PASSED_ARB);
}
Run Code Online (Sandbox Code Playgroud)

我很好奇GPU GEMS 1中建议的用于遮挡剔除的方法,其中执行了一定数量的查询.使用所描述的方法,您无法相互测试各个盒子,所以您应该执行以下操作吗?

测试盒A - >渲染框A.

测试盒B - >渲染框B.

测试盒C - >渲染框C.

等等...

opengl occlusion culling occlusion-culling

5
推荐指数
1
解决办法
1302
查看次数

困惑三角绕组和转换

首先,我想为这么长的问题道歉.你不必阅读它.您可以直接跳到问题部分,然后在需要时查找详细信息(我试图提供尽可能多的信息,因为根据我的经验,太多代码比太少更好).所以,...

我对三角形缠绕和变形有点困惑,我认为我理解.我正在尝试绘制一个定义如下的立方体:

    const float a = 0.5f; //half of the cube side length
    float positions[nComponents] =
    {
        //front face
        -a, -a, -a,
         a, -a, -a,
         a,  a, -a,

        -a, -a, -a,
         a,  a, -a,
        -a,  a, -a,

        //back face
        -a, -a,  a,
         a,  a,  a,
         a, -a,  a,

        -a, -a,  a,
        -a,  a,  a,
         a,  a,  a,

        //up face
        -a,  a, -a,
         a,  a, -a,
         a,  a,  a,

        -a,  a, -a,
         a,  a,  a,
        -a,  a,  a,

        //down …
Run Code Online (Sandbox Code Playgroud)

c++ opengl culling coordinate-transformation

5
推荐指数
1
解决办法
833
查看次数