gpt4 book ai didi

java - 如何在不同的墙壁上放置不同的纹理?陆万金GL

转载 作者:行者123 更新时间:2023-12-02 05:47:46 25 4
gpt4 key购买 nike

到目前为止,我已经得到了它,所以你在一个盒子里跑来跑去,但所有的墙壁都是相同的纹理!我已经加载了墙壁的其他纹理(我希望墙壁的纹理与地板不同),但似乎它被忽略了......这是我的代码:

        int floorTexture = glGenTextures();
{
InputStream in = null;
try {
in = new FileInputStream("floor.png");
PNGDecoder decoder = new PNGDecoder(in);
ByteBuffer buffer = BufferUtils.createByteBuffer(4 * decoder.getWidth() * decoder.getHeight());
decoder.decode(buffer, decoder.getWidth() * 4, Format.RGBA);
buffer.flip();
glBindTexture(GL_TEXTURE_2D, floorTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, decoder.getWidth(), decoder.getHeight(), 0, GL_RGBA,
GL_UNSIGNED_BYTE, buffer);
glBindTexture(GL_TEXTURE_2D, floorTexture);


} catch (FileNotFoundException ex) {
System.err.println("Failed to find the texture files.");
ex.printStackTrace();
Display.destroy();
System.exit(1);
} catch (IOException ex) {
System.err.println("Failed to load the texture files.");
ex.printStackTrace();
Display.destroy();
System.exit(1);
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

int wallTexture = glGenTextures();
{
InputStream in = null;
try {
in = new FileInputStream("walls.png");
PNGDecoder decoder = new PNGDecoder(in);
ByteBuffer buffer = BufferUtils.createByteBuffer(4 * decoder.getWidth() * decoder.getHeight());
decoder.decode(buffer, decoder.getWidth() * 4, Format.RGBA);
buffer.flip();
glBindTexture(GL_TEXTURE_2D, wallTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, decoder.getWidth(), decoder.getHeight(), 0, GL_RGBA,
GL_UNSIGNED_BYTE, buffer);
glBindTexture(GL_TEXTURE_2D, wallTexture);


} catch (FileNotFoundException ex) {
System.err.println("Failed to find the texture files.");
ex.printStackTrace();
Display.destroy();
System.exit(1);
} catch (IOException ex) {
System.err.println("Failed to load the texture files.");
ex.printStackTrace();
Display.destroy();
System.exit(1);
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
int ceilingDisplayList = glGenLists(1);
glNewList(ceilingDisplayList, GL_COMPILE);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex3f(-gridSize, ceilingHeight, -gridSize);
glTexCoord2f(gridSize * 10 * tileSize, 0);
glVertex3f(gridSize, ceilingHeight, -gridSize);
glTexCoord2f(gridSize * 10 * tileSize, gridSize * 10 * tileSize);
glVertex3f(gridSize, ceilingHeight, gridSize);
glTexCoord2f(0, gridSize * 10 * tileSize);
glVertex3f(-gridSize, ceilingHeight, gridSize);
glEnd();
glEndList();

int wallDisplayList = glGenLists(1);
glNewList(wallDisplayList, GL_COMPILE);

glBegin(GL_QUADS);

// North wall

glTexCoord2f(0, 0);
glVertex3f(-gridSize, floorHeight, -gridSize);
glTexCoord2f(0, gridSize * 10 * tileSize);
glVertex3f(gridSize, floorHeight, -gridSize);
glTexCoord2f(gridSize * 10 * tileSize, gridSize * 10 * tileSize);
glVertex3f(gridSize, ceilingHeight, -gridSize);
glTexCoord2f(gridSize * 10 * tileSize, 0);
glVertex3f(-gridSize, ceilingHeight, -gridSize);

// West wall

glTexCoord2f(0, 0);
glVertex3f(-gridSize, floorHeight, -gridSize);
glTexCoord2f(gridSize * 10 * tileSize, 0);
glVertex3f(-gridSize, ceilingHeight, -gridSize);
glTexCoord2f(gridSize * 10 * tileSize, gridSize * 10 * tileSize);
glVertex3f(-gridSize, ceilingHeight, +gridSize);
glTexCoord2f(0, gridSize * 10 * tileSize);
glVertex3f(-gridSize, floorHeight, +gridSize);

// East wall

glTexCoord2f(0, 0);
glVertex3f(+gridSize, floorHeight, -gridSize);
glTexCoord2f(gridSize * 10 * tileSize, 0);
glVertex3f(+gridSize, floorHeight, +gridSize);
glTexCoord2f(gridSize * 10 * tileSize, gridSize * 10 * tileSize);
glVertex3f(+gridSize, ceilingHeight, +gridSize);
glTexCoord2f(0, gridSize * 10 * tileSize);
glVertex3f(+gridSize, ceilingHeight, -gridSize);

// South wall

glTexCoord2f(0, 0);
glVertex3f(-gridSize, floorHeight, +gridSize);
glTexCoord2f(gridSize * 10 * tileSize, 0);
glVertex3f(-gridSize, ceilingHeight, +gridSize);
glTexCoord2f(gridSize * 10 * tileSize, gridSize * 10 * tileSize);
glVertex3f(+gridSize, ceilingHeight, +gridSize);
glTexCoord2f(0, gridSize * 10 * tileSize);
glVertex3f(+gridSize, floorHeight, +gridSize);

glEnd();

glEndList();

int floorDisplayList = glGenLists(1);
glNewList(floorDisplayList, GL_COMPILE);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex3f(-gridSize, floorHeight, -gridSize);
glTexCoord2f(0, gridSize * 10 * tileSize);
glVertex3f(-gridSize, floorHeight, gridSize);
glTexCoord2f(gridSize * 10 * tileSize, gridSize * 10 * tileSize);
glVertex3f(gridSize, floorHeight, gridSize);
glTexCoord2f(gridSize * 10 * tileSize, 0);
glVertex3f(gridSize, floorHeight, -gridSize);
glEnd();
glEndList();

最佳答案

您需要在相应的 glBegin() 之前绑定(bind)要用于给定批处理几何体的纹理。

除非您另外告诉 OpenGL,否则将使用最近的绑定(bind)(在您的情况下为 glBindTexture(GL_TEXTURE_2D, wallTexture))。

类似这样的事情:

int floorDisplayList = glGenLists(1);
glNewList(floorDisplayList, GL_COMPILE);
glBindTexture(GL_TEXTURE_2D, floorTexture); // the important bit
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex3f(-gridSize, floorHeight, -gridSize);
glTexCoord2f(0, gridSize * 10 * tileSize);
glVertex3f(-gridSize, floorHeight, gridSize);
glTexCoord2f(gridSize * 10 * tileSize, gridSize * 10 * tileSize);
glVertex3f(gridSize, floorHeight, gridSize);
glTexCoord2f(gridSize * 10 * tileSize, 0);
glVertex3f(gridSize, floorHeight, -gridSize);
glEnd();
glEndList();

关于java - 如何在不同的墙壁上放置不同的纹理?陆万金GL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23891763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com