【发布时间】:2019-02-21 19:02:54
【问题描述】:
我正在尝试绘制一个带纹理的四边形。由于它是四边形,我想使用glDrawElements 和 VEO,但这需要ShortBuffer 而不是FloatBuffer。我尝试更改我的代码,但现在没有任何效果。
旧代码:
上传和绘图:
public void flush() {
if (numVertices > 0) {
vertices.flip();
if (vao != null) {
vao.bind();
} else {
vbo.bind(GL_ARRAY_BUFFER);
specifyVertexAttributes();
}
program.use();
/* 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;
}
}
将纹理添加到缓冲区:
if (vertices.remaining() < 7 * 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;
更新代码: 上传和绘图:
public void flush() {
if (numVertices > 0) {
vertices.flip();
if (vao != null) {
vao.bind();
} else {
vbo.bind(GL_ARRAY_BUFFER);
specifyVertexAttributes();
}
program.use();
/* 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;
}
}
将纹理添加到缓冲区:
if (vertices.remaining() < 7 * 6) {
/* We need more space in the buffer, so flush it */
flush();
}
short r = (short) c.getRed();
short g = (short) c.getGreen();
short b = (short) c.getBlue();
short a = (short) c.getAlpha();
short sx1 = (short) Math.round(x1), sx2 = (short) Math.round(x2), sy1 = (short) Math.round(y1), sy2 = (short) Math.round(y2), ss1 = (short) Math.round(s1), ss2 = (short) Math.round(s2), st1 = (short) Math.round(t1), st2 = (short) Math.round(t2);
vertices.put(sx1).put(sy1).put(r).put(g).put(b).put(a).put(ss1).put(st1);
vertices.put(sx1).put(sy2).put(r).put(g).put(b).put(a).put(ss1).put(st2);
vertices.put(sx2).put(sy2).put(r).put(g).put(b).put(a).put(ss2).put(st2);
vertices.put(sx1).put(sy1).put(r).put(g).put(b).put(a).put(ss1).put(st1);
vertices.put(sx2).put(sy2).put(r).put(g).put(b).put(a).put(ss2).put(st2);
vertices.put(sx2).put(sy1).put(r).put(g).put(b).put(a).put(ss2).put(st1);
numVertices += 6;
除了在我的uploadSubData 方法中将FloatBuffer 替换为ShortBuffer 之外,代码没有其他更改。 VBO 类只是 OpenGL 方法的包装,所以 uploadSubData 是 glUploadSubData,等等...
我错过了什么?为什么glDrawArrays 不画ShortBuffer?
如果我遗漏了什么,请告诉我,我没有太多时间来写这篇文章。
【问题讨论】:
-
我之前在尝试使用 IntBuffers 而不是 FloatBuffers 时遇到过类似的问题。我所做的一切似乎都不起作用,所以最后我只是继续使用 FloatBuffers。性能影响应该不会太大,所以我认为你也可以使用 FloatBuffers。
-
由于它是四边形,我想使用 glDrawElements 和 VEO,但这需要 ShortBuffer 而不是 FloatBuffer。 不,使用 glDrawElements 不需要您的 顶点数据 是一个 ShortBuffer。它要求 index_/_element 数据是整数类型(例如短),但您的顶点数据当然仍然可以保持浮点类型。除此之外,您似乎仍在使用 glDrawArrays 而不是 glDrawElements。
-
" glDrawElements 和一个 VEO,但这需要一个 ShortBuffer 而不是 FloatBuffer"。这不是真的。
GL_ARRAY_BUFFER保持浮动缓冲区(或您之前使用的任何缓冲区。但您需要一个额外的GL_ELEMENT_ARRAY_BUFFER来存储索引信息(int、short 等)。 -
这不是真的,每当我将 GL_FLOAT 传递给 glDrawElements 时,它都会引发错误。它只允许短裤、字节或整数。我使用 glDrawArrays 而不是 glDrawElements 因为它接受短裤,这是一个很好的第一步,如果我能得到 glDrawArrays,那么我会将其更改为 glDrawElements。