ずっと前から計画していたゲームプロジェクトに取り組んでいます。基本的なものをセットアップし、テクスチャを機能させたいと思います。カスタムで作成された TextureLoader (ご存知かもしれませんがコード スニペットを使用) を使用し、結果のテクスチャ ID をハッシュ マップに配置するので、新しいテクスチャ ID を再作成する必要はありません。
package net.sep87x.atmos.render;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.HashMap;
import javax.imageio.ImageIO;
import net.sep87x.atmos.client.Logger;
import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
public class TextureLoader {
HashMap<String, Integer> textureIds;
private Logger logger;
public TextureLoader() {
this.textureIds = new HashMap<String, Integer>();
logger = Logger.getInstance();
}
public int getTextureId(String path) {
if (this.textureIds.containsKey(path)) {
return this.textureIds.get(path);
} else {
try {
return bindTexture(path);
} catch (IOException e) {
return -1;
}
}
}
public int bindTexture(String path) throws IOException {
BufferedImage img = ImageIO.read(new File(path));
int[] pixels = new int[img.getWidth() * img.getHeight()];
img.getRGB(0, 0, img.getWidth(), img.getHeight(), pixels, 0, img.getWidth());
ByteBuffer buffer = BufferUtils.createByteBuffer(img.getWidth() * img.getHeight() * 4);
for (int y = 0; y < img.getHeight(); y++) {
for (int x = 0; x < img.getWidth(); x++) {
int pixel = pixels[y * img.getWidth() + x];
buffer.put((byte) ((pixel >> 16) & 0xFF));
buffer.put((byte) ((pixel >> 8) & 0xFF));
buffer.put((byte) (pixel & 0xFF));
buffer.put((byte) ((pixel >> 24) & 0xFF));
}
}
buffer.flip();
int textureID = GL11.glGenTextures();
GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureID);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, img.getWidth(), img.getHeight(), 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, buffer);
this.textureIds.put(path, textureID);
logger.log("Loaded \"" + path + "\" as " + textureID + ".");
return textureID;
}
}
その後、画像をレンダリングするのはそれほど難しくないはずですが、レンダリングしたいようにレンダリングされません。背景のグラデーションとその上にテクスチャを描きたいのですが、テクスチャが背景の色をとっているようです。
メイン クラス (レンダリング メソッド):
private void run() {
init();
glEnable(GL_TEXTURE_2D);
while (!Display.isCloseRequested()) {
update();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
render();
glEnd();
Display.update();
Display.sync(60);
}
Display.destroy();
}
private void render() {
currentGuiScreen.render(this);
}
GuiScreen クラス (render() を介して呼び出されます):
private float fadeIn = 0f;
@Override
public void render(Atmos game) {
glPushMatrix();
glBegin(GL_QUADS);
if (fadeIn < 1) fadeIn += 0.001f;
glColor3f(0f, (148f / 255f) * fadeIn, 1f * fadeIn);
glVertex2f(0, 0);
glVertex2f(1920, 0);
glColor3f(0f, (83f / 255f), (142f / 255f));
glVertex2f(1920, 1080);
glVertex2f(0, 1080);
glEnd();
glPopMatrix();
glPushMatrix();
glBegin(GL_QUADS);
glBindTexture(GL_TEXTURE_2D, game.textureLoader.getTextureId("res/img/gui/atmos.png"));
glTexCoord2f(0, 0);
glVertex2f((game.width - 512f) / 2f, (game.height - 512f) / 2f);
glTexCoord2f(1, 0);
glVertex2f((game.width - 512f) / 2f + 512, (game.height - 512f) / 2f);
glTexCoord2f(1, 1);
glVertex2f((game.width - 512f) / 2f + 512, (game.height - 512f) / 2f + 512);
glTexCoord2f(0, 1);
glVertex2f((game.width - 512f) / 2f, (game.height - 512f) / 2f + 512);
glEnd();
glPopMatrix();
}
今、私はすでにこのコードを読んでいるので、うまくいくはずですが、うまくいきません。結果は次のとおりです。
http://i.imgur.com/ZlA26bt.png
ただし、テクスチャはすべて白 (フォント内に白から透明へのグラデーション) であり、背景には青から水色へのグラデーションが必要です。何かが欠けていることは知っていますが、何がわかりません。誰か助けてくれませんか?