我有一個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到屏幕的不同部分?
我明白我的期望結果是不是完全清楚。如果您需要我詳細說明任何事情,請告訴我,我會很樂意盡我所能來更好地解釋。 謝謝。
「然而,通過切割spritesheet到不同的紋理每一幀這一點。 「那麼它實際上並不是從紋理圖冊中拉出東西,是嗎? –
好了,textureatlas.png進來了,幀出來了。不過,這是我現在廢棄的舊方法。上面描述了我試圖設計的新方法。 –
您可能想要消除您對「框架」一詞的使用。大多數人理解這意味着一個完整的場景渲染(例如:幀每秒等)。你似乎描述的通常會被稱爲精靈(因此spritesheet)。 – ryanm