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

Lan*_*ceK 1 textures opengl-es cocos2d-iphone ios

我正在开发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++;
Run Code Online (Sandbox Code Playgroud)

然后用...画画

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));
Run Code Online (Sandbox Code Playgroud)

在游戏开始时(当"topLeftVertexX"值很小时),山丘看起来很好...... 小x偏移的山丘

但随着游戏的继续,x偏移值(topLeftVertexX)增加,事情开始恶化...... 中间x偏移

接近尾声,它变坏了...... x偏移大

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

(topLeftVertexX)/textureSize.width
Run Code Online (Sandbox Code Playgroud)

hillTexCoords[nHillVertices] = CGPointMake((topLeftVertexX)/textureSize.width, 0.0);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Tim*_*Tim 6

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

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

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

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

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

我唯一能想到的就是设计你的代码,使得这个数字不必永远无限增长.有没有更聪明的方法可以包装数字,以便它不必变得如此之大?