OpenGL glDrawArrays不绘制数组

时间:2019-01-30 02:35:46

标签: java opengl lwjgl

由于某种原因,我正在查看this tutorial并正在查看代码,因为它们的数组会绘制到屏幕上(我对其进行了测试),但是经过稍微编辑的代码无法在屏幕上绘制任何内容。

这是GitHub:https://github.com/BigBadE/GLHelp

以下是相关代码:

这被称为绘制所有内容:

<html>
<body>
    <div id="toremove">
        ...some javascript here....
    </div>
</body>
</html>
<script src="jquery-3.3.1.min.js"></script>
<script>
    $('#toremove').html('');  // option 1
    $('#toremove').attr('style', 'display:none')  // option 2
    $('#toremove').attr('style', 'visibility:hidden') // option 3
    $('#toremove').remove();  // option 4
    $('#toremove').hide();   // option 5
</script>

刷新方法:

private void drawTextureRegion(float x1, float y1, float x2, float y2, float s1, float t1, float s2, float t2, Color c) {
    if (vertices.remaining() < 8*6) {
        /* We need more space in the buffer, so flush it */
        flush();
    }

    float r = c.getRed();
    float g = c.getGreen();
    float b = c.getBlue();
    float a = c.getAlpha();

    vertices.put(x1).put(y1).put(r).put(g).put(b).put(a).put(s1).put(t1);
    vertices.put(x1).put(y2).put(r).put(g).put(b).put(a).put(s1).put(t2);
    vertices.put(x2).put(y2).put(r).put(g).put(b).put(a).put(s2).put(t2);

    vertices.put(x1).put(y1).put(r).put(g).put(b).put(a).put(s1).put(t1);
    vertices.put(x2).put(y2).put(r).put(g).put(b).put(a).put(s2).put(t2);
    vertices.put(x2).put(y1).put(r).put(g).put(b).put(a).put(s2).put(t1);

    numVertices += 6;

    flush();
}

这是我设置VAO,VBO和着色器的方式:

private void flush() {
    if (numVertices > 0) {
        vertices.flip();

        if (vao != null) {
            vao.bind();
        } else {
            vbo.bind(GL_ARRAY_BUFFER);
            specifyVertexAttributes();
        }

        program.use();

        int uniTex = program.getUniformLocation("texImage");
        program.setUniform(uniTex, 0);

        /* Upload the new vertex data */
        vbo.bind(GL_ARRAY_BUFFER);
        vbo.uploadSubData(GL_ARRAY_BUFFER, 0, vertices);

        /* Draw batch */
        glDrawArrays(GL_TRIANGLES, 0, numVertices);

        /* Clear vertex data for next batch */
        vertices.clear();
        numVertices = 0;
    }
}

关于OpenGL的一些一般问题:

我应该在每个帧上绑定纹理,还是在屏幕上/屏幕上对其进行绑定/取消绑定?

我应该为所有内容使用一个VAO,还是为相同纹理使用一个VAO?

在本教程中,我的代码从字面上看都是一样的,唯一的区别是我将纹理存储在数组中并在每帧绘制它们,而不是在其他任何地方都没有使用draw方法调用每帧。在此系统上以及其他方面进行改进时,对于我的项目而言,这是一个很好的渲染引擎。

研究它,应该在每帧中绑定纹理,并且最好在相同的帧中使用VAI。

0 个答案:

没有答案