如果不是GL_QUADS,那又如何呢?

Ore*_*on. 1 java opengl lwjgl

我正在使用 OpenGL 的 LWJGL 包装器在 Java 中开发一个简单的 2D 游戏。
对于渲染方法,我使用VBO。与其他渲染方法相比,它看起来非常好且更快。
我正在阅读一些文章,并在 StackOverflow 上寻求一些问题,我发现使用 2 个三角形比使用一个四边形更好,因为现代 GPU 只显示三角形(让 GPU 将四边形转换为三角形是一种浪费)三角形)。

我知道的唯一方法是创建 2 个缓冲区来存储顶点数据和纹理坐标数据。这是四边形的,我是这样做的:

int vertexID; //Holding the GL buffer ID for the Vertex
int texCoordsID; //Holding the GL buffer ID for the texture coords

void init(){
    //BufferUtils is a Utility class provided by the SlickUtil library, I use it for creating buffers.
    //Create float buffer for storing vertex data
    FloatBuffer vertexBuffer = BufferUtils.createFloatBuffer(4 * 2);
    //Put vertex data inside the buffer
    vertexBuffer.put(new float[]{
        0, 0,
        100, 0,
        100, 100,
        0, 100
    });
    //Rewind the buffer
    vertexBuffer.rewind();

    FloatBuffer texCoordsBuffer = BufferUtils.createFloatBuffer(4 * 2);
    texCoordsBuffer.put(new float[]{
        0, 0,
        1, 0,
        1, 1,
        0, 1
    });
    texCoordsBuffer.rewind();

    vertexID = glGenBuffers();
    glBindBuffer(GL_ARRAY_BUFFER, vertexID);
    glBufferData(GL_ARRAY_BUFFER, vertexBuffer, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    texCoordsID = glGenBuffers();
    glBindBuffer(GL_ARRAY_BUFFER, texCoordsID);
    glBufferData(GL_ARRAY_BUFFER, texCoordsBuffer, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

void render(){
    glBindTexture(GL_TEXTURE_2D, texture.id); //Not so important.

    glBindBuffer(GL_ARRAY_BUFFER, vertexID);
    glVertexPointer(2, GL_FLOAT, 0, 0);

glBindBuffer(GL_ARRAY_BUFFER, texCoordsID);
    glTexCoordPointer(2, GL_FLOAT, 0, 0);

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    glDrawArrays(GL_QUADS, 0, 4);

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
Run Code Online (Sandbox Code Playgroud)

现在我的主要问题是,如何将其分成 2 个三角形而不是 1 个四边形?
还有一个附带问题:这对于 2D 游戏真的很重要吗?它会带来轻微的变化吗?

zti*_*rom 5

只是改变

glDrawArrays(GL_QUADS, 0, 4);
Run Code Online (Sandbox Code Playgroud)

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
Run Code Online (Sandbox Code Playgroud)

并添加一个稍微不同的顶点缓冲区

vertexBuffer.put(new float[]{
     1.0, 1.0
    -1.0, 1.0
     1.0,-1.0
    -1.0,-1.0
});
Run Code Online (Sandbox Code Playgroud)

这代表两个三角形,两个“点”是相同的,所以我们只有四个“点”。

就像:

x3__x4
| \  |
|  \ | 
x1__x2
Run Code Online (Sandbox Code Playgroud)