2012-06-11 1 views
0

Я рисую несколько «простых» 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 имеют разные УФ-лучи! Как и выше, есть два нежелательных треугольника, но на этот раз они больше не имеют области 0.

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

+0

Спасибо. Отличный ответ. Размещение вершиныIndexOffset + = 8 было ошибкой: -P – Jonny