0

我正在使用 OpenGL ES、glDrawArrays 和 GL_TRIANGLE_STRIP 绘制一些“简单”的 2D 图形。

我正在编写一个函数,其目的是获取一个 13x13 点(或其他任意大小)的纹理并将其输出到指定数量的列和行中。因此,对于 2 行和 3 列,这意味着一个区域被 26x39 点上的 6 个图块覆盖。第一行适用于以下代码,但只要我指定 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;
    }
}
4

1 回答 1

1

假设heightInTiles=1widthInTiles=2,代码首先生成两个“剥离”三角形1234;对于下一个单元,生成顶点 5678,其中 3=5 和 4=6。所以有两个退化三角形(面积为0)。但是,这行得通(好吧,在移动vertexIndexOffset += 8;到内部循环的末尾之后)

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

假设heightInTiles=2widthInTiles=1,图片看起来有些不同:

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

现在,如果条带12345678 被绘制,会发生什么?123、234还可以,但是345呢?这重叠,并注意这些顶点的纹理坐标——顶点 2 和 5 具有不同的 UV!如上所述,有两个不需要的三角形,但这一次,它们不再有面积0

当新行开始时,您需要插入两个虚拟顶点,实质上是在其他地方重新启动条带。如果三角形带包含 1234 455678 怎么办?现在,123 和 234 画好了,然后 344、445、455 和 556 有面积0,接下来绘制的三角形是 567 和 678。

于 2012-06-11T17:18:00.523 回答