使用glDrawArrays,iOS在OpenGL纹理中损坏

时间:2012-07-08 01:14:07

标签: ios opengl-es cocos2d-iphone textures

我正在开发一款适用于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”值很小时),山丘看起来很好...... Hills with a small x offset

但随着游戏的继续,x偏移值(topLeftVertexX)增加,事情开始变得更糟...... middle x offset

接近结束时,它变坏了...... x offset large

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

(topLeftVertexX)/textureSize.width

in

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

很小。然而,随着游戏的继续和x值的增加,我认为价值变得越来越大,导致某种腐败。 textureSize为512x512,“topLeftVertexX”在游戏开始时从0开始,最高可达200​​,000。

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

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

1 个答案:

答案 0 :(得分:6)

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

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

在IEEE754中,1.f与下一个较大数字之间的差值为0.0000001

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

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

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