簡體   English   中英

Android OpenGL - ES紋理出血

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM