java - OpenGL 顶点数组和 GL_TRIANGLE_STRIP 绘图错误

标签 java opengl lwjgl vertex

我正在使用 GL_TRIANGLE_STRIPS 和 LWJGL OpenGL Java 绑定(bind)实现高度图。当我使用“GL_BEGIN/GL_END”绘制“直接”时,它工作得很好,但是当高度图太大时,它工作得很慢。

因为我想继续使用 VBO,所以我现在正在学习如何使用顶点数组。这是我遇到问题的地方,绘图是错误的。似乎 strip 的最后一个三角形返回到第一个。也许图片更好:

画得好: Good direct drawing

错误的顶点数组绘图: Bad vertex array drawing

我的普通绘图代码如下:

public void renderDirect() {
    //adapt the camera to the map
    float scale = 5.0f / Math.max(w - 1, l - 1);
    GL11.glScalef(scale, scale, scale);
    GL11.glTranslatef(-(float) (w - 1) / 2, 0.0f, -(float) (l - 1) / 2);

    //choose map color
    GL11.glColor3f(0.3f, 0.9f, 0.0f);

    for (int z = 0; z < l - 1; z++) {
        //Makes OpenGL draw a triangle at every three consecutive vertices
        GL11.glBegin(GL11.GL_TRIANGLE_STRIP);
        for (int x = 0; x < w; x++) {
            Vector3f normal = getNormal(x, z);
            GL11.glNormal3f(normal.getX(), normal.getY(), normal.getZ());
            GL11.glVertex3f(x, getHeight(x, z), z);
            normal = getNormal(x, z + 1);
            GL11.glNormal3f(normal.getX(), normal.getY(), normal.getZ());
            GL11.glVertex3f(x, getHeight(x, z + 1), z + 1);
        }
        glEnd();
    }
}

我的顶点数组绘制代码如下:

private void loadArrays(){
    //calculate the length of the buffers
    bLength = (l-1) * w * 6;
    //create the normal and vertex buffer array's
    dataBuffer = BufferUtils.createFloatBuffer(bLength*2);
    cBuffer = BufferUtils.createFloatBuffer(bLength);

    for (int z = 0; z < l - 1; z++) {
        //Fill up the buffers
        for (int x = 0; x < w; x++) {
            Vector3f normal = getNormal(x, z);
            dataBuffer.put(x).put(getHeight(x,z)).put(z);
            dataBuffer.put(normal.getX()).put(normal.getY()).put(normal.getZ());
            normal = getNormal(x, z + 1);
            dataBuffer.put(x).put(getHeight(x,z+1)).put(z+1);
            dataBuffer.put(normal.getX()).put(normal.getY()).put(normal.getZ());              
        }
    } 
}

int stride = 6*4;
public void renderDirect() {
    //adapt the camera to the map
    float scale = 5.0f / Math.max(w - 1, l - 1);
    GL11.glScalef(scale, scale, scale);
    GL11.glTranslatef(-(float) (w - 1) / 2, 0.0f, -(float) (l - 1) / 2);

    //choose map color
    GL11.glColor3f(0.3f, 0.9f, 0.0f);

    //Draw the vertex arrays
    glEnableClientState(GL_VERTEX_ARRAY);      
    glEnableClientState(GL_NORMAL_ARRAY); 

    dataBuffer.position(0);
    glVertexPointer(3, stride, dataBuffer);
    dataBuffer.position(3);
    glNormalPointer(stride,dataBuffer);

    glDrawArrays(GL_TRIANGLE_STRIP, 0, bLength/3);    

    glDisableClientState(GL_VERTEX_ARRAY);      
    glDisableClientState(GL_NORMAL_ARRAY);
}    

我做错了什么?

最佳答案

像这样背靠背连接三角形带不会像您预期的那样工作。

在循环中调用 glDrawArrays() 调整 firstcount 参数来绘制原始的 N三角带,或添加 degenerate triangles到每一行的末尾以重置 strip 起始位置。

或者只使用 GL_TRIANGLES :)

关于java - OpenGL 顶点数组和 GL_TRIANGLE_STRIP 绘图错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9115056/

相关文章:

java - 使用 FOP 和 JAVA 创建的 PDF 无法在 IE 6 中显示,但在 IE 8 中工作正常

java - 我可以使用GLFW确定摇杆的品牌和型号吗?

java - opengl中z坐标的值是多少

opengl - 如何使用 OpenGL 正确处理 alpha 合成

java - LWJGL/OpenGL 在 "Zoomed In"时禁用平滑纹理

java - 我可以在 JAXB 中对有时包含其他元素有时包含直接数据的元素进行建模吗

Java - 更简单地考虑用户输入的所有场景

java - ReplaceAll 在字符串上无法按预期工作

c++ - opengl 实例绘图 - 3D 箭头

java - OpenGL 和 OpenGLES 中的 glVertexAttribPointer