开发者

iOS / GL bug, Problem generating index array

this is annoying the hell out of me.

I have restructured some ugly code which generates a couple of index arrays. as far as I can see everything should be identical. I have logged the elements of the arrays in both cases; the same size arrays are being generated, and populated with the same data. The same buffer IDs are getting created... yet the old code works and the new code fails.

please can someone help?

- (void) setupIndexArray_
{
    NSLog(@"OLD (works)");

    // shape with centerpoint (4 triangles)
    #define INDICES_FOR_SHAPE 10
    // fill out indices for the first button
    static GLushort shapeIndices[INDICES_FOR_SHAPE * NUM_QUADS] = {2, 2, 0, 1, 4,   4, 0, 3, 2, 2};   
    indexCount_background = INDICES_FOR_SHAPE * NUM_QUADS;

    // make the remaining 11 buttons the same pattern
    for (int j=INDICES_FOR_SHAPE; j < indexCount_background; j++)
        shapeIndices[j] = shapeIndices[j-INDICES_FOR_SHAPE] + VERTICES_FOR_BUTTON;

    glGenBuffers( 1, & indexBufID_btnBg );
    glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, indexBufID_btnBg ); 
    glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof( shapeIndices ), shapeIndices, GL_STATIC_DRAW );  

    NSLog(@"BufID: %d", (int) indexBufID_btnBg);
    NSLog(@"writing %d bytes... ", (int) sizeof( shapeIndices ));
    for (int j=0; j < sizeof( shapeIndices ) / sizeof( GLushort ); j++)
        printf( "%d,", shapeIndices[j] );

    printf("\n");

    //for (int j=0; j < indexCount_background; j++)
    //    printf("%d,",shapeIndices[j]);

    // - - - 

    // text rect (2 triangles)
    #define INDICES_FOR_TEXTRECT  6
    GLushort textIndices[INDICES_FOR_TEXTRECT * NUM_QUADS] = {5, 5, 8,   6, 7, 7};  
    indexCount_text = INDICES_FOR_TEXTRECT * NUM_QUADS;
    // glGenBuffers( 1, & indexBufID_btnText );

    // make the remaining 11 buttons the same pattern
    for (int j=INDICES_FOR_TEXTRECT; j < indexCount_text; j++)
        textIndices[j] = textIndices[j-INDICES_FOR_TEXTRECT] + VERTICES_FOR_BUTTON;

    glGenBuffers( 1, & indexBufID_btnText );
    glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, indexBufID_btnText ); 
    glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof( textIndices ), textIndices, GL_STATIC_DRAW );  

    NSLog(@"BufID: %d", (int) indexBufID_btnText);
    NSLog(@"writing %d bytes... ", (int) sizeof( textIndices ));
    for (int j=0; j < sizeof( textIndices ) / sizeof( GLushort ); j++)
        printf( "%d,", textIndices[j] );

}


// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

// make triangle-shapes for each button-background-shape 
// and text-quad from vertex-array
- (void) setupIndexArray
{
    NSLog(@"NEW (fails)");

    // SHAPE
    static GLushort shapeIndexPattern [] = {2, 2, 0, 1, 4,   4, 0, 3, 2, 2};   

    [self createIABufForPattern: shapeIndexPattern
                          bytes: sizeof(shapeIndexPattern)
                vertexArrayStep: VERTICES_FOR_BUTTON
                   makingClones: 12
                 returningBufID: & indexBufID_btnBg ];


    // TEXT
    static GLushort textIndexPattern [] = {5, 5, 8,   6, 7, 7};  

    [self createIABufForPattern: textIndexPattern
                          bytes: sizeof(textIndexPattern)
                vertexArrayStep: VERTICES_FOR_BUTTON
                   makingClones: 12
                 returningBufID: & indexBufID_btnText ]开发者_JS百科;
}

- (void) createIABufForPattern: (GLushort *) pattern
    bytes: (size_t) bytesPattern
    vertexArrayStep: (int) STEP
    makingClones: (int) copies
    returningBufID: (GLuint *) pBufID
{

    size_t eltsPattern = bytesPattern / sizeof( GLushort );

    size_t eltsTotal = eltsPattern * copies;
    size_t bytesTotal = bytesPattern * copies;

    GLushort * array = (GLushort *) malloc( bytesTotal );

    // copy pattern into big array
    memcpy( (void *) array, 
           ( const void *) pattern, 
           bytesPattern );

    // make the remaining items follow the same pattern
    for (int j = eltsPattern; j < eltsTotal; j++)
        array[j] = array[ j - eltsPattern ] + STEP;


    GLuint bufID;
    glGenBuffers( 1, & bufID );
    glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, bufID ); 
    glBufferData( GL_ELEMENT_ARRAY_BUFFER, bytesTotal, array, GL_STATIC_DRAW ); 

    NSLog(@"BufID: %d", (int) bufID);
    NSLog(@"writing %d bytes... ", (int) bytesTotal);
    for (int j=0; j < eltsTotal; j++)
        printf( "%d,", array[j] );
    printf("\n");

    free (array);

    * pBufID = bufID;
}

And here's the output (identical):

2011-03-17 14:53:10.010 glWheel1[321:207] OLD (works)
2011-03-17 14:53:10.016 glWheel1[321:207] BufID: 2
2011-03-17 14:53:10.018 glWheel1[321:207] writing 240 bytes... 
2,2,0,1,4,4,0,3,2,2,11,11,9,10,13,13,9,12,11,11,20,20,18,19,22,22,18,21,20,20,29,29,27,28,31,31,27,30,29,29,38,38,36,37,40,40,36,39,38,38,47,47,45,46,49,49,45,48,47,47,56,56,54,55,58,58,54,57,56,56,65,65,63,64,67,67,63,66,65,65,74,74,72,73,76,76,72,75,74,74,83,83,81,82,85,85,81,84,83,83,92,92,90,91,94,94,90,93,92,92,101,101,99,100,103,103,99,102,101,101,
2011-03-17 14:53:10.022 glWheel1[321:207] BufID: 3
2011-03-17 14:53:10.023 glWheel1[321:207] writing 144 bytes... 
5,5,8,6,7,7,14,14,17,15,16,16,23,23,26,24,25,25,32,32,35,33,34,34,41,41,44,42,43,43,50,50,53,51,52,52,59,59,62,60,61,61,68,68,71,69,70,70,77,77,80,78,79,79,86,86,89,87,88,88,95,95,98,96,97,97,104,104,107,105,106,106,



2011-03-17 14:54:11.015 glWheel1[365:207] NEW (fails)
2011-03-17 14:54:11.018 glWheel1[365:207] BufID: 2
2011-03-17 14:54:11.020 glWheel1[365:207] writing 240 bytes... 
2,2,0,1,4,4,0,3,2,2,11,11,9,10,13,13,9,12,11,11,20,20,18,19,22,22,18,21,20,20,29,29,27,28,31,31,27,30,29,29,38,38,36,37,40,40,36,39,38,38,47,47,45,46,49,49,45,48,47,47,56,56,54,55,58,58,54,57,56,56,65,65,63,64,67,67,63,66,65,65,74,74,72,73,76,76,72,75,74,74,83,83,81,82,85,85,81,84,83,83,92,92,90,91,94,94,90,93,92,92,101,101,99,100,103,103,99,102,101,101,
2011-03-17 14:54:11.024 glWheel1[365:207] BufID: 3
2011-03-17 14:54:11.025 glWheel1[365:207] writing 144 bytes... 
5,5,8,6,7,7,14,14,17,15,16,16,23,23,26,24,25,25,32,32,35,33,34,34,41,41,44,42,43,43,50,50,53,51,52,52,59,59,62,60,61,61,68,68,71,69,70,70,77,77,80,78,79,79,86,86,89,87,88,88,95,95,98,96,97,97,104,104,107,105,106,106,


indexCount_background = INDICES_FOR_SHAPE * NUM_QUADS;

This was missing from my revised code.. so when it came to actually drawing, GL, thought it had to render zero points

I'm voting for closure, as I doubt this code would be any use to anyone, and there is enough clutter on the Internet.

Sorry for wasting time & focus :|

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜