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
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
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 );
}
A mí me da que es por la historieta esa del revertido.
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)
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?
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.
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?
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.
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.
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.
;)
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