【问题标题】:LWJGL - Modern OpenGL - How not to render certain triangles?LWJGL - 现代 OpenGL - 如何不渲染某些三角形?
【发布时间】:2015-01-24 11:51:18
【问题描述】:

这是我想要做的:我想要一个模块化立方体,当触摸另一个时会禁用彼此之间的两个面。像这样:

我想让灰色的脸消失。

理论上看起来很简单吧?

除了我们应该在现代 OpenGL 中制作形状的方式。首先我们声明顶点,然后声明哪个与哪个连接的索引。

FloatBuffer vertices = BufferUtils.createFloatBuffer(8 * 6);
vertices.put(new float[]{
        // front                // color
        -0.5f, -0.5f,  0.5f,    0.75f, 0.75f, 0.75f,
        0.5f, -0.5f,  0.5f,     0.75f, 0.75f, 0.75f,
        0.5f,  0.5f,  0.5f,     0.35f, 0.75f, 0.9f,
        -0.5f,  0.5f,  0.5f,    0.35f, 0.75f, 0.9f,
        // back
        -0.5f, -0.5f, -0.5f,    0.75f, 0.75f, 0.75f,
        0.5f, -0.5f, -0.5f,     0.75f, 0.75f, 0.75f,
        0.5f,  0.5f, -0.5f,     0.35f, 0.75f, 0.9f,
        -0.5f,  0.5f, -0.5f,    0.35f, 0.75f, 0.9f,
});
vertices.flip();

IntBuffer indices = BufferUtils.createIntBuffer(12 * 3);
indices.put(new int[]{
        // front
        0, 1, 2,
        2, 3, 0,
        // top
        3, 2, 6,
        6, 7, 3,
        // back
        7, 6, 5,
        5, 4, 7,
        // bottom
        4, 5, 1,
        1, 0, 4,
        // left
        4, 0, 3,
        3, 7, 4,
        // right
        1, 5, 6,
        6, 2, 1,
});
indices.flip();

这构成了一个轻量级的立方体。但我不知道如何使用这个模型禁用我想要的面孔​​。

有没有人有一个不意味着我重新做立方体的解决方案?

谢谢

【问题讨论】:

  • 谢谢。答案说我必须单独更改块顶点数据。但我不希望每个 cuve 都有自己的数据。所有立方体共享相同的顶点数据。这就是它变得复杂的原因。
  • 您只能更新索引缓冲区,而不是更改顶点数据。您甚至可以预先计算不同的情况并切换到正确的缓冲区。
  • 这听起来是个好主意。你知道我是否可以合并索引缓冲区吗?
  • 我没有使用 LWJGL 和 IntBuffers 的经验,抱歉。

标签: java opengl lwjgl


【解决方案1】:

感谢 Anton D 的提示,我已经设法解决了我的问题。

我能够像这样“合并”多个缓冲区:

i_n = BufferUtils.createIntBuffer(2 * 3);
i_n.put(new int[]{
        // front
        1, 0, 2,
        3, 2, 0,
});
i_n.flip();

i_s = BufferUtils.createIntBuffer(2 * 3);
i_s.put(new int[]{
        // back
        6, 7, 5,
        4, 5, 7,
});
i_s.flip();

i_e = BufferUtils.createIntBuffer(2 * 3);
i_e.put(new int[]{
        // right
        5, 1, 6,
        2, 6, 1,
});
i_e.flip();

i_w = BufferUtils.createIntBuffer(2 * 3);
i_w.put(new int[]{
        // left
        0, 4, 3,
        7, 3, 4,
});
i_w.flip();

一张脸。

然后在渲染它们时(我预先计算了要绘制哪个),这就是我渲染它们的方式:

if(orientation.contains("n")){
    GL11.glDrawElements(GL11.GL_TRIANGLES, i_n);
}
if(orientation.contains("s")){
    GL11.glDrawElements(GL11.GL_TRIANGLES, i_s);
}
if(orientation.contains("e")){
    GL11.glDrawElements(GL11.GL_TRIANGLES, i_e);
}
if(orientation.contains("w")){
    GL11.glDrawElements(GL11.GL_TRIANGLES, i_w);
}

恐怕不是正确的解决方案。但是效果很好

【讨论】:

    猜你喜欢
    • 2021-04-08
    • 1970-01-01
    • 2020-04-05
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多