1

我正在学习 OpenGL,但我遇到了渲染不正确的问题。这就是我遇到的问题,金字塔的两侧之间有间隙。

在此处输入图像描述

这是我用来构造的顶点。

// Create Pyramid Vertex Buffer
FloatBuffer vertexBuffer = BufferUtils.createFloatBuffer(3 * 12);
vertexBuffer.put(new float[]
{
    // Side one
    0f, 0.8f, 0f,
    -0.8f, -0.8f, 0.8f,
    0.8f, -0.8f, 0.8f,

    // Side two
    0f, 0.8f, 0f,
    0.8f, -0.8f, 0.8f,
    0.8f, -0.8f, -0.8f,

    // Side three
    0f, 0.8f, 0f,
    0.8f, -0.8f, -0.8f,
    -0.8f, -0.8f, -0.8f,

    // Side four
    0f, 0.8f, 0f,
    -0.8f, -0.8f, -0.8f,
    -0.8f, -0.8f, 0.8f
});
vertexBuffer.rewind();

我认为这是因为模型出现在屏幕上。所以我认为在 z 轴上平移应该没问题,我在调用之前添加了这一行glDrawArrays

glTranslatef(0f, 0f, -1f);

这就产生了这种奇怪的行为,绘制了更多的边。

在此处输入图像描述

三个侧面都被渲染了,但它应该只看到两个!我怎么解决这个问题?我还启用了深度测试。

这是我初始化 OpenGL 的方法

// Initialize OpenGL
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1, 1, -1, 1, 1, -1);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glViewport(0, 0, Display.getWidth(), Display.getHeight());
4

1 回答 1

2

glOrtho 设置您的查看区域。由于您的形状适合 1 个正方形单位,但您希望能够看到整个事物,您可以将近处和远方设置为包围整个形状(2、-2 所做的),或者您可以设置您的glOrtho 类似于 glOrtho(-1, 1, -1, 1, 0, -5); 并将您的形状向后平移,使其位于视野中。

另一个(不好的)选项是更改顶点的绝对位置,使它们落在近场和远场内,但我不建议这样做,因为这通常是平移和变换的重点。

你的意思是让一切都在一个正交视图中,还是你的意思是有透视?正交视图是为什么翻译最初没有帮助的原因。

于 2013-09-11T03:30:09.170 回答