标签: occlusion-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
查看次数

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

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

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

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

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

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

opengl batching batch-processing culling occlusion-culling

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

C++,OpenGL Z-buffer prepass

我正在制作一个简单的体素引擎(想想Minecraft),目前我正在摆脱被遮挡的面孔以获得一些宝贵的fps.我在OpenGL中没有经过很多实验,也不太了解glColorMask魔法是如何工作的.

这就是我所拥有的:

// new and shiny
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// this one goes without saying
glEnable(GL_DEPTH_TEST);

// I want to see my code working, so fill the mask
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

// fill the z-buffer, or whatever
glDepthFunc(GL_LESS);
glColorMask(0,0,0,0);
glDepthMask(GL_TRUE);

// do a first draw pass
world_display();

// now only show lines, so I can see the occluded lines do not display
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

// I guess the error is somewhere here
glDepthFunc(GL_LEQUAL);
glColorMask(1,1,1,1);
glDepthMask(GL_FALSE);

// do a second draw pass …
Run Code Online (Sandbox Code Playgroud)

c++ opengl occlusion-culling

6
推荐指数
3
解决办法
8221
查看次数

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
查看次数

用于遮挡剔除的分层Z缓冲

我正在阅读Real-Time Rendering 3rd Edition中的Occlusion Culling部分,我无法理解它是如何工作的.一些问题:

  1. 如何让"Z金字塔"有所贡献?为什么我们需要Z缓冲区的多个分辨率?在书中,它显示如下(左侧): 在此输入图像描述

  2. 八叉树结构是否与用于一般视锥体剔除和渲染的八叉树相同?或者它是专门用于遮挡剔除技术的专业八叉树?

  3. 一个更一般的问题:在前一部分(以及此处)中,遮挡查询术语被描述为"渲染对象的简化边界体积并将其深度结果与Z缓冲区进行比较,返回像素数量可见." OpenGL中的哪些功能与此Occlusion Query概念相关联?

  4. 这种技术是开放世界游戏遮挡剔除的标准吗?

opengl graphics occlusion-culling

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

三个js:我的点是可见的还是被遮挡的?

我在空间中有一个点在三个 js 查看器中表达一个向量。附加到这一点有一个“HTML 注释”

可见注释

当该点不可见时(在同一网格的其他表面后面或被其他网格隐藏),我想隐藏它。例如,在下图中,它应该被隐藏:

应该是不可见的

我正在使用一些代码来检查注释是否在另一个问题中建议的截锥体中,但这并不完全有效,因为只有当我非常大幅度地旋转对象时注释才会消失。见下图:

现在不可见

你能帮我解决我的问题吗?

到目前为止我的代码是:

const vector = new THREE.Vector3(x, y, z);

this.aCamera.updateMatrix();
this.aCamera.updateMatrixWorld(true);

let frustum = new THREE.Frustum();
frustum.setFromMatrix(new THREE.Matrix4().multiplyMatrices(this.aCamera.projectionMatrix, this.aCamera.matrixWorldInverse));

  // check if annotation is in view
  if (frustum.containsPoint(vector)) {
       anAnnotation.css({opacity: 0});
  } else {
        anAnnotation.css({opacity: 1});
  }
Run Code Online (Sandbox Code Playgroud)

visibility occlusion-culling three.js

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

SceneKit - 遮挡剔除

我已经在iOS 8上使用SceneKit很长一段时间了,最​​近,我遇到了一种情况,我需要检测节点是否出现在视口上.遮挡剔除可能是一种可能的解决方案.因此,SceneKit是否有任何遮挡剔除选项,如果没有,我可能想尝试的其他建议是什么?谢谢!

occlusion-culling scenekit ios8

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