2011-10-10 20 views
5

Używam ParticleSystem z PointSprites (inspirowane przez źródło Cocos2D). Ale zastanawiam się, jak odbudować funkcjonalność dla OpenGL ES 2.0GLSL PointSprite dla układu cząsteczek

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); 

te generują BAD_ACCESS przy użyciu kontekstu OpenGL ES 2.0. Czy powinienem po prostu przejść z 2 TRÓJKĄTAMI na PointSprite? Ale to prawdopodobnie nie jest zbyt wydajne (obciążenie dla dodatkowych wierzchołków).

EDIT: Tak, mój nowy problem z proponowanego rozwiązania z: https://gamedev.stackexchange.com/questions/11095/opengl-es-2-0-point-sprites-size/15528#15528

możliwość przejść wiele różnych rozmiarów w wywołaniu wsadowym. Pomyślałem o użyciu Atrybutu zamiast Munduru, ale wtedy musiałbym przekazać zawsze PointSize do moich shaderów - nawet jeśli nie rysuję GL_POINTS. Więc może drugi shader (tylko shader dla GL_POINTS) ?! Nie jestem świadomy kosztów związanych z przełączaniem shaderów na każdą klatkę w procedurze rysowania (ponieważ w przypadku użycia systemu cząsteczek, chcę naturalnie renderować regularne GL_TRIANGLES bez rozmiaru punktu) ... Jakieś pomysły na ten temat?

+1

To powinno być to, czego szukasz: http://gamedev.stackexchange.com/questions/11095/opengl-es-2-0-point-sprites-size/15528#15528 – rgngl

+0

Dziękujemy! Ten link jest bardzo przydatny. Tak więc, moim jedynym problemem z tym rozwiązaniem jest możliwość zrobienia czegoś podobnego do "glPointSizePointerOES" na GLSL (na łączu sugeruje się użycie jednolitego dla rozmiaru punktu - tak wiele różnych punktów o różnych rozmiarach nie jest losowanych w wywołaniu wsadowym z glDrawArrays). Pomyślałem o użyciu Atrybutu zamiast Munduru, ale wtedy musiałbym przekazać zawsze PointSize do moich shaderów - nawet jeśli nie rysuję GL_POINTS. Więc może drugi shader (tylko shader dla GL_POINTS) ?! Jakieś pomysły na ten temat? – Constantin

Odpowiedz

0

Więc robi nic tu już skomentował tutaj jest to, czego potrzebujesz: https://gamedev.stackexchange.com/questions/11095/opengl-es-2-0-point-sprites-size/15528#15528

i dla których podejście do pracy, mogę też powiedzieć, aby korzystać z różnych shaderów dla różnych typów kanału alfa w aplikacji lub po prostu inny uniform boolowski w module cieniującym i włączanie i wyłączanie zmieniania gl_PointSize za pomocą kodu modułu cieniującego. Zazwyczaj zależy to od Ciebie. Trzeba pamiętać o tym, że zmiana programu cieniującego jest jedną z najbardziej kosztownych operacji, więc w takim przypadku wykonanie tego samego typu obiektów w grupie będzie lepsze. Nie jestem do końca pewien, czy użycie instrukcji if w kodzie shadera będzie miało ogromny wpływ na wydajność.