2009-04-12 23 views
7

Estoy tratando de descubrir la asignación de texturas en OpenGL y no puedo obtener un ejemplo simple para trabajar.¿El mapa de textura OpenGL simple no funciona?

El polígono se está dibujando, aunque no tiene una textura, sino solo un color sólido. Además, el mapa de bits se está cargando correctamente en sprite1 [] ya que estaba usando glDrawPixels hasta ahora.

Uso glGenTextures para obtener mi nombre de tex, pero noto que no cambia texName1; este GLuint es lo que sea que lo inicie, incluso después de la llamada a glGenTextures ...

He habilitado GL_TEXTURE_2D.

Aquí está el código:

GLuint texName1 = 0; 

glGenTextures(1, &texName1); 
glBindTexture(GL_TEXTURE_2D, texName1); 
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, sprite1[18], sprite1[22], 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, &sprite1[54]); 

glColor3f(1, 1, 0); 
glBindTexture(GL_TEXTURE_2D, texName1); 
glBegin(GL_QUADS); 
    glTexCoord2f (0.0, 0.0); 
    glVertex3f (0.0, 0.0, -5.0f); 
    glTexCoord2f (1.0, 0.0); 
    glVertex3f (.5, 0.0, -5.0f); 
    glTexCoord2f (1.0, 1.0); 
    glVertex3f (.5, .5, -5.0f); 
    glTexCoord2f (0.0, 1.0); 
    glVertex3f (0.0, .5, -5.0f); 
glEnd(); 

ACTUALIZACIÓN: Estoy en una pérdida. Aquí es todo lo que he intentado:

  1. resulta que estaba inicializando la textura de mi antes de OGL se ha inicializado. La textura se inicializa (glGenTextures-> glTexImage2D) en un constructor de clase y se dibuja (glBegin-> glEnd) en una función miembro que se llama cada fotograma. genTextures parece estar funcionando correctamente ahora y obtengo un nombre de 1.

  2. Todas las combinaciones posibles de GL_RGBA8, GL_BGRA_EXT (GL_BGRA no funciona en mi sistema, necesito el _EXT), e incluso eliminé el canal alfa del mapa de bits e intentado todas las combinaciones de GL_RGB, GL_BGR_EXT, etc. etc. Sin suerte.

  3. intentado crear un mapa de bits de procedimiento y el uso que

  4. se aseguró de GL_COLOR_MATERIAL no está habilitado.

  5. Cambió el tamaño del mapa de bits a 32x32.

  6. Probé glTexEnvi en lugar de glTexEnvf.

+1

si texName1 está restante 0 después de glGenTextures debe verificar sus condiciones de error ... –

+0

¿El ancho y el alto están almacenados como byte o int en sprite1 []? –

+1

ancho y alto se almacena como byte little endian. He usado sprite1 [18] y sprite1 [22] con éxito antes con glDrawPixels; ellos son correctos. El mapa de bits tiene solo 29x20 píxeles, por lo que funciona. –

Respuesta

1

Wow ... Bien, he encontrado el problema. Mi llamada a glEnable fue glEnable (GL_BLEND | GL_TEXTURE_2D). Usando glGetError, vi que obtenía un GL_INVALID_ENUM para esta llamada, así que moví GL_TEXTURE_2D a su propia función de habilitación y al bingo. Supongo que O lógico no está permitido para glEnable ...?

De todos modos, muchas gracias a todos por la ayuda ... fue muy informativo para mí.

+1

AFAIK Las constantes OpenGL no son solo potencias de dos, sino valores arbitrarios. Lo que significaría que usar O lógico destruiría la información. – Adam

+1

Las constantes OR-able son estas con -BIT en el nombre, como GL_COLOR_BUFFER_BIT.No muchos de ellos en GL, así que no te acostumbres. – Kos

1

Algunas ideas al azar:

  • GL_COLOR_MATERIAL podría estar habilitado
  • cambio "glTexEnvf" a "glTexEnvi" y ver si eso ayuda
  • si texName1 es 0 después de glGenTextures puede que no tenga un contexto OpenGL activo

Para la comprobación de errores, recomiendo escribir una pequeña función que imprima rea dable salida para los resultados más comunes de glGetErrors y usar eso para encontrar la línea que crea el error. Otra posibilidad sería usar algo como GLIntercept, BuGLe o gDEBugger.

0

Lo primero que verificaría es la configuración del material de color, como menciona ShadowIce, luego verifique su archivo de textura para asegurarse de que sea de un tamaño razonable (es decir, algo así como 256x256) y un mapa de bits RGB. Si el archivo tiene incluso un pequeño problema, NO se procesará correctamente, sin importar cómo lo intente.

Entonces, dejaría de intentar simplemente depurar ese código y en su lugar ver lo que tiene diferente al tutorial on the NeHe website.

NeHe siempre es un buen lugar para comprobar si estás tratando de hacer cosas en OpenGL. Las texturas son probablemente lo más difícil de hacer bien, y solo se vuelven más difíciles a medida que aumenta el resto de tus habilidades GL.

1

Mi OpenGL está oxidado, pero recuerdo haber tenido los mismos problemas con glTexImage2D . Finalmente me las arreglé para hacer que funcione, pero siempre he tenido más suerte con gluBuild2DMipmaps así que acabé con

gluBuild2DMipmaps (
    GL_TEXTURE_2D, type, i.width, i.height, type, GL_UNSIGNED_BYTE, i.data 
); 

que sustituyó

glTexImage2D (
    GL_TEXTURE_2D, 0, type, i.width, i.height, 0, type, GL_UNSIGNED_BYTE, i.data 
); 
+0

Eso suena como un glTexParameter olvidado para el filtro MIN. El valor predeterminado sería GL_NEAREST_MIPMAP_LINEAR, que solo funcionaría con texturas mipmapped. –

3

En sus comentarios, se dice que su mapa de bits es píxeles 29x20. Afaik para generar una textura válida, OpenGL requiere que el tamaño de la imagen (en cada dimensión) sea una potencia de 2. No necesita ser un cuadrado, aunque puede ser un rectángulo. Puede solucionar esto usando algunas extensiones OpenGL como GL_ARB_texture_rectangle.

+1

GL_ARB_texture_rectangle se ha incorporado a OpenGL desde 2.0, http://www.opengl.org/wiki/NPOT_Texture – Kos

6

Además de mentat's note que podría tener un problema con las dimensiones de la textura que no es de potencia de dos, usted menciona que la generación del nombre de la textura no cambia el nombre.

Parece que está llamando demasiado pronto al glGenTextures(), es decir, antes de inicializar OpenGL. Si no es así, sugiero que agregue código justo después de la llamada al glGenTextures() que verifica el estado de error de OpenGL, llamando al glGetError().

+0

Esto funcionó para mí ... Estaba intentando crear texturas antes de la inicialización de OpenGL. Como he visto una y otra vez: el orden de las llamadas a funciones es tan importante en la programación de OpenGL. – chembrad

2

Pondré esto aquí porque tuve el mismo problema y encontré otra publicación explicando el problema. El iPhone es compatible con GL_BGRA (GL_EXT_BGRA) pero aparentemente solo como un formato de entrada y no como un formato interno. Entonces, si cambia la llamada glTexImage2D para tener un formato interno de GL_RGBA entonces funciona.

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, &sprite1[54]); 

Espero que esto ayude a alguien más que tropieza con esta publicación.

+0

Me encantaría saber más sobre esto, ya que me ha estado confundiendo. Parece que poner BGRA como un formato interno funciona, pero en realidad está usando RGBA. ¿O estoy equivocado? – akaru