Results 1 to 3 of 3

Thread: Help with Vertex Arrays, CVA'S, GL_ATI_vertex_array_object

  1. #1
    Guest

    Help with Vertex Arrays, CVA'S, GL_ATI_vertex_array_object

    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(VertexAr ray2),VertexArray2,(GLenum)GL_STATIC_ATI);

    if (!glIsObjectBufferATI(arrayObjectID )){
    DB::write ("\n\n VERTEX ARRAY NOT PLACED IN VID MEM!!! \n\n");
    };

    IarrayObjectID=glNewObjectBufferATI(sizeof(IndexAr ray ),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_SI ZE*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 &#0124; &#0124; !glDrawElementArrayATI &#0124; &#0124; !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

  2. #2
    Guest

    Re: Help with Vertex Arrays, CVA'S, GL_ATI_vertex_array_object

    Ok..forget it..i fixed it.....

    I was trying diferent things, and remembered to place the textcoord in vid mem too.

    So i did, and ..voilá..I'm getting 60-200 fps depending on the geometry I'm looking at....

    Incredibly enough, glDrawElementArrayATI is working, even though after i load it, i test it, and it doesn't exist..oh welll

    So...Everything was down to a crawl just beacause of the text coord....

    weird....

    Anyway..Extensions rock...I only wish somebody makes a extension to put data on vid mem that works on ALL cards for a change...

  3. #3
    Guest

    Re: Help with Vertex Arrays, CVA'S, GL_ATI_vertex_array_object

    Ok..forget it..i fixed it.....

    I was trying diferent things, and remembered to place the textcoord in vid mem too.

    So i did, and ..voilá..I'm getting 60-200 fps depending on the geometry I'm looking at....

    Incredibly enough, glDrawElementArrayATI is working, even though after i load it, i test it, and it doesn't exist..oh welll

    So...Everything was down to a crawl just beacause of the text coord....

    weird....

    Anyway..Extensions rock...I only wish somebody makes a extension to put data on vid mem that works on ALL cards for a change...

    Also, glDrawElementArrayATI is MUCH faster than glDrawElements under lower poly conditions...in my case, its TWICE as fast...Worse case cenary,under high poly scenes, its as fast as your regular glDrawElements.

Similar Threads

  1. arrays of arrays as vertex output/fragment input
    By tsojtsoj in forum OpenGL: Basic Coding
    Replies: 4
    Last Post: 05-17-2018, 08:02 PM
  2. Vertex Arrays, interleaved arrays, mouseMove func
    By Nibirue in forum OpenGL: Basic Coding
    Replies: 1
    Last Post: 02-13-2012, 11:17 AM
  3. Big problem show arrays with vertex arrays
    By Rondey in forum OpenGL: Basic Coding
    Replies: 13
    Last Post: 03-15-2009, 10:09 AM
  4. Vertex Arrays: Interleaved or seperated arrays?
    By Jan in forum OpenGL: Advanced Coding
    Replies: 16
    Last Post: 06-21-2005, 05:25 AM
  5. Vertex arrays and ... texture arrays
    By cix>foo in forum OpenGL: Advanced Coding
    Replies: 21
    Last Post: 06-25-2000, 08:15 AM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Proudly hosted by Digital Ocean