Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: Licantropo23 en 31 de Diciembre de 2006, 05:35:30 PM

Título: Acceso a datos contenidos en textura
Publicado por: Licantropo23 en 31 de Diciembre de 2006, 05:35:30 PM
Hola, mi pregunta es la siguiente:
despues de tener creada una textura y cargada la informacion en ella, ¿hay alguna forma de acceder desde el programa principal a la informacion contenida en la textura?
Lo que quiero hacer es guardar en una textura informacion (por ejemplo posicion, velocidad, etc, de un objeto). Modificar la informacion dentro de un shader. Y por último acceder desde el programa principal a la informacion que ha sido modificada en el shader.
Se hacer mas o menos todo, menos la ultima parte de acceso.
Gracias a todos y feliz año nuevo. :)
Título: Acceso a datos contenidos en textura
Publicado por: Licantropo23 en 31 de Diciembre de 2006, 05:36:36 PM
Perdon se me olvidaba decir que trabajo con c++ y  opengl. Ta luego.
Título: Acceso a datos contenidos en textura
Publicado por: Pogacha en 01 de Enero de 2007, 01:47:03 AM
Si que se puede y se usa regularmente.
Pero la información no se guarda en textura nuevamente sino en el frame-buffer.
La solución es crearte un framebuffer offscreen (mejor muchos render targets) y luego leerlos.
Esto te puede ayudar:
http://www.gamedev.net/reference/programming/features/fbo2/
OpenGL Frame Buffer Object 201

http://www.gamedev.net/reference/programming/features/fbo1/
OpenGL Frame Buffer Object 101

Saludos y feliz año nuevo!
Título: Acceso a datos contenidos en textura
Publicado por: Licantropo23 en 01 de Enero de 2007, 05:33:24 PM
Muchas gracias. Me lo he estado mirando y mas o menos me he enterado de todo. Pero tengo problemas en la actualizacion del buffer dentro del shader. Segun he entendido deberia hacer algo como esto:

Metodo encargado de dibujar la escena:

void __fastcall TGLForm2D::GLScene()
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glBindTexture((GL_TEXTURE_2D, textura)


//Le resto uno, porque los identificadores que devuelven el generador de texturas
//van incrementados en uno.
int a=t->getID()-1;
GLuint handle_azul= program->getUniformLocation("tex");
program->sendUniform(handle_azul,a);

//GLSL

 //Tamaño del array de datos
 int anchodatos=2; int altodatos=2:
   //Array de datos que almacenaremos en una textura
   Vector4 *datos;
   datos=new Vector4[anchodatos * altodatos];
   //Hay 4 pixeles del tipo rgba. Todos son de color rojo
   datos[0]=Vector4(1.0,1.0,0.5,0.0);
   datos[1]=Vector4(1.0,1.0,0.0,0.0);
   datos[2]=Vector4(1.0,1.0,0.0,0.0);
   datos[3]=Vector4(1.0,1.0,0.0,0.0);


    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb);

    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,
                             GL_COLOR_ATTACHMENT0_EXT,
                             GL_TEXTURE_2D,textura,0);

     //paso los datos a la textura
     glTexSubImage2D(GL_TEXTURE_2D,0,0,0,2,2,
                   GL_RGBA,GL_FLOAT,datos);


//OpenGL
glColor3f(1.0f,0.0f,0.0f);
glBegin(GL_QUADS);
  glTexCoord2f(0.0f,0.0f); glVertex2f(0.8*xLeft,0.8*yBot);

  glTexCoord2f(1.0f,0.0f); glVertex2f(0.8*xRight,0.8*yBot);

  glTexCoord2f(1.0f,1.0f); glVertex2f(0.8*xRight,0.8*yTop);

  glTexCoord2f(0.0f,1.0f); glVertex2f(0.8*xLeft,0.8*yTop);
glEnd();

glDisable(GL_TEXTURE_2D);
//GLSL

/********************************
      Leer los datos de framebuffer
********************************/
  //Tamaño del array de datos
   altodato=2; anchodato=2;
   //Array de datos que almacenaremos en una textura
   result=new float[altodato * anchodato*4];

    glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
   glReadPixels(0, 0, 2, 2,GL_RGBA,GL_FLOAT,result);

    r1=result[0];
g1=result[1];
b1=result[2];
d1=result[3];
r2=result[4];
g2=result[5];
b2=result[6];
d2=result[7];
r3=result[8];
g3=result[9];
b3=result[10];
d3=result[11];
r4=result[12];
g4=result[13];
b4=result[14];
d4=result[15];

glFlush();
SwapBuffers(hdc);
}




Codigo del frame shader:


#version 110
void main(){
 gl_FragData[0]=vec4(1.0,1.0,1.0,1.0);

}


Al probarlo los datos que hay en el framebuffer antes de dibujar el cuadrado, son los que le paso por la textura. Hasta ahi bien. El problema esta en que el frame shader no modifica los datos a la salida. Creo que lo hago bien, pero no estoy seguro. Muchas gracias, hasta luego.
[/code]
Título: Acceso a datos contenidos en textura
Publicado por: Licantropo23 en 01 de Enero de 2007, 06:01:02 PM
Bueno, se me habia olvidado meter glDrawBuffer, ahora si que actualiza el buffer, pero no con los valores que le paso.
Título: Acceso a datos contenidos en textura
Publicado por: Licantropo23 en 02 de Enero de 2007, 02:34:22 PM
Ya he conseguido que funcione, el problema que tengo es que en los buffer se carga el color de todos los pixeles que hay en pantalla y a mi lo que me interesa es acceder a los datos que han sido modificados por gl_FragData. Alguien sabe como hacerlo??. Una posibilidad es hacer la textura del tamaño de la pantalla, pero me gustaria hacerlo para cualquier tamaño de textura. Gracias, un saludo y feliz año nuevo.