1

我对似乎将纹理绑定到形状的东西有疑问。当我这样做时,我得到一个正确尺寸的白色形状,它的颜色由Color.white.bind().

GraphicsManager.java

package com.jackwilsdon.spectrun;

import java.io.IOException;

import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.lwjgl.util.vector.Vector2f;
import org.newdawn.slick.Color;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;
import org.newdawn.slick.util.ResourceLoader;

public class GraphicsManager {

    final static int WIDTH = 800;
    final static int HEIGHT = 600;

    private static Texture cloudTexture = null;

    public static void initDisplay() throws LWJGLException
    {
        Display.setDisplayMode(new DisplayMode(WIDTH, HEIGHT));
        Display.create();
    }

    public static void initOpenGL()
    {     
        GL11.glMatrixMode(GL11.GL_PROJECTION);
        GL11.glLoadIdentity();
        GL11.glOrtho(0, WIDTH, 0, HEIGHT, 1, -1);
        GL11.glMatrixMode(GL11.GL_MODELVIEW);
    }

    public static void loadTextures()
    {
        Texture currentObject = null;
        try {
            currentObject = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("./resources/cloud.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("Texture loaded: "+currentObject);
        System.out.println(">> Image width: "+currentObject.getImageWidth());
        System.out.println(">> Image height: "+currentObject.getImageHeight());
        System.out.println(">> Texture width: "+currentObject.getTextureWidth());
        System.out.println(">> Texture height: "+currentObject.getTextureHeight());
        System.out.println(">> Texture ID: "+currentObject.getTextureID());
        cloudTexture = currentObject;
    }

    public static void DrawRectangle(int x, int y, int width, int height)
    {
        GL11.glBegin(GL11.GL_QUADS);
            GL11.glVertex2f(x,y);
            GL11.glVertex2f(x+width,y);
            GL11.glVertex2f(x+width,y+height);
            GL11.glVertex2f(x,y+height);
        GL11.glEnd();
    }

    public static void DrawRectangle(int x, int y, int width, int height, int red, int green, int blue)
    {
        GL11.glColor3ub((byte)red, (byte)green, (byte)blue);
        DrawRectangle(x, y, width, height);
    }

    public static Vector2f DrawCloud(int x, int y)
    {
        cloudTexture.bind();
        int width = cloudTexture.getImageWidth();
        int height = cloudTexture.getImageHeight();
        GL11.glBegin(GL11.GL_QUADS);
            GL11.glVertex2f(x,y);
            GL11.glVertex2f(x+width,y);
            GL11.glVertex2f(x+width,y+height);
            GL11.glVertex2f(x,y+height);
        GL11.glEnd();
        return new Vector2f(cloudTexture.getImageWidth(), cloudTexture.getImageHeight());
    }
}

我怀疑这与我的initOpenGL()方法有关,就像我看过的一个例子(http://ninjacave.com/slickutil1)一样,他们的方法非常不同。只是将他们的复制到我的中会产生意想不到的结果(黑屏)。initOpenGL()我的方法有什么遗漏吗?

编辑:该loadTextures()方法输出正确的图像尺寸,但纹理的尺寸不同,这是什么意思?

编辑 2:PNG 不是问题,我尝试了另外 2 个来找到相同的结果。


通过设置纹理坐标修复我的代码后出现了一个新问题。我现在得到一个奇怪的效果,像这样;i.imgur.com/5lr79.png。图像不再是全尺寸,并且在其左下方有一个黑框。

GraphicsManager.java

package com.jackwilsdon.spectrun;

import java.io.IOException;

import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.lwjgl.util.vector.Vector2f;
import org.newdawn.slick.Color;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;
import org.newdawn.slick.util.ResourceLoader;

public class GraphicsManager {

    final static int WIDTH = 800;
    final static int HEIGHT = 600;

    private static Texture cloudTexture = null;

    public static void initDisplay() throws LWJGLException
    {
        Display.setDisplayMode(new DisplayMode(WIDTH, HEIGHT));
        Display.create();
    }

    public static void initOpenGL()
    {    
        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 static void loadTextures()
    {
        Texture currentObject = null;
        try {
            currentObject = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("./resources/cloud.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("Texture loaded: "+currentObject);
        System.out.println(">> Image width: "+currentObject.getImageWidth());
        System.out.println(">> Image height: "+currentObject.getImageHeight());
        System.out.println(">> Texture width: "+currentObject.getTextureWidth());
        System.out.println(">> Texture height: "+currentObject.getTextureHeight());
        System.out.println(">> Texture ID: "+currentObject.getTextureID());
        cloudTexture = currentObject;
    }

    public static void DrawRectangle(int x, int y, int width, int height)
    {
        GL11.glBegin(GL11.GL_QUADS);
            GL11.glVertex2f(x,y);
            GL11.glVertex2f(x+width,y);
            GL11.glVertex2f(x+width,y+height);
            GL11.glVertex2f(x,y+height);
        GL11.glEnd();
    }

    public static void DrawRectangle(int x, int y, int width, int height, int red, int green, int blue)
    {
        GL11.glColor3ub((byte)red, (byte)green, (byte)blue);
        DrawRectangle(x, y, width, height);
    }

    public static Vector2f DrawCloud(int x, int y)
    {
        cloudTexture.bind();
        int width = cloudTexture.getImageWidth();
        int height = cloudTexture.getImageHeight();
        GL11.glBegin(GL11.GL_QUADS);
            GL11.glTexCoord2f(1,1);
            GL11.glVertex2f(x,y);
            GL11.glTexCoord2f(0,1);
            GL11.glVertex2f(x+width,y);
            GL11.glTexCoord2f(0,0);
            GL11.glVertex2f(x+width,y+height);
            GL11.glTexCoord2f(1,0);
            GL11.glVertex2f(x,y+height);
        GL11.glEnd();
        return new Vector2f(cloudTexture.getImageWidth(), cloudTexture.getImageHeight());
    }
}
4

4 回答 4

2

您没有调用 GL11.glEnable( GL11.GL_TEXTURE ) 并且您也没有设置任何纹理坐标也无济于事。

这两者都会破坏你在四边形上看到纹理的能力......

于 2013-01-02T14:11:14.330 回答
1

您首先没有启用 gl_TEXTURE_2D 。其次,您需要在 glBegin() 和 glEnd() 中调用 .bind()。第三,您需要纹理坐标。因此,对于左上边缘,它将是“glTexCoord(0, 0)”,下一个是“(1, 0)”,然后是“(1, 1)”,最后是“(0, 1)”

于 2013-01-02T14:40:21.990 回答
1

我确实相信对 bind() 的调用需要在您的 glBegin() 和 glEnd() 调用之间才能使其生效。尺寸问题有点奇怪——也许你的纹理尺寸不是 2 的幂,它是由驱动程序翻译的?

于 2013-01-02T14:04:48.717 回答
1

不要忘记在需要时调用 TextureImpl.unbind。

于 2013-02-18T21:13:48.263 回答