由于某种原因,我正在查看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。