2012-07-08 51 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