2011-10-10 68 views
5

我正在使用帶有PointSprites的粒子系統(受Cocos2D Source的啓發)。但我不知道如何重建功能的OpenGL ES 2.0的用於粒子系統的GLSL PointSprite

glEnable(GL_POINT_SPRITE_OES); 
glEnableClientState(GL_POINT_SIZE_ARRAY_OES); 
glPointSizePointerOES(GL_FLOAT,sizeof(PointSprite),(GLvoid*) (sizeof(GL_FLOAT)*2)); 
glDisableClientState(GL_POINT_SIZE_ARRAY_OES); 
glDisable(GL_POINT_SPRITE_OES); 

這些使用OpenGL ES 2.0的範圍內時產生BAD_ACCESS。 我應該簡單地使用每個PointSprite 2個三角?但這可能不是非常有效(額外頂點的開銷)。

編輯: 所以,我從建議的解決方案新的問題: https://gamedev.stackexchange.com/questions/11095/opengl-es-2-0-point-sprites-size/15528#15528

是要通過許多不同的尺寸在批調用的可能性。我想使用一個屬性而不是一個統一的,但是我需要總是將一個PointSize傳遞給我的着色器 - 即使我不繪製GL_POINTS。那麼,也許是第二個着色器(僅用於GL_POINTS的着色器)?我並不知道在繪製例程中每幀切換着色器的開銷(因爲如果使用了粒子系統,我自然也需要渲染常規的GL_TRIANGLES而不使用pointSize)......對此有何看法?

+1

這應該是你在找什麼: http://gamedev.stackexchange.com/questions/11095/opengl-es-2-0-point-sprites-size/15528#15528 – rgngl

+0

謝謝!該鏈接非常有用。所以,這個解決方案唯一的問題是可以做類似於GLSL上的「glPointSizePointerOES」的事情(在鏈接上建議使用統一的點大小 - 在批次調用中不能繪製大小不同的不同點與glDrawArrays)。我想使用一個屬性而不是一個統一的,但是我需要總是將一個PointSize傳遞給我的着色器 - 即使我不繪製GL_POINTS。那麼,也許是第二個着色器(僅用於GL_POINTS的着色器)?對此有何想法? – Constantin

回答

0

所以在這裏做的事情,因爲我已經在這裏評論是你所需要的:https://gamedev.stackexchange.com/questions/11095/opengl-es-2-0-point-sprites-size/15528#15528

而對於哪種方法去,我可以告訴你,在你的應用程序,或者只是使用不同類型的可繪製不同的着色器在着色器中使用另一種布爾均勻分佈,並啓用和禁用通過着色器代碼更改gl_PointSize。這通常取決於你。你需要記住的是改變着色器程序是時間代價最高的操作之一,因此在同一批次中繪製同一類型的對象在這種情況下會更好。我不確定在着色器代碼中使用if語句是否會對性能產生巨大影響。