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)增加,事情开始变得更糟...... 中间 x 偏移

接近尾声,它变得糟糕...... x 偏移量大

我认为问题是在游戏开始时,“topLeftVertexX”的值很小,所以结果

(topLeftVertexX)/textureSize.width

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

是小。然而,随着游戏的继续和 x 值的增加,我认为该值变得足够大,足以导致某种腐败。textureSize 为 512x512,“topLeftVertexX”在游戏开始时从 0 开始,一直上升到大约 200,000。

我尝试增加三角形的数量(包括添加额外的条带),但这无济于事。我也尝试使用@jpsarda 的CCSpriteBiCurve 类,得到了相同的结果。我也尝试使用 glHints(例如 GL_LINE_SMOOTH_HINT 和 GL_NICEST),但我没有找到任何有用的东西。

有什么想法可以解决这个问题吗?

4

1 回答 1

6

它没有被破坏,随着数字的增加,你只是失去了浮点精度。

随着您的数字越来越大,每个连续点之间的增量也越来越大。

在 IEEE754 中,1.f 和下一个更大的数字之间的差是 0.0000001

在 200,000 处,下一个更大的数字是 200,000.02。(由IEEE754 转换器提供)。我什至不是 100% 肯定 GLSL 使用哪种 FP 精度(快速参考卡表明它可能是片段着色器中的 14 位尾数?)。所以实际上情况可能更糟。

如果你只是在看一个大数字的小窗口,那么错误将继续增长。我怀疑随着精度的下降,你的纹理开始看起来越来越“块状”。

我唯一能想到的就是设计你的代码,这样数字就不必永远无限增长。有没有更聪明的方法可以将数字包裹起来,这样它就不必变得这么大了?

于 2012-07-08T01:28:50.507 回答