【问题标题】:LWJGL and Slick textures display as black...?LWJGL 和 Slick 纹理显示为黑色...?
【发布时间】:2013-09-03 16:07:06
【问题描述】:

我使用日食。因此,在我的工作区中,在我的项目下,我创建了一个新文件夹“res”,其中包含一个子文件夹“images”,其中包含我所有的 png 用作纹理。所以这是我用来加载纹理的方法:

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
{
public int count = 0;
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())
        {

            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.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    GL11.glDisable(GL11.GL_COLOR_MATERIAL);

    GL11.glLoadIdentity();
    GL11.glOrtho(0, width, height, 0, 1, -1);
    GL11.glMatrixMode(GL11.GL_MODELVIEW);
    GL11.glEnable(GL11.GL_BLEND);
    GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);

}
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);
    GL11.glEnable(GL11.GL_BLEND);
    GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
    System.out.println("working." + wood.getTextureID());

    GL11.glBindTexture(GL11.GL_TEXTURE_2D, wood.getTextureID());
    GL11.glBegin(GL11.GL_QUADS);


    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());

    GL11.glEnd();
    GL11.glDisable(GL11.GL_BLEND);

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


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

    new TextureDemo();


}

}

为什么为什么我的纹理是黑色的,哈哈?我真的不明白我的代码是如何做到的。有没有可能是我的电脑出现问题导致的?

【问题讨论】:

    标签: java binding textures lwjgl


    【解决方案1】:

    问同样的问题两次没有帮助。但是,您应该确保先调用glBindTexture,然后再开始glBegin

    【讨论】:

      【解决方案2】:

      很抱歉,您的代码存在很多问题。我建议看一些 opengl 教程。 arcsynthesis一非常深入。

      您的问题是纹理“木头”永远不会绑定到 opengl。

      为了将纹理绑定到 opengl 上下文,您必须调用

      glBindTexture(GL_TEXTURE_2D, id);
      

      在 glbegin() 之前

      id 是由glGentextures 或在您的情况下是 slick util 方法生成的纹理 id。 还有什么是木头?在第一个代码块中,它是纹理 ID,但在第二个代码块中,您在类型 wood 上调用“getHeght()”。我对“木头”是什么感到困惑。

      无论哪种方式,您都需要为 opengl 绑定纹理才能使用它,我再次建议您查看一些关于 opengl 基础的教程。

      【讨论】:

      • “但是,您的代码有很多问题”:您介意指出所有问题吗?
      • 我很抱歉。他们比糟糕的代码更糟糕的实践。我假设 getHeight/width 方法是指纹理,因此将坐标设置为纹理大小似乎很奇怪。通过绑定纹理和使用 gl 调用的相同方法传递顶点位置只是很麻烦,而且四边形不经常使用。他还应该在渲染后取消绑定纹理。
      • 我已将它绑定到 open gl。它显示为黑色四边形。我尝试了几种不同的图像,不同的大小,2的所有幂。木材是纹理名称。生病更新渲染方法
      • 我的错——我忘了​​补充一点,你也需要调用 glEnable(GL_TEXTURE_2D)。在您的一种初始化方法中执行此操作。
      • 我的 initgl 方法中也有这个...你想看看整个班级吗?
      【解决方案3】:

      您尚未启用纹理! 在您的 initGL 方法中调用 GL11.glEnable(GL11.GL_TEXTURE_2D)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-14
        • 2020-04-17
        • 2023-02-03
        • 1970-01-01
        相关资源
        最近更新 更多