LWJGL 纹理不渲染



我一直在尝试用 lwjgl 编写游戏引擎,但我遇到了渲染问题,我需要一些帮助。基本上,我遵循了 lwjgl-basics 中的一些步骤(GitHub 上的 mattdesl(,并在我的渲染器中生成了一个 Texture 类和一个部分,除了它们不渲染纹理之外,它们还可以工作。这是代码...

public void drawTexturedRectangle(float x1, float y1, float w, float h, Texture t){
        t.bind();
        GL11.glColor4f(1.0f, 0, 1.0f, 1.0f);
        GL11.glBegin(GL11.GL_QUADS);
        GL11.glTexCoord2f(0, 0);
        GL11.glVertex2f(x1, y1);
        GL11.glTexCoord2f(1.0f, 0);
        GL11.glVertex2f(x1 + w, y1);
        GL11.glTexCoord2f(1.0f, 1.0f);
        GL11.glVertex2f(x1 + w, y1 + h);
        GL11.glTexCoord2f(0, 1.0f);
        GL11.glVertex2f(x1, y1 + h);
        GL11.glEnd();
    }

这就是它渲染的地方。下面是纹理类:

package com.nightfall.morningside;
import java.io.*;
import java.net.URL;
import java.nio.ByteBuffer;
import de.matthiasmann.twl.utils.*;
import org.lwjgl.opengl.*;
import org.lwjgl.opengl.GL12.*;
import org.lwjgl.BufferUtils;
public class Texture {
    public int width;
    public int height;
    public int id;
    public Texture(URL pathToTexture){
        try {
            InputStream pngstream = pathToTexture.openStream();
            PNGDecoder pngdecoder = new PNGDecoder(pngstream);
            width = pngdecoder.getWidth();
            height = pngdecoder.getHeight();
            int bpp = 4;
            ByteBuffer buffer = BufferUtils.createByteBuffer(bpp * width * height);
            pngdecoder.decode(buffer, width * bpp, PNGDecoder.Format.RGBA);
            buffer.flip();
            id = GL11.glGenTextures();
            GL11.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1);
            GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
            GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
            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.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, width, height, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, buffer);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public void bind(){
        GL11.glBindTexture(GL11.GL_TEXTURE_2D, id);
    }
}

纹理矩形类:

package com.nightfall.morningside.geometry;
import com.nightfall.morningside.Texture;
import com.nightfall.morningside.Textured;
public class TexturedRectangle extends Rectangle implements Textured{
    public Texture texture;
    public TexturedRectangle(float xone, float yone, float w, float h, Texture t) {
        super(xone, yone, w, h);
        texture = t;
    }
    public Texture getTexture() {
        return texture;
    }
}

矩形类:

package com.nightfall.morningside.geometry;
public class Rectangle {
    private float x1;
    private float y1;
    private float width;
    private float height;
    public Rectangle(float xone, float yone, float w, float h){
        x1 = xone;
        y1 = yone;
        width = w;
        height = h;
    }
    public float getX1(){
        return x1;
    }
    public float getY1(){
        return y1;
    }
    public float getHeight(){
        return height;
    }
    public float getWidth(){
        return width;
    }
    public Point getLocation(){
        return new Point(x1, y1);
    }
}

和纹理界面:

package com.nightfall.morningside;
public interface Textured {
    public Texture getTexture();
}

和点类:

package com.nightfall.morningside.geometry;
public class Point {
    private float x1;
    private float y1;
    public Point(float x, float y){
        x1 = x;
        y1 = y;
    }
    public float getX(){
        return x1;
    }
    public float getY(){
        return y1;
    }
}

我希望这就是一切。我相信这是我渲染方式的问题,但也许我加载纹理的地方存在问题。如果你还需要什么,我会帮你准备的。谢谢。

纹理默认

处于禁用状态。当您想要渲染带纹理的基元(例如带纹理的四边形(时,必须使用

glEnable(GL_TEXTURE2D);
glBindTexture(GL_TEXTURE_2D, textureId);

第一行告诉 openGL 使用纹理,第二行指定要使用的纹理。

要停止使用纹理,您可以:

  • 将零绑定到GL_TEXTURE_2D:glBindTexture(GL_TEXTURE_2D, 0);
  • 禁用GL_TEXTURE_2D:glDisable(GL_TEXTURE_2D);

编辑,我忘记了所有GLxx.前缀(我的代码中的静态导入(

最新更新