Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Acceso a datos contenidos en textura

Iniciado por Licantropo23, 31 de Diciembre de 2006, 05:35:30 PM

« anterior - próximo »

Licantropo23

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. :)

Licantropo23

Perdon se me olvidaba decir que trabajo con c++ y  opengl. Ta luego.

Pogacha

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!

Licantropo23

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]

Licantropo23

Bueno, se me habia olvidado meter glDrawBuffer, ahora si que actualiza el buffer, pero no con los valores que le paso.

Licantropo23

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.






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.