我一直在努力解决Hartmann/Gribbs提取Frustum飞机一段时间的方法,但收效甚微.我想构建一个摄像机视图 - 视锥体来剔除我的场景.
我正在使用右手坐标系中的柱主矩阵.(OpenGL风格 - 我使用的是C#和Playstation Mobile,但数学应该是相同的)
我想让我的飞机进入World-Space,所以我从View-Projection Matrix(即projectionMatrix*viewMatrix)构建我的平截头体.视图矩阵与相机的世界变换相反.
问题是; 不管我调整什么,我似乎无法得到正确的截头.我想我可能会遗漏一些明显的东西.
如果我在俯视z轴时向左或向右"扫视"我的相机,我的平面的法线会发生变化,以至于它们总是指向场景的原点 - 这让我觉得它们不在世界空间中...
渲染时我应该总是使用这种方法吗?在坏的gfx卡上它会减慢多少?
如果最终结果不会有很多剔除的面孔,那我甚至应该使用这种方法吗?
在背面剔除时,您可以使用面法线来查看面部是否指向远离相机的情况,如果以时钟方式或逆时针方向绘制三角形,则可以采用某种技术.
我对顺时针方向的这种技术很困惑.看起来使用这种方法,发送到图形卡的顶点数据的排序决定了它是朝向还是远离摄像机.我没有看到这有什么意义,因为相机可以向任何方向看,就好像顶点数据必须根据相机位置而改变,而这显然不是在CPU上完成的.
我怎么能理解这个?
编辑:我仍在寻找有关使用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渲染引擎.该引擎用于可视化建筑数据的大场景(具有内部的建筑物),并且对象的数量可以变得相当大.与任何建筑物一样,墙内有很多被遮挡的物体,你自然只会看到与你在同一房间内的物体,或者如果你在外面则看到外部物体.这留下了大量的物体,应该通过遮挡剔除和截锥体剔除来遮挡.
同时,有许多可以在渲染块中进行批处理的重复几何体,以及可以使用实例渲染渲染的许多对象.
我看待它的方式,很难以最佳方式组合渲染和剔除.如果在同一个VBO中批处理太多对象,则很难剔除CPU上的对象以跳过渲染该批处理.同时,如果你跳过cpu上的剔除,GPU会在看不到它们时处理很多对象.如果为了更容易地剔除CPU而过度跳过批处理,则会有不必要的大量渲染调用.
我已经对现有技术和理论进行了一些研究,以了解如何在现代图形中解决这些问题,但我还没有找到任何具体的解决方案.一位同事和我想出的想法是将批次限制在相对靠近彼此的物体上,例如房间内或半径范围内的所有椅子.这可以通过使用oct-trees来简化和优化.
有没有人对现有的现代图形引擎中的场景管理,剔除,批处理等技术有任何指示?
在我的2D游戏中,我有静态和动态对象.可以有多个摄像头.我的问题:确定与当前相机的视图矩形相交的对象.
目前,我只是遍历所有现有对象(不关心动态或静态)并使用相机视图对其进行AABB检查.这对于非常动态的对象来说似乎是可以接受的,但对于静态对象来说却是不可接受的,在静态对象中可能存在数以万计的静态对象(静态级别几
我已经研究了可以解决我的问题的多个数据结构:
这是我考虑的第一件事,但问题是它会迫使我的场景具有固定的大小.(可接受静态,但不适用于动态对象)
看起来不错,但重新平衡它的开销似乎对许多动态对象来说太大了.
这里的主要问题是,如果你大量使用相机缩小,必须查询大量不存在的空间散列桶,导致性能低下.
总的来说,我对这个问题的良好解决方案的标准是:
动态大小:解决方案不得导致场景大小受限,或者需要大量重新计算才能调整大小
良好的查询性能(适用于相机)
对非常动态对象的良好支持:处理不断变化位置的对象所需的计算应该是好的:
一次我游戏中动态对象的最大合理数量可能是5000.考虑它们每一帧都改变它们的位置.考虑到频繁的插入和删除,是否有一个数据结构可以更快,而不是每帧比较物体的AABB和相机?
我正在用C++/openGL编写类似静态3d块世界的Minecraft.我正在努力提高帧速率,到目前为止,我已经使用八叉树实现了截锥体剔除.这有帮助,但我仍然看到中等到坏的帧速率.下一步是通过更近的立方体来剔除从视点隐藏的立方体.但是,我无法找到很多关于如何实现这一目标的资源.
试图至少使用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%的时间它会"过度剔除".
我错过了什么?
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.
等等...
首先,我想为这么长的问题道歉.你不必阅读它.您可以直接跳到问题部分,然后在需要时查找详细信息(我试图提供尽可能多的信息,因为根据我的经验,太多代码比太少更好).所以,...
我对三角形缠绕和变形有点困惑,我认为我理解.我正在尝试绘制一个定义如下的立方体:
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)