Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Since all the particles have the same texture,this will do the work:</p> <pre><code>float squarevData[12]={ -1,1, 1,1, -1,-1, 1,1, 1,-1, -1,-1, }; float squarevDataSteady[12]={ -1,1, 1,1, -1,-1, 1,1, 1,-1, -1,-1, }; class BatchRenderer { public: float* partVdata; float* partCdata; float* partTdata; bool isanydrawed; int counter1,counter2,counter3; int count; bool isz; bool textured; void Innit(int maxTextures,bool iszi) { isz=iszi; if(isz)partVdata=(float*)malloc(maxTextures*18*4); else partVdata=(float*)malloc(maxTextures*12*4); partCdata=(float*)malloc(maxTextures*24*4); partTdata=(float*)malloc(maxTextures*12*4); isanydrawed=false; } void Draw(float x,float y,float z,float scalex,float scaley,float angle,float r,float g,float b,float a) { isanydrawed=true; angle*=0.017453f; for(int c2=0;c2&lt;12;c2+=2) { float x=squarevData[c2]*scalex; float y=squarevData[c2+1]*scaley; float cos1=cos(angle); float sin1=sin(angle); squarevDataSteady[c2] = (cos1*x) - ( sin1*y); squarevDataSteady[c2+1] = (sin1*x) + ( cos1*y); } partVdata[counter1++]=x+squarevDataSteady[0]; partVdata[counter1++]=y+squarevDataSteady[1]; if(isz)partVdata[counter1++]=z; partCdata[counter2++]=r; partCdata[counter2++]=g; partCdata[counter2++]=b; partCdata[counter2++]=a; partTdata[counter3++]=0; partTdata[counter3++]=1; partVdata[counter1++]=x+squarevDataSteady[2]; partVdata[counter1++]=y+squarevDataSteady[3]; if(isz)partVdata[counter1++]=z; partCdata[counter2++]=r; partCdata[counter2++]=g; partCdata[counter2++]=b; partCdata[counter2++]=a; partTdata[counter3++]=1; partTdata[counter3++]=1; partVdata[counter1++]=x+squarevDataSteady[4]; partVdata[counter1++]=y+squarevDataSteady[5]; if(isz)partVdata[counter1++]=z; partCdata[counter2++]=r; partCdata[counter2++]=g; partCdata[counter2++]=b; partCdata[counter2++]=a; partTdata[counter3++]=0; partTdata[counter3++]=0; partVdata[counter1++]=x+squarevDataSteady[6]; partVdata[counter1++]=y+squarevDataSteady[7]; if(isz)partVdata[counter1++]=z; partCdata[counter2++]=r; partCdata[counter2++]=g; partCdata[counter2++]=b; partCdata[counter2++]=a; partTdata[counter3++]=1; partTdata[counter3++]=1; partVdata[counter1++]=x+squarevDataSteady[8]; partVdata[counter1++]=y+squarevDataSteady[9]; if(isz)partVdata[counter1++]=z; partCdata[counter2++]=r; partCdata[counter2++]=g; partCdata[counter2++]=b; partCdata[counter2++]=a; partTdata[counter3++]=1; partTdata[counter3++]=0; partVdata[counter1++]=x+squarevDataSteady[10]; partVdata[counter1++]=y+squarevDataSteady[11]; if(isz)partVdata[counter1++]=z; partCdata[counter2++]=r; partCdata[counter2++]=g; partCdata[counter2++]=b; partCdata[counter2++]=a; partTdata[counter3++]=0; partTdata[counter3++]=0; count++; } void RenderStart() { counter1=counter2=count=counter3=0; } void RenderStop(int textureid) { if(!isanydrawed)return; glEnable(GL_TEXTURE_2D); glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); glBindTexture(GL_TEXTURE_2D, textureid); glTexCoordPointer(2, GL_FLOAT, 0, partTdata); glColorPointer(4, GL_FLOAT, 0,partCdata ); if(isz)glVertexPointer(3, GL_FLOAT, 0, partVdata); else glVertexPointer(2, GL_FLOAT, 0, partVdata); glDrawArrays(GL_TRIANGLES, 0, count*6); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); isanydrawed=false; } }; </code></pre> <p><strong>Your code:</strong></p> <pre><code>BatchRenderer* br=new BatchRenderer(MAX_TEXTURES_NUM,true);//true since you are drawing 3d void onParticlesRender() { br-&gt;RenderStart(); for(int c=0;c&lt;PARTICLES_SIZE;c++) { br-&gt;Draw(p[c].pos.x,p[c].pos.y,p[c].pos.z,p[c].scale.x,p[c].scale.y,p[c].angle,p[c].r,p[c].g,p[c].b,p[c].a); } br-&gt;RenderStop(yourTextureID); } </code></pre> <p>I cant test the code right now so if its working without a problem pls let me know</p> <p>VBO's is useless in batch render cause you are uploading to the gpu new vertex data in every frame.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload