![](/img/trans.png)
[英]OpenGL ES 2.0 with iPhone - Vertex Shader uniform cannot be located
[英]Box2D + Opengl ES 2.0 (XCode, iPhone): Efficiently updating body vertex locations
如果您使用過Box2d,則熟悉設置b2Body->userData
屬性,該屬性隨后將用於更新渲染的形狀x,y坐標:
// Physics update:
int32 velocityIterations = 6;
int32 positionIterations = 2;
world->Step(timeDelta, velocityIterations, positionIterations);
for (b2Body* b = world->GetBodyList(); b; b = b->GetNext()) {
id obj = (id)b->GetUserData();
if ((obj != NULL)) {
Shape *s = (MyType*)obj;
CGPoint newCentre = CGPointMake(b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO);
[s drawAt:newCentre];
}
}
從概念上講,此數據流的渲染過程很簡單:創建一個Shape
類來表示每個drawAt
,添加一個drawAt
方法,該方法使用OpenGL ES 2.0渲染該drawAt
所有所需頂點(帶有屬性),並在其上重drawAt
該類坐標正在更改。
但是,我想通過將所有物體的頂點粘貼到一個頂點緩沖區中來優化渲染。 因此,我打算修改Shape
類,以在其頂點所在的緩沖區中包含偏移量,然后可以在drawAt
簡單地在緩沖區中更新這些drawAt
。
我意識到這些偏移的管理可能會使添加/刪除緩沖區變得一團糟,但是在我的應用程序中這種情況很少見,我想將渲染性能的每一個降低都擠出管道。
我的問題是:
- Opengl ES 2.0是否允許我將一組頂點指定為“形狀”,然后可以通過一個矩陣運算進行平移,還是必須以這種方式顯式地逐個更新頂點?
- 我必須創建一個唯一的可更新對象來分配給每個b2Body-> userData,還是有一些更有效的實踐?
- 是否最好在其自己的時間軸中更新圖形對象,從關聯的b2Body實例讀取位置或在上面列出的b2Body更新循環中立即更新圖形對象?
我將不勝感激,謝謝。
-1。 如果將緩沖區中的頂點設置為為實體創建夾具時所給的位置,則應該能夠做到這一點:
b2Vec2 pos = m_body->GetPosition();
float angle = m_body->GetAngle();
glPushMatrix();
glTranslatef( pos.x, pos.y, 0 );
glRotatef( angle * RADTODEG, 0, 0, 1 );//OpenGL uses degrees here
glDrawArrays(GL_WHATEVER, startIndex, vertexCount);
glPopMatrix();
有關更深入的討論,請參見http://www.iforce2d.net/b2dtut/drawing-objects 。
-2。 通常,您只想繪制可見的內容。 僅在確定應完全繪制此特定對象之后,才能執行上述方法。 上述問題中的代碼可能不必要地更新了永遠不會繪制的對象的位置。
-3。 嗯...我想我只是回答了。 我認為最好有一個游戲對象列表,每個對象都帶有指向b2Body *的指針,該指針在物理世界中代表它們,而不是引用Box2D的主體列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.