【问题标题】:Java lwjgl and slick are not displaying my texturesJava lwjgl 和 slick 没有显示我的纹理
【发布时间】:2013-08-28 22:47:42
【问题描述】:

我尝试了很多不同的方法,但到目前为止都没有奏效。起初,问题是程序运行时只有一个空白屏幕。我终于让它显示一个空白的白色方块。我的图像是 128x128,另一个是 512x512。

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.FileNotFoundException;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.newdawn.slick.Color;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;
import org.newdawn.slick.util.ResourceLoader;
import org.lwjgl.input.Mouse;
import java.util.Random;

public class TextureDemo
{
private static Texture wood;
Random random = new Random();

    public TextureDemo()
{
    initGL(640, 480, "SLICK TEXTURES");
loadTexture("mozilla");

int x = 100, y = 100, count = 0, width = 0, height = 0, counter = 10;

    while(true)
    {
        count++;
        if(count == counter)
        {
            x--; y--; width++; height++; counter += random.nextInt(50) + 1;
        }

                render(x, y, width, height);
        Display.update();
        Display.sync(60);

        if(Display.isCloseRequested())
        {
            wood.release();
            Display.destroy();
            System.exit(0);
        }
    }
}


private void initGL(int width, int height, String title)
{
    try
        {
        Display.setDisplayMode(new DisplayMode(width, height));
    Display.setTitle(title);
    Display.create();
    }
    catch(LWJGLException e)
    {
    e.printStackTrace();
    Display.destroy();
    System.exit(1);
    }

    GL11.glEnable(GL11.GL_TEXTURE);
    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glLoadIdentity();
    GL11.glOrtho(0, width, 0, height, 1, -1);
    GL11.glMatrixMode(GL11.GL_MODELVIEW);

}


public void loadTexture(String key)
{
    try
    {
        wood = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("./res/images/"+key+".png"));
    System.out.println("working." + wood.getTextureID());
    }
    catch(FileNotFoundException e)
    {
    e.printStackTrace();
    Display.destroy();
    System.exit(1);
    }
    catch(IOException e)
    {
    e.printStackTrace();
    }   
}


public void render(int x, int y, int width, int height)
{

    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);

    System.out.println("working." + wood.getTextureID());

            GL11.glBegin(GL11.GL_QUADS);

                GL11.glBindTexture(GL11.GL_TEXTURE_2D, wood.getTextureID());
        GL11.glTexCoord2f(1, 1);
        GL11.glVertex2f(x, y);
        GL11.glTexCoord2f(0, 1);
        GL11.glVertex2f(x + wood.getImageWidth(), y);
        GL11.glTexCoord2f(0, 0);
        GL11.glVertex2f(x + wood.getImageWidth(), y + wood.getImageHeight());
        GL11.glTexCoord2f(1, 0);
        GL11.glVertex2f(x, y + wood.getImageHeight());

    GL11.glEnd();
    System.out.println(wood.getHeight()+ " " +wood.getWidth());


}

    public static void main (String[] args)
{
    new TextureDemo();
}


}

我只是希望能够看到我在程序中拥有的 png。 Soany想法为什么我得到白色图像? initGL 方法的顺序有多重要?

【问题讨论】:

    标签: java opengl textures lwjgl slick


    【解决方案1】:

    不确定,但我认为您必须使用这种已弃用的旧 OpenGL 样式glEnable(GL_TEXTURE_2D);。 (而不是 GL_TEXTURE)

    更新:我真的认为你应该这样做glEnable(GL_TEXTURE_2D);。尝试使用灰色透明色。也许他们只是变成了黑色方块而不是白色。 Slick 具有绑定纹理的功能(我不确定 getTextureID 返回什么)。

    更新:确保您先glBindTexture,然后再glBegin。

    【讨论】:

    • 感谢您的输入,但是当我这样做时问题会变得更糟。屏幕回到不做任何事情。唯一的例外是如果我只更改 GL11.glBindTexture(GL_TEXTURE_2D);如果更改为它,它保持不变。但是如果我执行 glEnable(GL_TEXTURE_2D) 那么它会回到根本不做任何事情 D:
    • 如何制作灰色?
    • 在你的初始化部分调用一次glClearColor(0.5f, 0.5f, 0.5f, 1.0f);。
    • getTextureID 只返回加载它的纹理编号。因为只有 1 个纹理,所以 ID 为 1。如果加载了更多纹理,我相信每个新纹理只会增加 1。如果它返回 0,则纹理从未正确加载。为什么这会在我的纹理所在的地方形成一个黑色方块???那会很糟糕,因为我什至不想让这种情况发生。并为此感到高兴
    • clearcolor 暴露了纹理应该在的地方确实有一个黑色的正方形漂浮。那么这是否意味着黑色方块是在我的纹理之后绘制的?还是由于某种原因纹理变成黑色?
    【解决方案2】:

    我认为你的纹理坐标是错误的。尝试用这个替换:

        GL11.glTexCoord2f(0, 0);
        GL11.glVertex2f(x, y);
        GL11.glTexCoord2f(1, 0);
        GL11.glVertex2f(x + wood.getImageWidth(), y);
        GL11.glTexCoord2f(1, 1);
        GL11.glVertex2f(x + wood.getImageWidth(), y + wood.getImageHeight());
        GL11.glTexCoord2f(0, 1);
        GL11.glVertex2f(x, y + wood.getImageHeight());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多