绘制带纹理的四边形 OpenGL
Posted
技术标签:
【中文标题】绘制带纹理的四边形 OpenGL【英文标题】:Draw Textured Quad OpenGL 【发布时间】:2011-12-17 14:39:23 【问题描述】:我正在尝试使用纹理渲染四边形,但它不起作用。 这是我的代码:
//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();
【问题讨论】:
请多描述一点,尽量减少代码大小。 要加载图片,试试 newdawn.slick @pmr 我不知道问题出在哪里......图像加载正常。我认为它在 OpenGL 的东西中 【参考方案1】:我在这里看到了几个问题。首先,当您调用glTexImage2D
时,您似乎没有绑定纹理。您需要在调用 glBindTexture(GL_TEXTURE_2D, tex[0]);
之前调用它,以便 OpenGL 正确设置纹理。当然,您需要在此之前通过调用glGenTextures
填充tex[0]
。
其次,您不能在调用glBegin
和glEnd
之间调用glBindTexture
。因此,您在绘图部分调用的第一个绑定 GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
将生效,但不会生效,因为第二个绑定在您调用 glBegin
之后。因此,渲染中不会使用任何纹理。
【讨论】:
忘记更改此代码中的 tex[0]。 tex[0] 只是 0 作为整数。还有 glGenTextures 是如何工作的?我在 Java/LWJGL 中找不到用于 OpenGL 的 Javadoc。感谢您的帮助! 我找到了 glGenTextures 部分,但它仍然无法正常工作。你想让我把代码更新成我现在的样子吗? @Diesal11 如果您不介意,那可能会有所帮助,是的【参考方案2】:您是否在项目中启用了纹理?
glEnable(GL_TEXTURE_2D);
或者在你的情况下:
GL11.glEnable(GL_11.GL_TEXTURE_2D);
【讨论】:
以上是关于绘制带纹理的四边形 OpenGL的主要内容,如果未能解决你的问题,请参考以下文章