cargando texturas en C++ OpenGL usando DevIL

Usando C++, estoy tratando de cargar una textura en OpenGL usando DevIL. Después de buscar diferentes segmentos de código, tengo un poco de código hecho (que se muestra a continuación), pero no parece funcionar completamente.

Cargando una textura (Parte de una clase Texture2D):

void Texture2D::LoadTexture(const char *file_name) 
{   
    unsigned int image_ID;

    ilInit();
    iluInit();
    ilutInit();

    ilutRenderer(ILUT_OPENGL);

    image_ID = ilutGLLoadImage((char*)file_name);

    sheet.texture_ID = image_ID;
    sheet.width = ilGetInteger(IL_IMAGE_WIDTH);
    sheet.height = ilGetInteger(IL_IMAGE_HEIGHT);
}

Esto compila y funciona bien. Me doy cuenta de que solo debo hacer ilInit(), iluInit() e ilutInit() una vez, pero si elimino esas líneas, el programa se rompe instantáneamente al cargar cualquier imagen (se compila bien, pero hay errores en tiempo de ejecución).

Mostrando la textura en OpenGL (Parte de la misma clase):

void Texture2D::Draw() 
{

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
    glPushMatrix();

    u = v = 0;

    // this is the origin point (the position of the button)
    VectorXYZ point_TL; // Top Left 

    VectorXYZ point_BL; // Bottom Left
    VectorXYZ point_BR; // Bottom Right
    VectorXYZ point_TR; // Top Right

    /* For the sake of simplicity, I've removed the code calculating the 4 points of the Quad. Assume that they are found correctly. */

    glColor3f(1,1,1);
    // bind the appropriate texture frame
    glBindTexture(GL_TEXTURE_2D, sheet.texture_ID);

    // draw the image as a quad the size of the first loaded image
        glEnable(GL_TEXTURE_2D);
        glBegin(GL_QUADS);
            glTexCoord2f (0, 0);
            glVertex3f  (point_TL.x, point_TL.y, point_TL.z); // Top Left

            glTexCoord2f (0, 1);
            glVertex3f  (point_BL.x, point_BL.y, point_BL.z); // Bottom Left

            glTexCoord2f (1, 1); 
            glVertex3f  (point_BR.x, point_BR.y, point_BR.z); // Bottom Right

            glTexCoord2f (1, 0);
            glVertex3f  (point_TR.x, point_TR.y, point_TR.z); // Top Right
        glEnd();
        glPopMatrix();
    glDisable(GL_BLEND);
    glDisable(GL_TEXTURE_2D);
}

Actualmente, aparece el quad, pero es completamente blanco (el color de fondo que se le da). La imagen que estoy cargando existe y está bien cargada (verificada usando los valores de tamaño cargados).

Otras pocas cosas que debo tener en cuenta: 1) Estoy usando un búfer de profundidad. Escuché que esto no va bien con GL_BLEND. 2) Realmente me gustaría usar la función ilutGLLoadImage. 3) Aprecio el código de ejemplo, ya que soy un novato en openGL y DevIL en su conjunto.

preguntado el 22 de mayo de 12 a las 18:05

¿Está seguro de que hay un contexto OpenGL válido en el momento de cargar la textura? -

Que hace un glGetError() despues de ti ilutGLLoadImage() devolución de llamada? -

@datenwolf: Estoy bastante seguro, pero no del todo. Si pudiera indicarme cómo garantizar que haya un contexto OpenGL válido, me complacería verificarlo. -

@genpfault: no estaba seguro de cómo obtener el resultado de glGetError(), así que usé una declaración if para verificar si glGetError() == GL_NO_ERROR. No ingresa el if, a ambos lados de la instrucción ilutGLLoadImage(). -

Así que estás recibiendo algún tipo de error antes ilutGLLoadImage(). ¿Cuál? estoy apostando GL_INVALID_OPERATION. -

1 Respuestas

Sí, tienes el problema. Puede haber problemas con ilutGLLoadImage().

Intenta hacer las cosas manualmente:

  1. Cargue la imagen usando ilLoadImage
  2. Genere el controlador de textura OpenGL usando glGenTextures
  3. Cargue la imagen en OpenGL glTextImage2D e ilGetData()

Ver este enlace para una solución de trabajo

http://r3dux.org/tag/ilutglloadimage/

Lo sé, esta solución parece ser "un poco" complicada, pero nadie sabe cuánto tiempo pasaría luchando con este error oculto en lo profundo de DevIL.

Otra forma de arreglar las cosas: verifique su código de configuración de textura GL. Cualquier cosa en el filtrado puede ser motivo de GL_INVALID_OPERATION.

Hemos tenido muchas veces el problema de la "textura blanca" al programar las antiguas tarjetas ATI.

¡Oh! La conjetura más grande: texturas sin poder de dos. ¿Es su archivo de textura 2^N por 2^N o algo diferente?

Para usar texturas no rectangulares solo tienes que usar extensiones GL.

Y la otra: ¿estás usando las texturas en el mismo hilo o en el otro? Recuerde que debe glGenTextures() y glBindTexture()/glBegin/glEnd en el mismo hilo.

contestado el 22 de mayo de 12 a las 20:05

Bien. Edité mi función para hacerlo de la misma manera que lo hizo el tutorial (enlace). Parece que recibo un error de infracción de acceso en la línea -exacta- ilLoadImage() (Consulte la línea 22 en el pegado proporcionado). Estoy perplejo :/. Debido a que el código es largo, lo puse en el contenedor de pasta: pastebin.com/TK4yGwHc - Rohit

Bueno, verifique el código de error para la llamada ilBindImage e ilGenImages: Viktor Latipov

Ejecuté llamadas ilGetError() antes y después de ambas declaraciones; ambos devuelven IL_NO_ERROR. - Rohit

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.