Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema con glTexSubImage

Iniciado por Fran, 24 de Enero de 2007, 01:17:53 AM

« anterior - próximo »

Fran

Como tengo claro que sabreis los que programeis en OpenGL esta funcion se usa para actualizar texturas. Pues bien. No me funciona ni a tiros. Me da un invalid value y no hay manera de q lo actulice.

Estoy usando para crear la textura por primera vez un glTexImage2D y después para usarlo esto. Hay q tener algo en cuenta que se me escapa? Por supuesto las texturas son potencias de dos. El formato es GL_RGB

Pogacha

Las estás bindeando previamente?
Está activado el GL_TEXTURE2D?
No estas dentro de un bucle glBegin( ... ); glEnd();
Si pones un poco de codigo tal vez se vea mas facil el fallo.
Saludos

Fran

private void maketexturegl(Texturas textura,GL gl)
    {

        float max[]=new float[1];
        if (textura.OpenGLid==-1)
        {    

          gl.glGenTextures(1,texture,0);

          textura.OpenGLid=texture[0];

          gl.glBindTexture(GL.GL_TEXTURE_2D, textura.OpenGLid);
         
          gl.glGetFloatv(GL.GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT,max,0);
          gl.glTexParameterf(GL.GL_TEXTURE_2D,GL.GL_TEXTURE_MAX_ANISOTROPY_EXT, max[0]);
          gl.glTexParameteri(GL.GL_TEXTURE_2D,GL.GL_TEXTURE_MAG_FILTER,GL.GL_NEAREST);

          gl.glTexParameteri(GL.GL_TEXTURE_2D,GL.GL_TEXTURE_MIN_FILTER,GL.GL_NEAREST);
          gl.glTexImage2D(GL.GL_TEXTURE_2D,0,3,textura.width,textura.height,0,GL.GL_RGB,
           GL.GL_UNSIGNED_BYTE,textura.getBuffer());


        }
        else if (textura.OpenGLid<-2)
        {
          //Revertirlo xq ya sabes q entras bien. Ahora hay q ponerlo bien para usarlo  
          textura.OpenGLid=-textura.OpenGLid-2;  
          //situate en la textura en concreto
         
          gl.glBindTexture(GL.GL_TEXTURE_2D, textura.OpenGLid);  
         
          gl.glTexSubImage2D(GL.GL_TEXTURE_2D,0,0, 0,textura.width,textura.height,GL.GL_RGB,
           GL.GL_UNSIGNED_BYTE,textura.getBuffer());
         
         
          int error=gl.glGetError();
          if (error!=GL.GL_NO_ERROR)
          {
            if (error==GL.GL_INVALID_OPERATION)
                System.out.println("invalid");
            else
               System.out.println(myGLU.gluErrorString(error));
          }

        }    
       else
          gl.glBindTexture(GL.GL_TEXTURE_2D,textura.OpenGLid );
       
    }

marcode

A mí me da que es por la historieta esa del revertido.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

Fran

Cita de: "marcode"A mí me da que es por la historieta esa del revertido.

Eso pensaba yo, pero le pongo el ID a pelo y tb falla. Es para decirle q en ese ID la textura tiene q ser actualizada. Eso no es. Las texturas son multiplos de 2 (512x512). LO q quiero saber todo es si eso se hace asi y si hay problema en q el modo sea RGB (toods los ejemplos q he visto son RGBA). Hay una cosa q me llama la atención del tema este. Pongas en el orden que pongas la creacion de las texturas, esa siempre toma el id=8. Eso me mosquea y mucho. (se crean 40 mas menos)

marcode

glGetError te da (y saca) el último error de la pila que han producido las llamadas a OpenGL, que igual no tiene porqué ser de esa función, ¿has reparado en eso?
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

Fran

Cita de: "marcode"glGetError te da (y saca) el último error de la pila que han producido las llamadas a OpenGL, que igual no tiene porqué ser de esa función, ¿has reparado en eso?

Sí. He probado a ver si era de la BindTexture y esa no da error aparentemente.

Fran

Cita de: "marcode"glGetError te da (y saca) el último error de la pila que han producido las llamadas a OpenGL, que igual no tiene porqué ser de esa función, ¿has reparado en eso?

Sí. He probado a ver si era de la BindTexture y esa no da error aparentemente. Yo creo (lo voy a probar esta noche) q realmente (xq me parece muy sospechoso) q no tiene los ids bien. Te los va dando en orden segun se crean las texturas?

marcode

glGenTextures te va dando los IDs en orden desde el 1, porque no es más que una función de ayuda que te da el primero sin usar. Si borras una textura el ID queda libre y te lo da la siguiente vez que solicites uno.

Pero puedes usar y asignar los IDs que te de la gana a cada textura por tu cuenta y riesgo.

Otro par de detalles, que no puedes usar glGenTextures en Display List, y si llamas glGetError entre glBegin y glEnd te da GL_INVALID_OPERATION


PD:

Bueno, de lo último no estoy seguro, mejor hago un copy/paste y que saques tus conclusiones

Citar
 GL_INVALID_OPERATION is generated if glBegin is executed
     between a glBegin and   the corresponding execution of glEnd.

     GL_INVALID_OPERATION is generated if glEnd is   executed
     without being   preceded by a glBegin.

     GL_INVALID_OPERATION is generated if a command other than
     glVertex, glColor, glIndex, glNormal,   glTexCoord,
     glEvalCoord, glEvalPoint, glArrayElement, glMaterial,
     glEdgeFlag, glCallList, or glCallLists is executed between
     the execution   of glBegin and the corresponding execution
     glEnd.

     Execution of glEnableClientState, glDisableClientState,
     glEdgeFlagPointer, glTexCoordPointer,   glColorPointer,
     glIndexPointer, glNormalPointer,
     glVertexPointer, glInterleavedArrays,   or glPixelStore   is not
     allowed after   a call to glBegin and before the corresponding
     call to glEnd, but an   error may or may not be   generated.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

Pogacha

Cita de: "Fran"else if (textura.OpenGLid<-2)
        {
          //Revertirlo xq ya sabes q entras bien. Ahora hay q ponerlo bien para usarlo  
          textura.OpenGLid=-textura.OpenGLid-2;  
Hablaste que usar rtti era una mala practica y veo ahora esto y no se que decir ... no es por tirar mala onda, me parece que tendrás que limpiar un poco el codigo, sino aparecen errores que no sabes de donde salen.


Saludos.

Fran

Cita de: "Pogacha"
Cita de: "Fran"else if (textura.OpenGLid<-2)
        {
          //Revertirlo xq ya sabes q entras bien. Ahora hay q ponerlo bien para usarlo  
          textura.OpenGLid=-textura.OpenGLid-2;  
Hablaste que usar rtti era una mala practica y veo ahora esto y no se que decir ... no es por tirar mala onda, me parece que tendrás que limpiar un poco el codigo, sino aparecen errores que no sabes de donde salen.


Saludos.

;)

Fran

Gracias marcode. He revisado el código y era "no puedes usar glGenTextures en Display List". No lo sabia. Tengo q aprender a leer más despacio






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.