[英]OpenGL E.S 2.0 How to keep depth buffer intact when serial rendering to two textures in LibGDX?
[英]Optimizing alternating textures in libgdx opengl
我正在使用libgdx制作游戲,並且在繪制成千上萬個這樣的紋理時,屏幕上的每個字符都由兩個紋理(身體和頭部圖像)組成,渲染調用的次數非常高,因為紋理需要保持重新綁定的交替性繪制紋理。 如果我先繪制所有頭部,那么我僅會進行2次渲染調用,並且幀速率非常好。 但是,這樣做會使z順序錯誤,當字符彼此經過時很容易看到。 無論如何,有沒有優化或緩存這些紋理的方法,以便可以正確的順序繪制它們並最小化opengl綁定?
使用紋理填充減少opengl重新綁定的數量。 見:
您應該為對象保留z索引,並使用Comparator類按所需順序對它們進行排序,然后將它們批量繪制
讓我們假設您有一個DisplayObject類,該實例是您的可視對象,該對象具有getZ()函數以檢索對象的z索引,將顯示對象存儲在數組中
Array<DisplayObject> displayObjects
declare a comparator one time
comparator = new Comparator<DisplayObject>() {
@Override
public int compare(DisplayObject object1, DisplayObject object2) {
return (int) Math.signum(object1.getZ() -
object2.getZ());
}
};
...
在渲染函數中,使用比較器對對象進行排序
displayObjects.sort(comparator);
繪制所有對象
for(DisplayObject displayObject : displayObjects) {
batch.draw(displayObject.body, displayObject.getX(), displayObject.getY());
batch.draw(displayObject.head, displayObject.getX(), displayObject.getY());
}
有關Comparator的更多信息,您可以打開此鏈接
https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html
您需要拆分循環:
for(DisplayObject displayObject : displayObjects) {
batch.draw(displayObject.body, displayObject.getX(), displayObject.getY());
batch.draw(displayObject.head, displayObject.getX(), displayObject.getY());
}
如果頭部和身體放置在不同的TextureAtlasses上,則為2個循環,因為每個Texture切換都調用flush():
for(DisplayObject displayObject : displayObjects) {
batch.draw(displayObject.body, displayObject.getX(), displayObject.getY());
}
for(DisplayObject displayObject : displayObjects) {
batch.draw(displayObject.head, displayObject.getX(), displayObject.getY());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.