作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以,我正在尝试实现视锥体剔除。这里的问题是,在我做到这一点之前,我需要了解一些事情。
首先是平面相交:
我的理解是平面可以通过3个点来定义;我们将它们称为 p0、p1 和 p2
。
鉴于此,我们知道平面的法线可以计算如下:
(伪代码)
vec3 edge0 = p1 - p0;
vec3 edge1 = p2 - p0;
vec3 normal = normalize( cross( edge0, edg1 ) ) // => edge1 X edge2 / length( edge1 X edge2 );
现在,假设我们有一个函数,它基本上告诉我们给定点是否以某种方式“穿过”平面。
(摩尔伪代码)
bool crossesPlane( vec3 plane[3], vec3 point )
{
vec3 normal = getNormal( plane ); // perform same operations as described above
float D = dot( -normal, plane[ 0 ] ); // plane[ 0 ] is arbitrary - could just as well be the 2nd or 3rd point in the array
float dist = dot(normal, point) + D;
return dist >= 0; // dist < 0 means we're on the opposite side of the plane's normal.
}
<小时/>
这背后的逻辑推理是,由于视锥体包含六个独立的平面(近、远、左、上、右、下),我们希望捕获这六个平面中的每一个,并本质上“通过”对于单个点(一个点,对该点进行六次测试),将它们传递给 CrossesPlane() 函数。
如果对 crossesPlane()
的这六个调用之一返回 false
,那么我们想要剔除有问题的点,从而有效地导致该点被视锥体,当然该点不会被渲染。
问题
注意
如果 D3D 和 OpenGL 之间有任何值得一提的实现差异,我们将不胜感激。
最佳答案
关于opengl - 查看视锥体剔除问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19782711/
我是一名优秀的程序员,十分优秀!