Manejo de errores en OpenGL

Muchas de las funciones de la API de OpenGL son muy útiles y potentes. Pero es muy posible que los programas OpenGL puedan contener errores. Por lo tanto, se vuelve importante aprender el manejo de errores en los programas OpenGL. Las bibliotecas OpenGL y GLU tienen un método simple para registrar errores. Cuando un programa OpenGL encuentra un error en una llamada a una rutina de biblioteca base o una rutina GLU, registra un código de error internamente y se ignora la rutina que causó el error. Aunque, OpenGL registra solo un único código de error en un momento dado. OpenGL utiliza sus propios métodos para detectar errores. Una vez que ocurre un error, no se registrará ningún otro código de error hasta que el programa consulte explícitamente el estado de error de OpenGL.

Sintaxis:

código GLenum;
código = glGetError();

Esta llamada de función devuelve el código de error actual y borra el indicador de error interno:

  • Si el valor devuelto es igual a la constante simbólica GLNOERROR OpenGL, todo está bien.
  • Si hay algún otro valor devuelto, indica que se ha producido un problema.

La biblioteca base de OpenGL proporciona una definición para una serie de constantes simbólicas que representan diferentes condiciones de error. La biblioteca GLU también define una serie de códigos de error, pero la mayoría de ellos tienen nombres casi sin sentido, como GLUNURBSERROR1 , GLUNURBSERROR2 , etc.

La biblioteca GLU contiene una función que devuelve una string descriptiva para cada uno de los errores de GLU y GL. Para usarlo, primero recupere el código de error actual y luego páselo como parámetro a esta función. El valor devuelto se puede imprimir utilizando las funciones de la biblioteca estándar de C, como la función fprintf() .

A continuación se muestra el fragmento de código para implementar el enfoque anterior:

C

#include <stdio.h>
GLenum code;
  
const GLubyte* string;
code = glGetError();
string = gluErrorString(code);
fprintf(stderr, "OpenGL error: %s\n", string);

Explicación: el valor devuelto por gluErrorString apunta a una string ubicada dentro de la biblioteca GLU. Dado que no es una string asignada dinámicamente , el programa no debe desasignarlo explícitamente. Además, no debe ser modificado por el programa (por lo tanto, el modificador const en la declaración de string). Es bastante fácil encapsular estas llamadas a funciones en una función general de informe de errores en el programa.

La función dada a continuación recuperará el código de error actual, imprimirá la string de error descriptiva y devolverá el código a la rutina de llamada:

C

// C program for the above approach
#include <stdio.h>
  
GLenum errorCheck()
{
    GLenum code;
    const GLubyte* string;
    code = glGetError();
    if (code != GL_NO_ERROR) {
        string = gluErrorString(code);
        fprintf(stderr, "OpenGL error: %s\n", string);
    }
    return code;
}

Explicación: De forma predeterminada, glGetError solo imprime números de error, lo que no es fácil de entender a menos que ya se hayan memorizado los códigos de error. Por lo tanto, a menudo tiene sentido escribir una pequeña función de ayuda para imprimir fácilmente las strings de errores junto con el lugar donde se llamó a la función de verificación de errores:

GLenum glCheckError_(const char *file, int line)
{
    GLenum errorCode;
    while ((errorCode = glGetError()) != GL_NO_ERROR)
    {
        std::string error;
        switch (código de error)
        {
            case GL_INVALID_ENUM: error = “INVALID_ENUM”; descanso;
            case GL_INVALID_VALUE: error = “INVALID_VALUE”; descanso;
            case GL_INVALID_OPERATION: error = “INVALID_OPERATION”; descanso;
            case GL_STACK_OVERFLOW: error = “STACK_OVERFLOW”; descanso;
            caso GL_STACK_UNDERFLOW: error = “STACK_UNDERFLOW”; descanso;
            case GL_OUT_OF_MEMORY: error = “OUT_OF_MEMORY”; descanso;
            caso GL_INVALID_FRAMEBUFFER_OPERATION: error = “INVALID_FRAMEBUFFER_OPERATION”; descanso;
        }
        estándar::cout << error << ” | ” << archivo << ” (” << línea << “)” << std::endl;
    }
    devuelve el código de error;
}
#define glCheckError() glCheckError_(__FILE__, __LINE__) 

Es útil saber con mayor precisión qué llamada glCheckError devolvió el error si alguna de estas llamadas glCheckError está agrupada en nuestra base de datos.

glBindBuffer(GL_VERTEX_ARRAY, vbo);
glCheckError();

Ejemplo de salida:

Publicación traducida automáticamente

Artículo escrito por krish_45 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *