在我的OpenGL ES Android游戏中,我试图根据它们的Z值(即在Z平面中的位置)按照顺序绘制形状。这意味着先绘制最小的最远的形状(纹理),然后绘制更大的图形。我已经将形状属性存储在一个数组列表中,并且在绘制和更新时我使用了一个迭代器。让我们说,这是它的Z值的ArrayList的(只是一个例子)抽奖OpenGL - 较大的对象超过较小
的ArrayList arraylistBricks
obj (0) ... z = -20
obj (1) ... z = -37
obj (2) ... z = -31
obj (3) -...z = -20
我排序使用Collections.sort(..)对每一帧和后此ArrayList的排序列表看起来是这样的
obj (0) ... z = -37
obj (1) ... z = -31
obj (2) ... z = -20
obj (3) -...z = -20
即 - 最小的形状首先在列表中,并首先被绘制。我可以看到arraylist是真的排序,但不知何故发生。我想要的是较小的形状应该落后于较大的形状。 GPU是否具有某种绘图程序的algortitm?我刚刚从skia迁移到了opengl,并对此感到惊讶。
我在这里错过了什么?我怎么能解决这个问题?
private void drawShape() {
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vboDataListLevelSprites.get(iName).getBuff_id_vertices());
GLES20.glEnableVertexAttribArray(mPositionHandle);
GLES20.glVertexAttribPointer(mPositionHandle, 3, GLES20.GL_FLOAT, false, 0, 0);
for (int i = 0; i < BrickProperties.get_buff_id_uvs().length; i++) {
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, BrickProperties.get_buff_id_uvs()[i]);
GLES20.glEnableVertexAttribArray(mTextureCoordinateHandle);
GLES20.glVertexAttribPointer(mTextureCoordinateHandle, 2, GLES20.GL_FLOAT, false, 0, 0);
for (Iterator<BrickProperties> shapeIterator = arrayListBricks.iterator(); shapeIterator.hasNext();) {
BrickProperties bp = shapeIterator.next();
int buffIndexVal = bp.get_status_diff();
if (buffIndexVal == i) {
Matrix.setIdentityM(mModelMatrix, 0);
Matrix.translateM(mModelMatrix, 0, bp.getTranslateData()[0], bp.getTranslateData()[1], bp.getTranslateData()[2]);
if (bp.get_status() == 0) {
Matrix.rotateM(mModelMatrix, 0, bp.getAngleInDegrees(), 0, 1, 0);
}
render();
}
}
}
}
的渲染方法
private void render() {
Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);
GLES20.glUniformMatrix4fv(mMVMatrixHandle, 1, false, mMVPMatrix, 0);
Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0);
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMVPMatrix, 0);
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 6);
}
更新(片断)
public void update() {
Collections.sort(arrayListBricks, new Comparator<BrickProperties>() {
@Override
public int compare(BrickProperties bp2, BrickProperties bp1)
{
int result = Float.compare(bp1.getTranslateData()[2], bp2.getTranslateData()[2]);
return result;
}
});
Collections.reverse(arrayListBricks);
....
我试过,但它不工作。用** GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT)清除缓冲区; ** – java
@java它是否给出任何错误? – Reaper
完全没有错误 – java