我无法正确呈现简单的索引数组

I can't get a simple indexed array rendered properly

我正在移植这个 sample (site) to jogl 但我注意到图像中有些地方并不完美,地板上有一些人工制品,形状也不是完全正方形,如您所见(不关心颜色,是变化的) , 地板也不好看:

因此我尝试先只渲染地板(如果你想尝试,很简单,用 SQRT_BUILDING_COUNT 从 100 -> 0 切换),我已经遇到了第一个问题,它应该是基于两个三角形的正方形,但我只看到其中一个。

My vertex structure:

public float[] position = new float[3];
public byte[] color = new byte[4];
public float[] attrib0 = new float[4];
public float[] attrib1 = new float[4];
public float[] attrib2 = new float[4];
public float[] attrib3 = new float[4];
public float[] attrib4 = new float[4];
public float[] attrib5 = new float[4];
public float[] attrib6 = new float[4];

attrib0-6 目前未使用

My VS inputs:

// Input attributes
layout(location=0) in vec4 iPos;
layout(location=1) in vec4 iColor;
layout(location=2) in PerMeshUniforms* bindlessPerMeshUniformsPtr;
layout(location=3) in vec4 iAttrib3;
layout(location=4) in vec4 iAttrib4;
layout(location=5) in vec4 iAttrib5;
layout(location=6) in vec4 iAttrib6;
layout(location=7) in vec4 iAttrib7; 

我将 iPos 声明为 vec3,所以我猜它会在 VS 中填充为 vec4(iPos, 1)

I transfer data to gpu:

    gl4.glNamedBufferData(vertexBuffer[0], Vertex.size() * vertices.size(),
            GLBuffers.newDirectFloatBuffer(verticesArray), GL4.GL_STATIC_DRAW);
    gl4.glNamedBufferData(indexBuffer[0], GLBuffers.SIZEOF_SHORT * indices.size(),
            GLBuffers.newDirectShortBuffer(indicesArray), GL4.GL_STATIC_DRAW);

然后在我渲染之前 I call:

        gl4.glEnableVertexArrayAttrib(0, 0);
        gl4.glEnableVertexArrayAttrib(0, 1);

然后渲染,original code is:

    // Set up attribute 0 for the position (3 floats)
    glVertexArrayVertexAttribOffsetEXT(0, m_vertexBuffer, 0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), Vertex::PositionOffset);

    // Set up attribute 1 for the color (4 unsigned bytes)
    glVertexArrayVertexAttribOffsetEXT(0, m_vertexBuffer, 1, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Vertex), Vertex::ColorOffset);

I substituted it with:

        // Set up attribute 0 for the position (3 floats)
        gl4.glVertexArrayVertexBuffer(0, 0, vertexBuffer[0], Vertex.positionOffset,
                Vertex.size());
        gl4.glVertexArrayAttribFormat(0, 0, 3, GL4.GL_FLOAT, false, Vertex.size());

        // Set up attribute 1 for the color (4 unsigned bytes)
        gl4.glVertexArrayVertexBuffer(0, 1, vertexBuffer[0], Vertex.colorOffset,
                Vertex.size());
        gl4.glVertexArrayAttribFormat(0, 1, 4, GL4.GL_UNSIGNED_BYTE, true, Vertex.size());

And then I finish the render:

        // Reset state
        gl4.glDisableVertexArrayAttrib(0, 0);
        gl4.glDisableVertexArrayAttrib(0, 1);

我承认我以前从没用过dsa,我总是用GL3和普通的vbo、vao和ibo,绑定和解除绑定..

剔除已关闭。

那怎么了?

已解决,问题是我没有正确实施 dsa

glEnableVertexAttribArray(vao, 0);
glEnableVertexAttribArray(vao, 1);

// Setup the formats
glVertexArrayAttribFormat(vao, 0, 3, GL_FLOAT, GL_FALSE, 0);
glVertexArrayAttribFormat(vao, 1, 2, GL_FLOAT, GL_FALSE, 0);

// Setup the buffer sources
glVertexArrayVertexBuffer(vao, 0, buffers[0], 0, 0); // Note the 2nd argument here is a 'binding index', not the attribute index
glVertexArrayVertexBuffer(vao, 1, buffers[1], 0, 0);

// Link them up
glVertexArrayAttribBinding(vao, 0, 0); // Associate attrib 0 (first 0) with binding 0 (second 0).
glVertexArrayAttribBinding(vao, 1, 1);

加上 glVertexArrayElementBuffer 如果你有索引渲染