1

私は iOS 用のゲームに取り組んでおり、glDrawArrays (cocos2D v1.0.1 と OpenGL ES 1.1 を使用) を使用したテクスチャで問題が発生しています。最初に、テクスチャ座標の配列とともに、丘の上部と下部を定義する CGPoints の配列を作成します。

hillVertices[nHillVertices] = CGPointMake((topLeftVertexX)*CC_CONTENT_SCALE_FACTOR(), topLeftVertexY*CC_CONTENT_SCALE_FACTOR());
hillTexCoords[nHillVertices] = CGPointMake((topLeftVertexX)/textureSize.width, 0.0);
nHillVerticies++;
hillVertices[nHillVertices] = CGPointMake((bottomLeftVertexX)*CC_CONTENT_SCALE_FACTOR(), bottomLeftVertexY*CC_CONTENT_SCALE_FACTOR());
hillTexCoords[nHillVertices] = CGPointMake(topLeftVertexX)/textureSize.width, 1.0);
nHillVerticies++;

そして、...を使用して描画します

glBindTexture(GL_TEXTURE_2D, groundSprite.texture.name);
glVertexPointer(2, GL_FLOAT, 0, hillVertices);
glTexCoordPointer(2, GL_FLOAT, 0, hillTexCoords);
glDrawArrays(GL_TRIANGLE_STRIP, 0, (nHillVertices-1));

ゲームの開始時 (「topLeftVertexX」の値が小さい場合) は、丘がよく見えます... x オフセットが小さい丘

しかし、ゲームが進むにつれて、x オフセット値 (topLeftVertexX) が増加し、事態は悪化し始めます... 中央×オフセット

そして終盤になると調子が悪くなる… ×オフセット大

問題はゲーム序盤で「topLeftVertexX」の値が小さいので、

(topLeftVertexX)/textureSize.width

hillTexCoords[nHillVertices] = CGPointMake((topLeftVertexX)/textureSize.width, 0.0);

小さいです。ただし、ゲームが進行し、x 値が増加するにつれて、値が大きくなり、何らかの破損が発生する可能性があると思います。textureSize は 512x512 で、「topLeftVertexX」はゲーム開始時に 0 から始まり、約 200,000 まで上がります。

三角形の数を増やしてみました (追加のストリップの追加を含む) が、役に立ちません。@jpsarda のCCSpriteBiCurve クラスも試してみましたが、同じ結果が得られました。glHints (GL_NICEST を使用した GL_LINE_SMOOTH_HINT など) も使用してみましたが、役立つものは見つかりませんでした。

これを修正する方法はありますか?

4

1 に答える 1

6

数値が大きくなるにつれて、浮動小数点の精度が失われるだけです。

数値が大きくなるにつれて、連続する各ポイント間のデルタも大きくなります。

IEEE754 では、1.f と次に大きい数値の差は 0.0000001 です。

200,000 で、次に大きい数値は 200,000.02 です。( IEEE754 コンバーター提供)。GLSL が使用する FP 精度の種類について 100% 確信があるわけではありません (クイック リファレンス カードは、フラグメント シェーダーで 14 ビットの仮数部である可能性があることを示していますか?)。したがって、実際にはさらに悪化する可能性があります。

大きな数の小さなウィンドウを見ているだけの場合、エラーは増え続けます。精度が下がるにつれて、テクスチャがますます「ブロック状」に見え始めると思います。

私が考えられる唯一のことは、数値が無限に無限に大きくならないようにコードを設計することです。数字が大きくならないように、数字をラップするよりスマートな方法はありますか?

于 2012-07-08T01:28:50.507 に答える