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. :)
Perdon se me olvidaba decir que trabajo con c++ y opengl. Ta luego.
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!
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]
Bueno, se me habia olvidado meter glDrawBuffer, ahora si que actualiza el buffer, pero no con los valores que le paso.
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.