Java 绘制纹理四边形OpenGL

Java 绘制纹理四边形OpenGL,java,opengl,Java,Opengl,我正在尝试使用纹理渲染四边形,但它不起作用。 这是我的密码: //Init Code GL11.glViewport(0, 0, WIDTH, HEIGHT); GL11.glMatrixMode(GL11.GL_PROJECTION); GL11.glLoadIdentity(); GLU.gluPerspective(45.0f, ((float) WIDTH / (float) HEIGHT), 0.1f, 100.0f); GL11.glMatri

我正在尝试使用纹理渲染四边形,但它不起作用。 这是我的密码:

//Init Code
    GL11.glViewport(0, 0, WIDTH, HEIGHT);
    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glLoadIdentity();
    GLU.gluPerspective(45.0f, ((float) WIDTH / (float) HEIGHT), 0.1f, 100.0f);
    GL11.glMatrixMode(GL11.GL_MODELVIEW);
    GL11.glLoadIdentity();
    GL11.glShadeModel(GL11.GL_SMOOTH);
    GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    GL11.glClearDepth(1.0f);
    GL11.glEnable(GL11.GL_DEPTH_TEST);
    GL11.glDepthFunc(GL11.GL_LEQUAL);
    GL11.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_NICEST);
    GL11.glEnable(GL11.GL_TEXTURE_2D);

//Render Code
    BufferedImage textures = null;
    try {
        textures = ImageIO.read(BlockWorldComponent.class.getResource("/textures.png"));

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    BufferedImage img = textures;
    int w = img.getWidth();
    int h = img.getHeight();
    int imgInt[] = new int[w * h];
    byte imgByte[] = new byte[w * h * 4];
    img.getRGB(0, 0, w, h, imgInt, 0, w);

    for (int i = 0; i < imgInt.length; i++) {
        int a = imgInt[i] >> 24 & 0xFF;
        int r = imgInt[i] >> 16 & 0xFF;
        int g = imgInt[i] >> 8 & 0xFF;
        int b = imgInt[i] & 0xFF;

        imgByte[i * 4 + 0] = (byte) r;
        imgByte[i * 4 + 1] = (byte) g;
        imgByte[i * 4 + 2] = (byte) b;
        imgByte[i * 4 + 3] = (byte) a;
    }

    ByteBuffer imageData = ByteBuffer.allocateDirect(imgByte.length);
    imageData.order(ByteOrder.nativeOrder());
    imageData.clear();
    imageData.put(imgByte, 0, imgByte.length);
    imageData.flip();
    int[] tex = new int[1];
    tex[0] = GL11.glGenTextures();
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, tex[0]);
    System.out.println(tex[0]);
    GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
    GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
    GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, w, h, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, imageData);

    GL11.glScalef(0.25f, 0.25f, 0.25f);


    //GL11.glColor3f(0.0f,1.0f,0.0f); 
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, tex[0]);
    GL11.glBegin(GL11.GL_QUADS);
    //Top Left
    GL11.glTexCoord2f(0.0f, 1.0f);
    GL11.glVertex3f(1.0f, 1.0f, -1.0f);
    //Top Right
    GL11.glTexCoord2f(1.0f, 1.0f);
    GL11.glVertex3f(1.0f, 1.0f, 1.0f);
    //Bottom Left
    GL11.glTexCoord2f(0.0f, 0.0f);
    GL11.glVertex3f(-1.0f, 1.0f, 1.0f); 
    //Bottom Right
    GL11.glTexCoord2f(1.0f, 0.0f);
    GL11.glVertex3f(-1.0f, 1.0f, -1.0f);
    GL11.glEnd();
//初始化代码
GL11.glViewport(0,0,宽度,高度);
GL11.glMatrixMode(GL11.GLU投影);
GL11.glLoadIdentity();
GLU.GLU(45.0f,((浮动)宽度/(浮动)高度),0.1f,100.0f);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glLoadIdentity();
GL11.glShadeModel(GL11.GLU平滑);
GL11.glClearColor(0.0f,0.0f,0.0f,0.0f);
GL11.glClearDepth(1.0f);
GL11.glEnable(GL11.GLU深度试验);
GL11.glDepthFunc(GL11.GL_LEQUAL);
GL11.glHint(GL11.GL\u透视图\u校正\u提示,GL11.GL\u最佳);
GL11.glEnable(GL11.GL_纹理_2D);
//渲染代码
BuffereImage纹理=空;
试一试{
textures=ImageIO.read(BlockWorldComponent.class.getResource(“/textures.png”);
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
BuffereImage img=纹理;
int w=img.getWidth();
inth=img.getHeight();
int imgInt[]=新的int[w*h];
字节imgByte[]=新字节[w*h*4];
img.getRGB(0,0,w,h,imgInt,0,w);
for(int i=0;i>24&0xFF;
int r=imgInt[i]>>16&0xFF;
int g=imgInt[i]>>8&0xFF;
int b=imgInt[i]&0xFF;
imgByte[i*4+0]=(字节)r;
imgByte[i*4+1]=(字节)g;
imgByte[i*4+2]=(字节)b;
imgByte[i*4+3]=(字节)a;
}
ByteBuffer imageData=ByteBuffer.allocateDirect(imgByte.length);
order(ByteOrder.nativeOrder());
imageData.clear();
imageData.put(imgByte,0,imgByte.length);
imageData.flip();
int[]tex=新的int[1];
tex[0]=GL11.glGenTextures();
GL11.glBindTexture(GL11.GL_TEXTURE_2D,tex[0]);
System.out.println(tex[0]);
GL11.glTexParameteri(GL11.GL_纹理_2D、GL11.GL_纹理_包裹、GL11.GL_重复);
GL11.glTexParameteri(GL11.GL_纹理_2D,GL11.GL_纹理_包裹,GL11.GL_重复);
GL11.GLTEXAGE2D(GL11.GL U纹理_U2D、0、GL11.GL U RGBA、w、h、0、GL11.GL U RGBA、GL11.GL U UNSIGNED_BYTE、imageData);
GL11.glScalef(0.25f,0.25f,0.25f);
//GL11.GL3F(0.0f,1.0f,0.0f);
GL11.glBindTexture(GL11.GL_TEXTURE_2D,tex[0]);
GL11.glBegin(GL11.GL_QUADS);
//左上角
GL11.glTexCoord2f(0.0f,1.0f);
GL11.glVertex3f(1.0f,1.0f,-1.0f);
//右上角
GL11.glTexCoord2f(1.0f,1.0f);
GL11.glVertex3f(1.0f,1.0f,1.0f);
//左下角
GL11.glTexCoord2f(0.0f,0.0f);
GL11.glVertex3f(-1.0f,1.0f,1.0f);
//右下角
GL11.glTexCoord2f(1.0f,0.0f);
GL11.glVertex3f(-1.0f,1.0f,-1.0f);
GL11.glEnd();

您是否在项目中启用了纹理

glEnable(GL_TEXTURE_2D);
或者在你的情况下:

GL11.glEnable(GL_11.GL_TEXTURE_2D);

我发现这里有几个问题。首先,调用
glTexImage2D
时,似乎没有纹理绑定。您需要调用
glBindTexture(GL_TEXTURE_2D,tex[0])以便OpenGL正确设置纹理。当然,在此之前,您需要通过调用
glGenTextures
来填充
tex[0]


其次,在调用
glBegin
glEnd
之间不能调用
glBindTexture
。因此,您在绘图部分中调用的第一个绑定,
GL11.glBindTexture(GL11.GL\u TEXTURE\u 2D,0)
将生效,但不是第二个,因为第二个是在您调用
glBegin
之后。因此,渲染中不会使用纹理。

请更具描述性,尽量减少代码大小。要加载图像,请尝试使用newdawn。slick@pmr我不知道问题出在哪里……图像加载良好。我认为这是OpenGL代码中的错误,在代码中忘记更改tex[0]。tex[0]作为整数仅为0。glGenTextures是如何工作的?我在Java/LWJGL中找不到用于OpenGL的Javadoc。谢谢你的帮助!我找到了glGenTextures的部分,但它仍然不起作用。你想让我把代码更新到现在的状态吗?@Diesal11如果你不介意的话,那可能会有帮助,是的