Текстурированные треугольные полосы - строки за первым рядом дают искаженный вывод

Я рисую "простую" 2D графику, используя OpenGL ES, glDrawArrays и GL_TRIANGLE_STRIP.

Я пишу функцию, цель которой - взять одну текстуру 13x13 точек (или другой произвольный размер) и вывести ее в указанном количестве столбцов и строк. Таким образом, для 2 строк и 3 столбцов это будет означать область, покрытую 6 плитками размером более 26х39 точек. Первая строка хорошо работает с приведенным ниже кодом, но как только я укажу 2 или более строк, будет просто искаженный вывод.

for (int row = 0; row < heightInTiles; row++) {
    for (int col = 0; col < widthInTiles; col++) {
        vertexIndexOffset += 8;
        startX = (GLshort)(col * TEXTUREWIDTH);
        startY = (GLshort)(row * TEXTUREHEIGHT);

        // Vertices
        vertices[vertexIndexOffset] = startX; // 1
        vertices[vertexIndexOffset + 1] = startY; //0.0;

        vertices[vertexIndexOffset + 2] = startX; // 2
        vertices[vertexIndexOffset + 3] = startY + (GLshort)TEXTUREHEIGHT;

        vertices[vertexIndexOffset + 4] = (GLshort)(startX + TEXTUREWIDTH); // 3
        vertices[vertexIndexOffset + 5] = startY;

        vertices[vertexIndexOffset + 6] = (GLshort)(startX + TEXTUREWIDTH); // 4
        vertices[vertexIndexOffset + 7] = startY + (GLshort)TEXTUREHEIGHT;

        // Texture coords
        uvs[vertexIndexOffset] = WRESULT; // 1
        uvs[vertexIndexOffset + 1] = 0;
        uvs[vertexIndexOffset + 2] = WRESULT; // 2
        uvs[vertexIndexOffset + 3] = HRESULTNEXT;
        uvs[vertexIndexOffset + 4] = WRESULTNEXT; // 3
        uvs[vertexIndexOffset + 5] = 0;
        uvs[vertexIndexOffset + 6] = WRESULTNEXT; // 4
        uvs[vertexIndexOffset + 7] = HRESULTNEXT;
    }
}

1 ответ

Решение

Если предположить, heightInTiles=1 а также widthInTiles=2код сначала генерирует два "раздетых" треугольника 1234; для следующей ячейки генерируются вершины 5678, где 3=5 и 4=6. Таким образом, есть два вырожденных треугольника (имеющих площадь 0). Тем не менее, это работает (ну, после переезда vertexIndexOffset += 8; до конца внутреннего цикла)

 2----------4/6----------8
 |           |           |          
 |           |           |          
 |           |           |          
 |           |           |          
 1----------3/5----------7

Если предположить, heightInTiles=2 а также widthInTiles=1картина выглядит несколько иначе:

 6-----------8
 |           |
 |           |
 |           |
 |           |
 2/5--------4/7
 |           |
 |           |
 |           |
 |           |
 1-----------3

Теперь, что будет, если нарисована полоса 12345678? 123, 234 в порядке, но потом 345? Это накладывается, и обратите внимание на координаты текстуры для этих вершин - вершины 2 и 5 имеют разные UV! Как и выше, есть два нежелательных треугольника, но на этот раз они не имеют площади 0 больше.

Когда запускается новая строка, вам нужно вставить две фиктивные вершины, по существу перезапуская полосу в другом месте. Что, если треугольная полоса содержала 1234455678? Теперь 123 и 234 нарисованы ОК, тогда 344, 445, 455 и 556 имеют площадь 0следующие нарисованные треугольники 567 и 678.

Другие вопросы по тегам