OpenGL を使用して iOS プラットフォーム用のアプリを開発しています。
現在、各サブプレーンが四角形を形成する 2 つの三角形で構成されている複数のサブプレーンで構成される平面 (地形) をペイントするときに、奇妙な問題が発生しています。glDrawElements への呼び出しを使用してこの地形をワイヤーフレームとしてペイントし、パラメーター GL_Line_Strip と事前計算されたインデックスを提供します。問題は、三角形が間違った順序でペイントされたり、垂直方向にミラーリングされたりすることです。インデックスを指定した順序で描画されないため、混乱します。
これは、頂点を生成するための簡略化されたコードです。
int pos = 0;
for(NSInteger y = - gridSegmentsY / 2; y < gridSegmentsY / 2; y ++) {
for(NSInteger x = - gridSegmentsX / 2; x < gridSegmentsX / 2; x ++) {
vertices[pos++] = x * 5;
vertices[pos++] = y * 5;
vertices[pos++] = 0;
}
}
これは、縮退したものを含むインデックスを生成する方法です(IBOとして使用するため)。
pos = 0;
for(int y = 0; y < gridSegmentsY - 1; y ++) {
if (y > 0) {
// Degenerate begin: repeat first vertex
indices[pos++] = (unsigned short)(y * gridSegmentsY);
}
for(int x = 0; x < gridSegmentsX; x++) {
// One part of the strip
indices[pos++] = (unsigned short)((y * gridSegmentsY) + x);
indices[pos++] = (unsigned short)(((y + 1) * gridSegmentsY) + x);
}
if (y < gridSegmentsY - 2) {
// Degenerate end: repeat last vertex
indices[pos++] = (unsigned short)(((y + 1) * gridSegmentsY) + (gridSegmentsX - 1));
}
}
では、この部分では...
indices[pos++] = (unsigned short)((y * gridSegmentsY) + x);
indices[pos++] = (unsigned short)(((y + 1) * gridSegmentsY) + x);
...インデックス配列の最初のインデックスを現在の (x,y)を指すように設定し、次のインデックスを (x,y+1) を指すように設定しています。現在のストリップのすべての x に対してこれを行っています。次に、縮退した三角形を処理し、次のストリップ (y+1) に対してこの手順を繰り返します。
したがって、結果のメッシュが次のようにペイントされることを期待しています。
a----b----c
| /| /|
| / | / |
| / | / |
|/ |/ |
d----e----f
| /| /|
| / | / |
| / | / |
|/ |/ |
g----h----i
以下を使用して説明されているようにペイントします。
glDrawElements(GL_LINE_STRIP, indexCount, GL_UNSIGNED_SHORT, 0);
...GL_Line_Strip が最初に (a->d) から、次に (d->b) から、次に (b, e)... など (インデックスの計算で指定されているとおり) の行を描画することを期待しているためです。
しかし、実際にペイントされるのは次のとおりです。
*----*----*
|\ |\ |
| \ | \ |
| \ | \ |
| \| \|
*----*----*
|\ |\ |
| \ | \ |
| \ | \ |
| \| \|
*----*----*
三角形がどういうわけか間違った順序で描かれているので、その理由を知る必要がありますか? ;))。誰か知っていますか?問題は GL_Line_Strip の使用にあるのでしょうか、それとも私のコードにバグがありますか?
私の目は (0.0f, 0.0f, 20.0f) にあり、(0,0,0) を見ています。メッシュは x 軸と y 軸に沿って左から右に z = 0 でペイントされるため、メッシュを反転したり何かを行ったりしないでください。