OpenGL Side Culling

时间:2011-06-07 17:00:59

标签: java opengl lwjgl

我画的是一系列彼此相邻的立方体,我想要剔除所有触摸的边,因为它们没用。问题是我不知道如何剔除双方。有人可以解释如何使用glBegin()/ glEnd()调用来剔除正在调用的多维数据集的任何一侧吗?

2 个答案:

答案 0 :(得分:2)

OpenGL不会为你做这件事,你必须自己剔除它们。

我在最近的一个项目中做了以下事情:

从立方体位置的集合中,我将每个面的条目添加到字典中。此映射的面部中心位置面向正常。在添加新的(位置,正常)对之前,我会测试该位置的存在。如果找到:删除现有条目并丢弃新条目。否则添加新的(位置,正常)。

从这本词典中你可以建立顶点和三角形列表,你就不会有任何碰面。

可能有更有效的方法可以做到这一点,但这对我的应用程序来说已经足够了,而且很容易实现。

修改

PSEUDOCODE:

d = dictionary<vec3, vec3>

for each cube:
    for face 1..6:
        pos = faceCenterFor(cube, face)
        if pos in d:
            remove d[pos]
        else:
            d[pos] = normalFor(cube, face)

for each (pos, normal) in d:
    draw(vertsForFace(pos, normal))
    # or save verts to an array for drawing later

答案 1 :(得分:0)

如果确保为立方体指定面法线,则可以至少启用背面剔除(glEnable()),但很可能对于立方体侧面,您需要手动剔除。

但是,您可以将侧面的法线设置为背面,以便通过背面剔除来拾取。

使用(例如):

指定每个面的法线
gl.glNormal3f(1, 0, 0);

用于背面剔除用途:

glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);