2017-08-22 22 views
2

私はSTBライブラリを使用して、このようなPNG画像をロードしています(小さいですが)。キャラクターの後ろに透明感を付けて5分で作ったスプライトシートです。LWJGL3 STB画像アルファチャンネルがPNGで動作しない画像

eggyのシート:

Eggy Sheet

私は、スプライトシートを解析し、適切なテクスチャがレンダリングループに座標フィードクラスを作りました。それは完璧に機能しますが、私は透過性がなく、ただ黒です。私はデバッガとimage.components() == 4を使って確認しました。誤解していなければ、アルファチャンネルが必要です。

eggyのエラー:

Eggy Error

私はそれは私がSTBで画像を解析しています方法とは何かを持っていることをかなり確信しているが、私はよく分かりません。私は行方不明の何かがあるかもしれません。

public void renderBatch(){ 
    DrawableAsset image; 
    Coordinates coord; 

    while(!images.isEmpty()){ 
     image = images.dequeue(); 
     coord = coords.dequeue(); 

     int texID = glGenTextures(); 
     glBindTexture(GL_TEXTURE_2D, texID); 

     if (image.components() == 3) { 
      if ((image.absWidth() & 3) != 0) { 
       glPixelStorei(GL_UNPACK_ALIGNMENT, 2 - (image.absWidth() & 1)); 
      } 
      glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image.absWidth(), image.absHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, image.imageData()); 
     } else { 
      glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.absWidth(), image.absHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, image.imageData()); 

     } 

     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

     glEnable(GL_TEXTURE_2D); 

     glPushMatrix(); 
     glTranslatef(coord.x() + image.halfwidth(), coord.y() + image.halfHeight(), 0); 
     glRotatef(image.getAngle(), 0, 0, 1); 
     glScalef(image.getScale(), image.getScale(), 1f); 
     glTranslatef(-coord.x() - image.halfwidth(), -coord.y() - image.halfHeight(), 0); 

     renderImage(image, coord); 

     glPopMatrix(); 

     glDisable(GL_TEXTURE_2D); 

     glDeleteTextures(texID); 
    } 

いくつかの注意:

  • image.absWidth()image.absHeight()image.width()image.height()は、セルの寸法を返しながら、実際のテクスチャシートの寸法を返すここでは、コードです。

  • renderImage()テクスチャクワッドがレンダリングされ、無関係であるべきであるが、ここでは、念のためのコードの行だけである:

    private void renderImage(DrawableAsset image, Coordinates coord){ 
        float[] texCoords = image.regionCoordinates(); 
        glBegin(GL_QUADS); 
        { 
         glTexCoord2f(texCoords[0], texCoords[1]); 
         glVertex2f(coord.x(), coord.y()); 
    
         glTexCoord2f(texCoords[2], texCoords[3]); 
         glVertex2f(coord.x() + image.width(), coord.y()); 
    
         glTexCoord2f(texCoords[4], texCoords[5]); 
         glVertex2f(coord.x() + image.width(), coord.y() + image.height()); 
    
         glTexCoord2f(texCoords[6], texCoords[7]); 
         glVertex2f(coord.x(), coord.y() + image.height()); 
        } 
        glEnd(); 
    } 
    

P.S.私がここにいる間、私は画像を拡大するときにブレンドをなくす方法を見つけようとしています。私はglDisable(GL_BLEND)を試しましたが、それはしません。そこに助けや背景情報がありますか?

+0

あなたはネイティブの画像データはアルファチャンネルに255未満、あるいは0を持っているかどうかを確認しましたか? – Rabbid76

+0

ソースには有効なアルファチャンネルがありますが、私が気付いていないデータに隠れた値がない限り、私は使用するビューアで透明です。 – CrockettScience

+0

シェーダーを使用していない、正しいですか? –

答えて

1

glBlendFuncを正しく設定しなかったために問題が発生しました。任意の図面の前にこの行のコードを入力すると、そのトリックが実行されました。トピックの

glDisable(GL_DEPTH_TEST); 
glEnable(GL_BLEND); 

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

より:Blending

関連する問題