我正在使用LWJGL OpenGL包装器在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);
}
现在我的主要问题是,你如何将它分成2个三角形而不是1个四边形? 还有一个侧面问题:2D游戏真的很重要吗?它会稍微改变一下吗?
答案 0 :(得分:4)
只需更改
glDrawArrays(GL_QUADS, 0, 4);
到
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
并添加略有不同的顶点缓冲区
vertexBuffer.put(new float[]{
1.0, 1.0
-1.0, 1.0
1.0,-1.0
-1.0,-1.0
});
这代表两个三角形,两个“点”是相同的,所以我们只有四个“点”。
就像:
x3__x4
| \ |
| \ |
x1__x2