2012-07-08 53 views
1

我正在为iOS的游戏工作,我在使用glDrawArrays(使用cocos2D v1.0.1,使用OpenGL ES 1.1)时遇到了一些问题。我首先创建定义一座小山的顶部和底部,与纹理数组沿着CGPoints坐标的数组:使用glDrawArrays,iOS的OpenGL纹理腐败

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 

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

小。然而,随着游戏的继续和x值的增加,我认为价值越来越大,导致某种形式的腐败。 textureSize是512x512,并且“topLeftVertexX”在游戏开始时从0开始,并且上升到大约200,000。

我曾尝试增加三角形的数量(包括添加更多条),但这并没有帮助。我也尝试使用@ jpsarda的CCSpriteBiCurve class,并得到了相同的结果。我也尝试使用glHints(例如GL_LIN_SMOOTH_HINT和GL_NICEST),但我没有找到任何有用的东西。

任何想法我可以解决这个问题?

回答

6

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

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

在IEEE754,1.F和下一个较大数之间的差是0.0000001

在200,000,下一个更大的数目是200,000.02。 (礼貌IEEE754 converter)。我甚至没有100%肯定什么样的FP精度GLSL使用(快速裁判卡表明它可能是片段着色器中的14位尾数?)。所以现实情况可能更糟。

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

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

+0

我想随着游戏的进一步向一个方向滚动,值会增加。良好的实现不需要使用比屏幕宽度更大的值。即不要将摄像机移动到无尽的世界中,将世界移动到固定位置的摄像机上,并创建并丢弃摄像机视野外的世界。 – LearnCocos2D 2012-07-08 11:52:32

+0

谢谢蒂姆,就是这样!由于纹理重复,我能够使纹理坐标保持在较低的值,使用... hillTexCoords [nHillVertices] = ccp((topLeftVertexX - (floor(offsetX/textureSize.width)* textureSize.width))/ textureSize.width,0.0); 再次感谢,我甚至不认为这可能是一个浮点精度问题。现在有道理! – LanceK 2012-07-08 19:21:03