我正在使用OpenGL ES,glDrawArrays和GL_TRIANGLE_STRIP绘制一些"简单"的2D图形。
我正在编写一个函数,其目的是获取一个 13x13 点(或其他任意大小)的纹理并以指定数量的列和行输出它。因此,对于 2 行和 3 列,这意味着一个覆盖着 6 个超过 26x39 个点的瓷砖的区域。第一行适用于下面的代码,但是一旦我指定 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;
}
}
假设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
。
启动新行时,您需要插入两个虚拟顶点,实质上是在其他地方重新启动条带。如果三角形条包含 1234 45
5678 怎么办?现在,123 和 234 画好了,然后 344、445、455 和 556 有面积0
,下一个画的三角形是 567 和 678。