OpenGL 绘制纹理

Posted

技术标签:

【中文标题】OpenGL 绘制纹理【英文标题】:OpenGL Drawing Textures 【发布时间】:2011-04-08 07:59:04 【问题描述】:

我需要将纹理映射到 3D 空间中的正方形。

这是我目前所拥有的:

#include "Display.h"
#include "Bitmap.h"
#include "Glut/glut.h"
#include "GL/gl.h"
#include "GL/glu.h"

Bitmap Display::m_HeightMap;
unsigned int Display::m_TextureID;

void Display::Init(int argc, char ** argv)

    glEnable(GL_TEXTURE_2D);
    Bitmap image;
    image.loadBMP("myTexture.bmp");

    glGenTextures(1, &m_TextureID); //Generates 1 texture, puts the ID in m_TextureID
    glBindTexture(GL_TEXTURE_2D, m_TextureID); //Sets m_TextureID as the current textureID
    //All below are just functions to set up the rendering modes of the texture
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

    gluBuild2DMipmaps(GL_TEXTURE_2D, 3, image.width, image.height, GL_RGB, GL_UNSIGNED_BYTE, image.data); //Copy image to graphics card

    glutInit(&argc, argv); // initializes glut
    // sets display mode. These parameter set RGB colour model
    // and double buffering.
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutCreateWindow("OpenGL Tutorial");
    // Set glut callback functions
    glutDisplayFunc(Display::DisplayScene);
    glutIdleFunc(Display::Idle);
    glutReshapeFunc(Display::Resize);
    // Begin glut main loop
    glutMainLoop();


void Display::DisplayScene()

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear the back buffer

    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, m_TextureID);

    glBegin(GL_QUADS);
        glTexCoord2f(0.0f, 1.0f);
        glVertex3f(-2, 2, -3);
        glTexCoord2f(1.0f, 1.0f);
        glVertex3f(2, 2, -3);
        glTexCoord2f(1.0f, 0.0f);
        glVertex3f(2, -2, -3);
        glTexCoord2f(0.0f, 0.0f);
        glVertex3f(-2, -2, -3);
    glEnd();

    glutSwapBuffers(); // Swap the front and back buffers


void Display::Resize(int w, int h)

    /* Resize is called when window is resized */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glViewport(0,0,w,h);
    gluPerspective(45, (float)w/(float)h, 1, 1000);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0,0,10,
        0,0,0,
        0,1,0);


void Display::Idle()

    /* When nothing else is happening, idle is called.
     * Simulation should be done here and then
     * the display method should be called
     */
    glutPostRedisplay();

但正方形是空白的白色。位图是大学提供的一门课,我想。如果你需要,我可以提供。

我做错了什么?

【问题讨论】:

【参考方案1】:

您需要在调用 OpenGL 函数(如 glEnable)之前初始化 GLUT。否则它们将无法工作,因为它们需要存在 OpenGL 上下文,而 glutCreateWindow 是创建此类上下文的方法。

【讨论】:

谢谢。我交换了 Display::Init 中的两个“段”代码,但无济于事。还有别的吗?【参考方案2】:

1) 在进行任何 opengl 调用之前,您需要初始化并创建窗口 2) 您拨打gluBuild2DMipmaps 是错误的。目标必须是GLU_TEXTURE_2D 3) 渲染完成后(glEnd();之后),调用glDisable(GL_TEXTURE_2D);

您还可以在每次调用 opengl 后使用 glGetError 检查 opengl 错误。那应该告诉您哪个呼叫失败以及原因。检查失败调用的参考页面。

【讨论】:

他正在调用 gluBuild2DMipmaps。 嗨,谢谢,我将函数调用更改为 gluBuild2DMipmaps(GLU_TEXTURE_2D 但我得到“GLU_TEXTURE_2D 未定义”...我缺少哪些内容? img855.imageshack.us/img855/4332/glu.png :) 编辑:好的,它的功能有误,但你明白了 @Motig 参考页面说参数必须是 GLU_TEXTURE_2D。你可以试试 GL_TEXTURE_2D GL_TEXTURE_2D 编译,但我仍然得到一个白色方块。没有纹理。

以上是关于OpenGL 绘制纹理的主要内容,如果未能解决你的问题,请参考以下文章

OpenCL - 绘制到 OpenGL 纹理崩溃

在 OpenGL 中绘制多个 2D 纹理

OpenGL 绘制纹理

我的OpenGL学习进阶之旅关于OpenGL ES 绘制纹理,因为加载纹理坐标设置错误,导致纹理无法渲染的问题

我的OpenGL学习进阶之旅关于OpenGL ES 绘制纹理,因为加载纹理坐标设置错误,导致纹理无法渲染的问题

用OpenGL绘制多纹理?