[英]Android OpenGL - ES Texture bleeding
我正在寫一個小應用程序,目前生成一個隨機的紋理貼圖。
我將此地圖繪制為10 x 15組“四邊形”,其實際上是所有三角形條帶。 我使用“map”來獲取一個int,然后我將其作為textureAtlas中此方塊的紋理位置。 所以例如0是左下角的“瓦片”。 圖集為128 x 128,分為32像素圖塊。
然而,我似乎得到了一些奇怪的文物,其中來自一個瓷磚的紋理爬進到下一個瓷磚。 我想知道它是否是圖像本身,但據我所知,像素正好在它們應該的位置。 然后我查看了我指定的紋理坐標,但它們看起來都很精確(0.0,0.25,0.5,0.75,1.0-將它分成我期望的4行和列)。
奇怪的是,如果我在模擬器上運行它,我沒有得到任何工件。
是否有一個我錯過的設置會導致1像素的出血? 它似乎也只是垂直的 - 這可能與手機有關我在那個方向“拉伸”圖像,因為手機的屏幕在那個方向上比正常大。
我像這樣加載紋理:
//Get a new ID
int id = newTextureID(gl);
//We will need to flip the texture vertically
Matrix flip = new Matrix();
flip.postScale(1f, -1f);
//Load up and flip the texture
Bitmap temp = BitmapFactory.decodeResource(context.getResources(), resource);
//Store the widths for the texturemap
int width = temp.getWidth();
int height = temp.getHeight();
Bitmap bmp = Bitmap.createBitmap(temp, 0, 0, width, height, flip, true);
temp.recycle();
//Bind
gl.glBindTexture(GL10.GL_TEXTURE_2D, id);
//Set params
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR);
//Push onto the GPU
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0);
TextureAtlas atlas = new TextureAtlas(id, width, height, tileSize);
return atlas;
我然后渲染它:
gl.glBindTexture(GL10.GL_TEXTURE_2D, currentAtlas.textureID);
//Enable the vertices buffer for writing and to be used during our rendering
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
//Specify the location and data format of an array of vertex coordinates to use
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
//Enable the texture buffer
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_SHORT, indexBuffer);
我會拍照,但我不確定如何從手機上獲得屏幕上限......
如果有人知道如何捕獲當前幀並可能將其放入文件中,我會這樣做,如果它有助於解釋發生了什么!
期待您的回復。
編輯:這是一個screencap - 注意我在橫向上運行應用程序但是帽子是縱向的。 也可以原諒可怕的紋理:D他們只是一個占位符/亂搞。
好吧,在和朋友交談后,我設法解決了這個小問題。
事實證明,如果你想擁有精確的像素完美紋理,你必須指定紋理的邊緣到像素的中間。
為此,我只需添加半個像素或減去半個像素來測量紋理坐標。
像這樣:
//Top Left
textureCoords[textPlace] = xAdjust*currentAtlas.texSpaceWidth + currentAtlas.halfPixelAdjust; textPlace++;
textureCoords[textPlace] = (yAdjust+1)*currentAtlas.texSpaceHeight - currentAtlas.halfPixelAdjust; textPlace++;
這只是在加載紋理圖集時計算出來的:
(float)(0.5 * ((1.0f / numberOfTilesInAtlasRow) / pixelsPerTile));
雖然如果高度與每個圖塊的寬度不同(可能發生),您需要單獨計算它們。
這解決了所有的工件,所以我可以繼續。 希望它可以幫助別人!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.