2010-01-10 14 views
13

Todos los días, Estoy dando vueltas en círculos aquí, pero creo que estoy buscando en los lugares equivocados.Textura OpenGL Cargando

Mi pregunta es cómo voy a hacer para cargar una imagen y aplicarla a una primitiva en OpenGL. Por ejemplo, cargar un bmp o jpg y aplicarlo a una esfera de gluts.

¿La solución se limitaría a una plataforma o podría funcionar en todas?

Gracias por su ayuda

Respuesta

1

Podría ser más compleja de lo que cabría esperar.

Antes que nada, estoy bastante seguro de que no se puede texturizar una esfera dibujada usando glutSolidSphere, ya que esa función no especifica las coordenadas de textura para los vértices que dibuja. Por lo tanto, deberá codificar un método para dibujar una esfera, ya sea vértice por vértice o utilizando un búfer de vértice, y asegúrese de especificar las coordenadas de textura para cada vértice.

Una vez hecho esto, debe cargar sus imágenes. OpenGL no proporciona funciones para cargar imágenes desde archivos y, si mal no recuerdo, glu y glut tampoco lo hacen. Por lo tanto, tendrá que leer el archivo de imagen usted mismo o utilizar una biblioteca que lo haga. DevIL es uno de ellos.

Una vez que tenga los datos de píxel de la imagen, debe crear una nueva textura OpenGL utilizándola. Algunas bibliotecas de carga de imágenes pueden hacer esto por usted. DevIL puede.

Recomiendo googlear algunos tutoriales, pero por favor no use los tutoriales de NeHe, su calidad es generalmente bastante pobre.

2

Existen infinitas formas de mapear textura de una imagen en una esfera. Puede mirar los comandos gltexgen para generar automáticamente coordenadas de textura para una esfera de exceso.

20

Bueno, si lo desea, puede escribir su propio cargador bmp. Here es la especificación y algo de código. De lo contrario, tengo un cargador tga here. Una vez que lo haga, devolverá los datos en una matriz de caracteres sin signo, también conocida como GL_UNSIGNED_BYTE.

Para crear una textura OpenGL a partir de esta matriz, primero debe definir una variable que sirva como referencia para esa textura en la memoria de OpenGL.

GLuint textureid; 

Entonces, es necesario contar con OpenGL para hacer espacio para una nueva textura:

glGenTextures(1, &textureid); 

Entonces, es necesario obligar a que la textura como la textura usada actualmente.

glBindTexture(GL_TEXTURE_2D, textureid); 

Finalmente, debe decirle a OpenGL dónde están los datos para la textura actual.

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, your_data); 

Entonces, cuando se procesa una primitiva, que se aplican a la primitiva llamando glBindTexture nuevo:


glBindTexture(GL_TEXTURE_2D, textureid); 
glBegin(GL_QUAD); 
    glTexCoord2f(0.0, 0.0); 
    glVertex3f(0.0, 0.0, 0.0); 
    glTexCoord2f(1.0, 0.0); 
    glVertex3f(1.0, 0.0, 0.0); 
    glTexCoord2f(1.0, 1.0); 
    glVertex3f(1.0, 1.0, 0.0); 
    glTexCoord2f(0.0, 1.0); 
    glVertex3f(0.0, 1.0, 0.0); 
glEnd(); 

Sin embargo, cualquier momento de aplicar la textura a una primitiva, es necesario tener la textura datos de coordenadas junto con datos de vértice, y glutSolidSphere no genera datos de coordenadas de textura.Para texturizar una esfera, puedes generarla tú mismo o llamar a las funciones de texgen o usar sombreadores.

1

Ned lo ha descrito muy bien. Deberías leer el tutorial en NeHe, donde cada paso se describe en detalle. Como han señalado otros, texturizar quad sería un buen comienzo y la esfera puede ser un poco complicada.

1

Eso es curioso, los TGA fueron el primer tipo de archivo de imagen que pude cargar con éxito en una textura. Lamentablemente, OpenGL no tiene sus propias funciones API integradas para leer archivos directamente. Por lo tanto, se necesitarían bibliotecas o códigos externos. El formato TGA es sencillo y Ned le ha proporcionado un buen código.