2012-06-15 24 views
0

我有一個iOS 2D渲染引擎,能夠從spritesheet /紋理圖集渲染單個幀。但是,它通過將每個幀的spritesheet切割成不同的紋理來實現這一點。正如你所猜測的那樣,當動畫時,即使每幀僅繪製一個實體,因爲每次調用glBindTexture時,該動畫的速度都很慢。批處理渲染和我應該如何去做

所以我改變了它,以便它保持spritesheet在一塊,並在運行時簡單地將spritesheet紋理剪輯到所需的幀。這裏是一段我打算輕微修改的示例代碼,但具有我期待的一般預期效果。

- (void) drawInRect:(CGRect)dest withClip:(CGRect)src withRotation:(CGFloat)rotation { 
GLfloat 
    gx0 = src.origin.x/_width, gx1 = (src.origin.x+src.size.width)/_width, 
    gy0 = src.origin.y/_height, gy1 = (src.origin.y+src.size.height)/_height; 
GLfloat  coordinates[] = { 
    gx0, gy1, 
    gx1, gy1, 
    gx0, gy0, 
    gx1, gy0 
}; 
GLfloat vertices[] = { 
    -dest.size.width/2,  -dest.size.height/2, 0.0, 
    dest.size.width/2,  -dest.size.height/2, 0.0, 
    -dest.size.width/2,  dest.size.height/2,  0.0, 
    dest.size.width/2,  dest.size.height/2,  0.0 
}; 

glBindTexture(GL_TEXTURE_2D, _name); 
glVertexPointer(3, GL_FLOAT, 0, vertices); 
glTexCoordPointer(2, GL_FLOAT, 0, coordinates); 

glPushMatrix(); 
glTranslatef(dest.origin.x+dest.size.width/2, dest.origin.y+dest.size.height/2, 0); 
glRotatef(rotation, 0, 0, 1); //in degrees, about screen origin. 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
glPopMatrix(); 
} 

但是我想編輯此,這樣我可以與多個不同的修剪矩形(用於場合,如想要繪製從一個spritesheet多個項目)加載的陣列。然而,根據我的理解,如果我只是將更多的三角形加載到頂點數組中並開始將更多直角座標粘貼到座標數組中,不會在紋理綁定的不同三角形之間的空間中產生一些令人討厭的紋理拉伸至。 如果是的話,甚至有一種方法可以批量渲染多個幀從同一個spritesheet到屏幕的不同部分?

我明白我的期望結果是不是完全清楚。如果您需要我詳細說明任何事情,請告訴我,我會很樂意盡我所能來更好地解釋。 謝謝。

+0

「然而,通過切割spritesheet到不同的紋理每一幀這一點。 「那麼它實際上並不是從紋理圖冊中拉出東西,是嗎? –

+0

好了,textureatlas.png進來了,幀出來了。不過,這是我現在廢棄的舊方法。上面描述了我試圖設計的新方法。 –

+0

您可能想要消除您對「框架」一詞的使用。大多數人理解這意味着一個完整的場景渲染(例如:幀每秒等)。你似乎描述的通常會被稱爲精靈(因此spritesheet)。 – ryanm

回答

0

具有批量渲染的對象是儘可能多地獲取儘可能多的數據到opengl中儘可能少的調用。使用這個作爲你的指導原則,可以採取的步驟來提高配料效率:

  1. 使用spritesheet降低質地結合 - 質感結合是比較昂貴的,所以這是非常重要的,以儘量減少他們。
  2. 不要一次畫出你的精靈 - 將幾何圖形批量放到一個大的VBO中並一次畫出。這意味着:
    • 您將無法使用GL_TRIANGLE_STRIP,因爲您的精靈不會全部在屏幕上連續顯示,請嘗試使用GL_TRIANGLES呈現索引緩衝區。
    • ,你將無法使用glTranslate,等等 - 你必須自己做數學
+0

謝謝。我認爲切換到GL_TRIANGLES是我查詢的關鍵。然而,例如我的玩家角色自己擁有一張spritesheet,這絕對是完整的。 1024×1024。這並不意味着我只能自己渲染她。由於我無法真正地將她的表與其他任何其他表進行concatonate,因爲有些設備不支持超過此大小的紋理,因此重新綁定紋理不可避免地繪製不在主字符spritesheet上的任何東西?我敢肯定,我可以創建VBO大到足以覆蓋地球,但現在...... –

+0

我必須從另一個spritesheet中獲得某些東西,我不得不採用綁定新紋理的性能命中。這是不可避免的開銷還是我錯過了一個竅門? –

+0

基本上是的,如果你不得不從另一張紙上畫東西,那麼就沒有辦法避免這種打擊。試圖在綁定時儘可能從給定的表中繪製儘可能多的東西。 – ryanm