【问题标题】:Texture problems in LWJGL (OpenGL) using slick-util library使用 slick-util 库的 LWJGL (OpenGL) 中的纹理问题
【发布时间】:2014-07-10 12:55:16
【问题描述】:

我刚开始使用 3D 图形编程,我有一个封装得很好的 Cube 对象。这个类有一个render() 方法,它继续推入一个新矩阵,执行变换glBegin,指定所有顶点和纹理坐标glEnd,然后弹出矩阵。现在,我已经编写了这个 Cube 类,其中包含在立方体的不同面上使用不同纹理的方法,但这不会在运行时发生。我理解纹理就像​​颜色,我可以通过在适当的顶点之前调用glColor 来轻松更改立方体的每个面,但是使用texture.bind()(来自 slick-util 库)似乎什么都不做。

这是我的渲染方法:

public void render(){
    glPushMatrix();

    top.bind(); 
    top.setTextureFilter(GL_NEAREST);
    glColor4f(1, 1, 1, 0);
    glTranslatef(x, y, z);
    glRotatef(yaw, 0, 1, 0);

    glBegin(GL_QUADS);
    //Top
    glTexCoord2f(0, 0); glVertex3f(0, size, 0);
    glTexCoord2f(0, 1); glVertex3f(0, size, size);
    glTexCoord2f(1, 1); glVertex3f(size, size, size);
    glTexCoord2f(1, 0); glVertex3f(size, size, 0);

    //Front
    top.release();
    side.bind();
    glTexCoord2f(0, 0); glVertex3f(0, 0, 0);
    glTexCoord2f(0, 1); glVertex3f(0, size, 0);
    glTexCoord2f(1, 1); glVertex3f(size, size, 0);
    glTexCoord2f(1, 0); glVertex3f(size, 0, 0);

    //Left
    glTexCoord2f(0, 0); glVertex3f(0, 0, size);
    glTexCoord2f(0, 1); glVertex3f(0, size, size);
    glTexCoord2f(1, 1); glVertex3f(0, size, 0);
    glTexCoord2f(1, 0); glVertex3f(0, 0, 0);

    //Right
    glTexCoord2f(0, 0); glVertex3f(size, 0, size);
    glTexCoord2f(0, 1); glVertex3f(size, size, size);
    glTexCoord2f(1, 1); glVertex3f(size, size, 0);
    glTexCoord2f(1, 0); glVertex3f(size, 0, 0);

    //Back
    glTexCoord2f(0, 0); glVertex3f(0, 0, size);
    glTexCoord2f(0, 1); glVertex3f(0, size, size);
    glTexCoord2f(1, 1); glVertex3f(size, size, size);
    glTexCoord2f(1, 0); glVertex3f(size, 0, size);

    //Bottom
    side.release();
    bottom.bind();
    glTexCoord2f(0, 0); glVertex3f(0, 0, 0);
    glTexCoord2f(0, 1); glVertex3f(0, 0, size);
    glTexCoord2f(1, 1); glVertex3f(size, 0, size);
    glTexCoord2f(1, 0); glVertex3f(size, 0, 0);

    bottom.release();
    glEnd();
    glPopMatrix();
}

变量topsidebottom 是我想放在立方体表面上的纹理。

结果是立方体的每个面都有“顶部”纹理。

无论我是否调用texture.release(),结果都是一样的。

【问题讨论】:

    标签: opengl textures lwjgl


    【解决方案1】:

    您不能在glBegin()glEnd() 之间绑定纹理。在glBegin()glEnd() 之间只能进行有限的一组GL 调用(完整列表请参见https://www.opengl.org/sdk/docs/man2/xhtml/glBegin.xml),glBindTexture() 不是其中之一。

    要为每一面绑定不同的纹理,您需要为每一面开始一个新的开始/结束对:

    //Top
    top.bind(); 
    glBegin(GL_QUADS);
    glTexCoord2f(0, 0); glVertex3f(0, size, 0);
    glTexCoord2f(0, 1); glVertex3f(0, size, size);
    glTexCoord2f(1, 1); glVertex3f(size, size, size);
    glTexCoord2f(1, 0); glVertex3f(size, size, 0);
    glEnd();
    
    //Front
    side.bind();
    glBegin(GL_QUADS);
    glTexCoord2f(0, 0); glVertex3f(0, 0, 0);
    ...
    glEnd();
    
    //Bottom
    bottom.bind();
    glBegin(GL_QUADS);
    glTexCoord2f(0, 0); glVertex3f(0, 0, 0);
    ...
    glEnd();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 1970-01-01
      相关资源
      最近更新 更多