Ошибка с GL_TRIANGLE_STRIP и массивом вершин - PullRequest
1 голос
/ 29 февраля 2012

У меня есть этот метод, который подготавливает координаты в массиве posCoords. Это работает должным образом приблизительно 30% времени, тогда другие 70% первые несколько треугольников перепутаны в сетке. Вся сетка нарисована с использованием GL_TRIANGLE_STRIP. Я дергаю себя за волосы, пытаясь понять, что не так. Есть идеи?

enter image description here

enter image description here

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;



}

Ответы [ 3 ]

1 голос
/ 29 февраля 2012

При добавлении треугольной полосы последняя добавленная вами вершина заменяет самую старую из использованных вершин, поэтому вы используете плохие вершины по краю.Это проще объяснить с помощью вашего рисунка.

  • Треугольник 1 использует вершины 1, 2, 3 - допустимый треугольник
  • Треугольник 2 использует вершины 2, 3, 4 - допустимый треугольник
  • Треугольник 3 использует вершины 4, 5, 6 - правильный треугольник
  • Треугольник 4 использует вершины 5, 6, 7 - прямая линия, ничего не будет нарисовано
  • Треугольник 5 использует вершины 6, 7, 8 - действителен

и т. Д.

Если вы хотите, чтобы ваши полоски работали, вам нужно набить их полосами вырожденными треугольниками или разбить их.

0 голосов
/ 02 марта 2012

Обнаружена проблема: буфер текстур переполнялся в буфере вершин, он был случайным, потому что некоторые фоновые задачи, когда тасовал память по таймеру (иногда)

0 голосов
/ 29 февраля 2012

Я склонен рисовать слева направо и в конце ряда добавить вырожденный треугольник, затем снова слева направо.

например, [1, 2, 3, 4, 5, 6;6 10;10, 11, 8, 9, 6, 7]

Средняя часть называется вырожденным треугольником (например, треугольники с нулевой площадью).

Кроме того, если бы мне нужно было угадатьпочему вы видите различные виды коррупции, я проверю, чтобы убедиться, что ваши вершины и индексы соответствуют вашим ожиданиям - обычно вы видите такой тип коррупции, когда вы не указали индексы правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...