Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <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>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

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