我正在为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”值较小),山好看...
但随着比赛继续进行,在x偏移值(topLeftVertexX)增加,事情开始变得更糟.. 。
而且临近年底,它得到坏...
我认为问题是,在比赛的开始,“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),但我没有找到任何有用的东西。
任何想法我可以解决这个问题?
我想随着游戏的进一步向一个方向滚动,值会增加。良好的实现不需要使用比屏幕宽度更大的值。即不要将摄像机移动到无尽的世界中,将世界移动到固定位置的摄像机上,并创建并丢弃摄像机视野外的世界。 – LearnCocos2D 2012-07-08 11:52:32
谢谢蒂姆,就是这样!由于纹理重复,我能够使纹理坐标保持在较低的值,使用... hillTexCoords [nHillVertices] = ccp((topLeftVertexX - (floor(offsetX/textureSize.width)* textureSize.width))/ textureSize.width,0.0); 再次感谢,我甚至不认为这可能是一个浮点精度问题。现在有道理! – LanceK 2012-07-08 19:21:03