Objective c GL_三角形_带和顶点数组出错

Objective c GL_三角形_带和顶点数组出错,objective-c,ios,ipad,opengl-es,Objective C,Ios,Ipad,Opengl Es,我有一个方法准备posCoords数组中的坐标。它在30%的时间内工作正常,然后其他70%的时间前几个三角形在网格中被弄乱了。 整个网格使用GL_三角形_条绘制。 我拼命想弄清楚到底出了什么问题。有什么想法吗 if(!ES2) { glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); } int cols = floor(SCREEN_WIDTH/blockSize)

我有一个方法准备posCoords数组中的坐标。它在30%的时间内工作正常,然后其他70%的时间前几个三角形在网格中被弄乱了。 整个网格使用GL_三角形_条绘制。 我拼命想弄清楚到底出了什么问题。有什么想法吗

if(!ES2) {
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
}

int cols = floor(SCREEN_WIDTH/blockSize);
int rows = floor(SCREEN_HEIGHT/blockSize);
int cells = cols*rows;
NSLog(@"Cells: %i", cells);
coordCount =  /*Points per coordinate*/2 * /*Coordinates per cell*/ 2 * cells + /* additional coord per row */2*2*rows;

NSLog(@"Coord count: %i", coordCount);

if(texCoords) free(texCoords);
if(posCoords) free(posCoords);
if(dposCoords) free(dposCoords);

texCoords = malloc(sizeof(GLfloat)*coordCount);
posCoords = malloc(sizeof(GLfloat)*coordCount);
dposCoords = malloc(sizeof(GLfloat)*coordCount);

int index = 0;


float lowY, hiY = 0;
int x,y = 0;
BOOL drawLeftToRight = YES;
for(y=0;y<SCREEN_HEIGHT;y+=blockSize) {

    lowY = y;
    hiY = y + blockSize;

    // Draw a single row
    for(x=0;x<=SCREEN_WIDTH;x+=blockSize) {
        CGFloat px,py,px2,py2 = 0;

        // Top point of triangle
        if(drawLeftToRight) {
            px = x;
            py = lowY;

            // Bottom point of triangle
            px2 = x;
            py2 = hiY;
        }
        else {
            px = SCREEN_WIDTH-x;
            py = lowY;

            // Bottom point of triangle
            px2 = SCREEN_WIDTH-x;
            py2 = hiY;
        }

        // Top point of triangle
        posCoords[index] = px;
        posCoords[index+1] = py;

        // Bottom point of triangle
        posCoords[index+2] = px2;
        posCoords[index+3] = py2;

        texCoords[index] = px/SCREEN_WIDTH;
        texCoords[index+1] = py/SCREEN_HEIGHT;
        texCoords[index+2] = px2/SCREEN_WIDTH;
        texCoords[index+3] = py2/SCREEN_HEIGHT;

        index+=4;
    }

    drawLeftToRight = !drawLeftToRight;



}

if(!ES2){
glEnableClientState(GL_顶点_数组);
glEnableClientState(GL_纹理_坐标_阵列);
}
int cols=地板(屏幕宽度/块大小);
int rows=地板(屏幕高度/块大小);
int cells=cols*行;
NSLog(@“单元格:%i”,单元格);
coordCount=/*每个坐标点*/2*/*每个单元格坐标*/2*单元格+/*每行额外坐标*/2*2*行;
NSLog(@“coordCount:%i”,coordCount);
如果(texCoords)免费(texCoords);
if(posCoords)free(posCoords);
如果(dposCoords)免费(dposCoords);
texCoords=malloc(sizeof(GLfloat)*coordCount);
posCoords=malloc(sizeof(GLfloat)*coordCount);
dposCoords=malloc(sizeof(GLfloat)*coordCount);
int指数=0;
浮动低y,hiY=0;
int x,y=0;
BOOL drawLeftToRight=是;

对于带有三角形条带的(y=0;y),您添加的最后一个顶点将替换使用的最旧顶点,因此您在边上使用了不好的顶点。使用图形更容易解释

  • 三角形1使用顶点1、2、3-有效三角形
  • 三角形2使用顶点2、3、4-有效三角形
  • 三角形3使用顶点4、5、6-有效三角形
  • 三角形4使用顶点5、6、7-直线,不会绘制任何内容
  • 三角形5使用顶点6、7、8-有效
等等


如果您希望条带正常工作,则需要使用退化三角形填充条带或将条带拆分。

使用三角形条带,您添加的最后一个顶点将替换使用的最旧顶点,因此您在边上使用了不好的顶点。更容易用图形进行解释

  • 三角形1使用顶点1、2、3-有效三角形
  • 三角形2使用顶点2、3、4-有效三角形
  • 三角形3使用顶点4、5、6-有效三角形
  • 三角形4使用顶点5、6、7-直线,不会绘制任何内容
  • 三角形5使用顶点6、7、8-有效
等等


如果您希望条带正常工作,则需要用退化三角形填充条带或将条带拆分。

我倾向于从左向右绘制,并在行的末尾添加一个退化三角形,然后再从左向右绘制

e、 g.[1,2,3,4,5,6;610;10,11,8,9,6,7]

中间部分称为退化三角形(例如,面积为零的三角形)


此外,如果我不得不猜测为什么会出现各种各样的损坏,我会检查以确保顶点和索引与您期望的完全一致-通常,如果没有正确指定索引,您会看到这种损坏。

我倾向于从左向右绘制,并在行的末尾添加一个退化三角形,然后再从左向右

e、 g.[1,2,3,4,5,6;610;10,11,8,9,6,7]

中间部分称为退化三角形(例如,面积为零的三角形)


此外,如果我必须猜测您为什么会看到各种各样的损坏,我会检查以确保您的顶点和索引与您期望的完全一致-通常,如果您没有正确指定索引,您会看到这种损坏。

发现问题:纹理缓冲区溢出到顶点缓冲区,它是随机的,因为某些后台任务使用计时器(有时)对内存进行洗牌发现了问题:纹理缓冲区溢出到顶点缓冲区,它是随机的,因为某些后台任务使用计时器(有时)对内存进行洗牌