Hi...I need some advice regarding a few issues.
I'm a newbie at this, so bare with me...
I'm using opengl in c++. This is in my brother's Pc, a Duron 800 mhz with a Radeon 8500.
I've done a cloth demo a few days ago and started coding my first terrain demo. So far so good, everything's working fine, except performance.
I'm basically rendering a 128*128 vertex grid. So that gives me about 127*127*2 triangles=32258 triangles.
My problem is this. At first i was only using imediat mode just to make sure everything was loading fine, and i had my heightmap values correctly (i do scaling and repositioning when i create the vertex array).
Now , this is what i found out.
Not using any kind of frustum culling, just tossin all those 32k triangles to the card in imediate mode (with single texturing, no lighting), i was getting:
85 fps using GL_TRIANGLES
110 fps using GL_QUADS
So i thought that with vertex arrays things would go faster. I normally use interleaved arrays, but as i was going to use multitexture, i would have 2 texture coord arrays, therefore to make things easier and cleaner i made everything in separate arrays.
And as i never used indexed arrays, i wanted to try them, so...
So i created a VertexArray with all the coord of all the vertex in the heightmap, and a IndexArray with the indices for each triangle.
When rendering , i got ..45 fps..... :[
Then i tried CVA's, i now it's only good for multiple passes, but what the heck...i gained about 5 fps...
Then i started thinking..I'm sending all the data to the card each frame, right...SO what if i placed the data on vid mem?...
Since then i've read just about everything i could find about that, including several (and do mean SEVERAL) messages in many many foruns.
So i learned about VAR's and NV extensions..But i have a Radeon 8500, therefore i can not use VAR nor fences.
Finally i learned about GL_ATI_vertex_array_object and GL_ATI_element_array.
So i tried using them.I finally got them working. The problem is...the performance stays the same..... :[
So let me be more detailed, after i create the arrays i make:
<cpp>
arrayObjectID=glNewObjectBufferATI(sizeof(VertexArray2),VertexArray2,(GLenum)GL_STATIC_ATI);
if (!glIsObjectBufferATI(arrayObjectID )){
DB::write ("\n\n VERTEX ARRAY NOT PLACED IN VID MEM!!! \n\n");
};
IarrayObjectID=glNewObjectBufferATI(sizeof(IndexArray ),IndexArray ,(GLenum)GL_STATIC_ATI);
if (!glIsObjectBufferATI(IarrayObjectID )){
DB::write ("\n\n INDEX ARRAY NOT PLACED IN VID MEM!!! \n\n");
};
</cpp>
this DB::write is for my debug function, and for what i see, thee are no problems at this point.
during rendering i do:
<cpp>
glEnableClientState ((GLenum)GL_ELEMENT_ARRAY_ATI);
glEnableClientState(GL_VERTEX_ARRAY);
glArrayObjectATI(GL_VERTEX_ARRAY,3, GL_FLOAT, sizeof(Vertex3f), arrayObjectID,0 );
glArrayObjectATI((GLenum)GL_ELEMENT_ARRAY_ATI,1, GL_FLOAT, sizeof(unsigned int), IarrayObjectID, 0);
glDrawElements(GL_TRIANGLES,MAP_SIZE*MAP_SIZE*6,GL_UNSIGNED_INT, IndexArray);
/*or glDrawElementArrayATI(GL_TRIANGLES,MAP_SIZE*MAP_SIZE*6); if using index in ATI object buffer */
</cpp>
The thing is..when using glArrayObjectATI instead of the regular glVertexPointer , i get the same 45 fps. Isnt it suposed to use the values i stored before in vid card mem? therefore making it faster?
Now if i want to use the index values i placed in the object buffer, i have to use glDrawElementArrayATI.
Now there's another problem, because although i DO have the GL_ATI_element_array extension, its functions ARE NOT loaded..therefore i cannot use this command (i tried, it does not render anything...).
So, what i needed was...Am i using ATI object buffer correctly? If so, why is the performance the same as using the regular vertex array? If not....what's wrong? i error check the buffer and it says it's fine...
Is there any other way to render this in a fast way? I mean... 32 K tris is....should be...easy for a Radeon 8500...I know it's not a fillrate issue, cause I've rendered in 80*80 and it kept the 45 fps.
Also..what's wrong with the GL_ATI_element_array? It exists, i suport it (i write the GL_EXTENSIONS to the debug file and it's there, i check for it in the program, it's there, but the functions don't work), but the functions are not loaded.
<cpp>
if(strstr(glExtensions, "GL_ATI_element_array")){
DB::write("ATI Element Array Exists\n");
glElementPointerATI= (PFNGLELEMENTPOINTERATIPROC) wglGetProcAddress("glElementPointerATI");
glDrawElementArrayATI = (PFNGLDRAWELEMENTARRAYATIPROC) wglGetProcAddress("glDrawElementArrayATI");
glDrawRangeElementArrayATI = (PFNGLDRAWRANGEELEMENTARRAYATIPROC) wglGetProcAddress("glDrawRangeElementArrayATI");
if(!glElementPointerATI || !glDrawElementArrayATI || !glDrawRangeElementArrayATI);{
DB::write("\nError Activating ATI Element Array Functions !!!\n");
};
};
</cpp>
Anyone? Sorry for the big post and i hope you don't mind helping a newbie..
MorTyR
I'm a newbie at this, so bare with me...
I'm using opengl in c++. This is in my brother's Pc, a Duron 800 mhz with a Radeon 8500.
I've done a cloth demo a few days ago and started coding my first terrain demo. So far so good, everything's working fine, except performance.
I'm basically rendering a 128*128 vertex grid. So that gives me about 127*127*2 triangles=32258 triangles.
My problem is this. At first i was only using imediat mode just to make sure everything was loading fine, and i had my heightmap values correctly (i do scaling and repositioning when i create the vertex array).
Now , this is what i found out.
Not using any kind of frustum culling, just tossin all those 32k triangles to the card in imediate mode (with single texturing, no lighting), i was getting:
85 fps using GL_TRIANGLES
110 fps using GL_QUADS
So i thought that with vertex arrays things would go faster. I normally use interleaved arrays, but as i was going to use multitexture, i would have 2 texture coord arrays, therefore to make things easier and cleaner i made everything in separate arrays.
And as i never used indexed arrays, i wanted to try them, so...
So i created a VertexArray with all the coord of all the vertex in the heightmap, and a IndexArray with the indices for each triangle.
When rendering , i got ..45 fps..... :[
Then i tried CVA's, i now it's only good for multiple passes, but what the heck...i gained about 5 fps...
Then i started thinking..I'm sending all the data to the card each frame, right...SO what if i placed the data on vid mem?...
Since then i've read just about everything i could find about that, including several (and do mean SEVERAL) messages in many many foruns.
So i learned about VAR's and NV extensions..But i have a Radeon 8500, therefore i can not use VAR nor fences.
Finally i learned about GL_ATI_vertex_array_object and GL_ATI_element_array.
So i tried using them.I finally got them working. The problem is...the performance stays the same..... :[
So let me be more detailed, after i create the arrays i make:
<cpp>
arrayObjectID=glNewObjectBufferATI(sizeof(VertexArray2),VertexArray2,(GLenum)GL_STATIC_ATI);
if (!glIsObjectBufferATI(arrayObjectID )){
DB::write ("\n\n VERTEX ARRAY NOT PLACED IN VID MEM!!! \n\n");
};
IarrayObjectID=glNewObjectBufferATI(sizeof(IndexArray ),IndexArray ,(GLenum)GL_STATIC_ATI);
if (!glIsObjectBufferATI(IarrayObjectID )){
DB::write ("\n\n INDEX ARRAY NOT PLACED IN VID MEM!!! \n\n");
};
</cpp>
this DB::write is for my debug function, and for what i see, thee are no problems at this point.
during rendering i do:
<cpp>
glEnableClientState ((GLenum)GL_ELEMENT_ARRAY_ATI);
glEnableClientState(GL_VERTEX_ARRAY);
glArrayObjectATI(GL_VERTEX_ARRAY,3, GL_FLOAT, sizeof(Vertex3f), arrayObjectID,0 );
glArrayObjectATI((GLenum)GL_ELEMENT_ARRAY_ATI,1, GL_FLOAT, sizeof(unsigned int), IarrayObjectID, 0);
glDrawElements(GL_TRIANGLES,MAP_SIZE*MAP_SIZE*6,GL_UNSIGNED_INT, IndexArray);
/*or glDrawElementArrayATI(GL_TRIANGLES,MAP_SIZE*MAP_SIZE*6); if using index in ATI object buffer */
</cpp>
The thing is..when using glArrayObjectATI instead of the regular glVertexPointer , i get the same 45 fps. Isnt it suposed to use the values i stored before in vid card mem? therefore making it faster?
Now if i want to use the index values i placed in the object buffer, i have to use glDrawElementArrayATI.
Now there's another problem, because although i DO have the GL_ATI_element_array extension, its functions ARE NOT loaded..therefore i cannot use this command (i tried, it does not render anything...).
So, what i needed was...Am i using ATI object buffer correctly? If so, why is the performance the same as using the regular vertex array? If not....what's wrong? i error check the buffer and it says it's fine...
Is there any other way to render this in a fast way? I mean... 32 K tris is....should be...easy for a Radeon 8500...I know it's not a fillrate issue, cause I've rendered in 80*80 and it kept the 45 fps.
Also..what's wrong with the GL_ATI_element_array? It exists, i suport it (i write the GL_EXTENSIONS to the debug file and it's there, i check for it in the program, it's there, but the functions don't work), but the functions are not loaded.
<cpp>
if(strstr(glExtensions, "GL_ATI_element_array")){
DB::write("ATI Element Array Exists\n");
glElementPointerATI= (PFNGLELEMENTPOINTERATIPROC) wglGetProcAddress("glElementPointerATI");
glDrawElementArrayATI = (PFNGLDRAWELEMENTARRAYATIPROC) wglGetProcAddress("glDrawElementArrayATI");
glDrawRangeElementArrayATI = (PFNGLDRAWRANGEELEMENTARRAYATIPROC) wglGetProcAddress("glDrawRangeElementArrayATI");
if(!glElementPointerATI || !glDrawElementArrayATI || !glDrawRangeElementArrayATI);{
DB::write("\nError Activating ATI Element Array Functions !!!\n");
};
};
</cpp>
Anyone? Sorry for the big post and i hope you don't mind helping a newbie..
MorTyR