【问题标题】:LWJGL and Slick - Textures not showingLWJGL 和 Slick - 纹理未显示
【发布时间】:2014-05-15 22:51:41
【问题描述】:

我尝试创建一个简单的类来加载精灵表并从中绘制 2D 纹理。但是,当我尝试渲染其中一个精灵时,它并没有正确地做到这一点。我要么一无所获,要么只得到一些粉红色的点 (http://i.imgur.com/qQl0Y5n.png)。有人可以帮我找出问题所在吗?

public enum Art
{
    GREEN("misc_1", 7, 5, 27, 10),
    BLUE("misc_1", 6, 37, 28, 5),
    MAGENTA("misc_1", 19, 68, 28, 6);

    private String spritesheet;
    private int coordX;
    private int coordY;
    private int width;
    private int height;

    Art(String s, int x, int y, int w, int h)
    {
        this.spritesheet = s;
        this.coordX = x;
        this.coordY = y;
        this.width = w;
        this.height = h;
    }

    public String getSpritesheet()
    {
        return this.spritesheet;
    }

    public void render(int x, int y, int w, int h)
    {
        if (spritesheets.containsKey(this.getSpritesheet()))
        {
            Texture tex = spritesheets.get(this.getSpritesheet());
            if (glGetInteger(GL_TEXTURE_BINDING_2D) != tex.getTextureID())
            {
                tex.bind();
            }

            float i = coordX / tex.getWidth();
            float j = coordY / tex.getHeight();
            float k = (coordX + width) / tex.getWidth();
            float l = (coordY + height) / tex.getHeight();

            int xx = x + w;
            int yy = y + h;

            glBegin(GL_QUADS);
                glTexCoord2f(i, j);
                glVertex2i(x, y);
                glTexCoord2f(k, j);
                glVertex2i(xx, y);
                glTexCoord2f(k, l);
                glVertex2i(xx, yy);
                glTexCoord2f(i, l);
                glVertex2i(x, yy);
            glEnd();
        }
    }

    private static boolean isLoaded = false;
    public static HashMap<String, Texture> spritesheets = new HashMap<String, Texture>();

    public static void loadTextures()
    {
        if (!isLoaded)
        {
            try
            {
                Texture misc_1 = TextureLoader.getTexture("PNG", new FileInputStream("res/misc_1.png"));
                spritesheets.put("misc_1", misc_1);
            } catch (IOException e)
            {
                e.printStackTrace();
            }
            isLoaded = true;
        }
    }
}

如果有帮助,这就是我的 initGL 方法的样子:

private void initGL()
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, 1280, 720, 0, 1, -1);
    glMatrixMode(GL_MODELVIEW);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}

编辑:我只需将 getWidth() 和 getHeight() 更改为 getImageWidth() 和 getImageHeight(),即可解决问题。

【问题讨论】:

    标签: opengl textures rendering lwjgl


    【解决方案1】:

    您没有显示Texture 类的定义。但我认为getWidth()getHeight() 返回int 结果。如果是这样的话,你这里就有问题了:

    float i = coordX / tex.getWidth();
    float j = coordY / tex.getHeight();
    

    coordXtex.getWidth() 都是int 类型的值,因此除法将作为整数除法执行。这意味着例如,如果coordX 小于tex.getWidth(),则结果将始终为零。

    要获得浮点除法,您需要将其中一个值转换为float

    float i = (float)coordX / tex.getWidth();
    float j = (float)coordY / tex.getHeight();
    

    请参阅此问题以了解更多详细信息:How to make the division of 2 ints produce a float instead of another int?

    【讨论】:

    • 其实是Slick2D的(slick-util)Texture类,返回值是一个float。但多亏了你,我才注意到我必须使用 getImageHeight() 和 getImageWidth() 而不是 getWidth() 和 getHeight()。那解决了它!现在我只需要弄清楚如何阻止纹理变得模糊。再次感谢! :D
    猜你喜欢
    • 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
    相关资源
    最近更新 更多