私はSTBライブラリを使用して、このようなPNG画像をロードしています(小さいですが)。キャラクターの後ろに透明感を付けて5分で作ったスプライトシートです。LWJGL3 STB画像アルファチャンネルがPNGで動作しない画像
eggyのシート:
私は、スプライトシートを解析し、適切なテクスチャがレンダリングループに座標フィードクラスを作りました。それは完璧に機能しますが、私は透過性がなく、ただ黒です。私はデバッガとimage.components() == 4
を使って確認しました。誤解していなければ、アルファチャンネルが必要です。
eggyのエラー:
私はそれは私が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)
を試しましたが、それはしません。そこに助けや背景情報がありますか?
あなたはネイティブの画像データはアルファチャンネルに255未満、あるいは0を持っているかどうかを確認しましたか? – Rabbid76
ソースには有効なアルファチャンネルがありますが、私が気付いていないデータに隠れた値がない限り、私は使用するビューアで透明です。 – CrockettScience
シェーダーを使用していない、正しいですか? –