OpenGL Рисование Текстур - PullRequest
1 голос
/ 08 апреля 2011

Мне нужно сопоставить текстуру с квадратом в трехмерном пространстве.

Это то, что у меня есть:

#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();
}

Но квадрат пустой белый.Я думаю, что Bitmap - это класс, предоставляемый университетом.Я могу предоставить его, если вам нужно.

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 08 апреля 2011

Вам нужно инициализировать GLUT до вызова функций OpenGL, таких как glEnable. В противном случае они не будут работать, потому что они требуют наличия контекста OpenGL, а glutCreateWindow - это метод, который создает такой контекст.

1 голос
/ 08 апреля 2011

1) вам нужно инициализировать и создать окно перед любым вызовом opengl
2) Ваш звонок на gluBuild2DMipmaps неправильный. Цель должна быть GLU_TEXTURE_2D
3) когда закончите рендеринг (после glEnd();), позвоните glDisable(GL_TEXTURE_2D);

Вы также можете проверить наличие ошибок opengl, используя glGetError после каждого вызова opengl. Это должно сказать вам, какой звонок не удался и почему. Проверьте справочные страницы неудачного вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...