Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Menu

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menu

Mensajes - Licantropo23

#1
Hola, he encontrado esto. Dice que si que existe un limite de ciclos que es de 64k.
http://www.gpgpu.org/forums/viewtopic.php?p=10977&sid=6be52cf26c0930928c7ebe6bf757def8

No hay ninguna manera de eliminarlo, asi que me tocará pensar como codificarlo, para realizar pasadas mas pequeñas.

Ta luego.
#2
Hola, tengo un problema con el uso de fragment shaders. Lo que pasa es que quiero realizar una serie de calculos, estos calculos son algo costosos en cuanto a tiempo. El problema que tengo, es que al hacer la pasada por el shader, no se llegan a realizar todos los calculos. Supongo que esto depende de la pontencia de la tarjeta grafica, pero tampoco lo se seguro. ¿Alguien sabe si existe un tiempo maximo que puede ser usado en el shader y una vez consumido este tiempo aborta la ejecucion? He hecho la siguiente prueba:


#version 110

void main(){
       float tiempo=0;
       while(tiempo<1000){
           tiempo=tiempo+1;
       }
 gl_FragData[0].x=tiempo;
}


Tras realizar esta prueba he visto que tan solo me realiza 232 pasadas.
Otra prueba que he hecho es poner un bucle infinito y tampoco se queda colgado, asi que supongo que existe un tiempo de procesado para cada fragmento y cuando se supera se abortan los calculos. No se si habra alguna forma de configurarlo para que esto no sea asi. Si alguien sabe algo del tema le estaria muy agradecido de que me lo dijese. Bueno, muchas gracias a todos. Buscare por internet a ver si encuentro algo y si lo encuentro, escribo aqui lo que haya encontrado. Ta luego.
#3
Hola, tengo un problema a la hora de usar los fragment shader. El problema es que tengo varias texturas de entrada, pero el shader confunde la lectura de las texturas. Tengo dos texturas y de una de ellas me lee bien, pero en la segunda me lee de la primera. Supongo que es un problema de los manejadores que uso para las texturas.

El codigo del shader es el siguiente:


#version 110

uniform samplerRect texposicion;
uniform samplerRect texvelocidad;
uniform float epsilon;

void main(){
 

 vec4 posicion1 = textureRect(texposicion,vec2(gl_TexCoord[0].s,0.5));
 vec4 velocidad1 = textureRect(texvelocidad,vec2(gl_TexCoord[0].s,0.5));
vec4  posicion2 = textureRect(texposicion,vec2(gl_TexCoord[0].t,0.5));
 vec4 velocidad2 = textureRect(texvelocidad,vec2(gl_TexCoord[0].t,0.5));
   vec4 colision;
  /*Calulos: uso las posiciones y velocidades y en colision guardo la normal de colision y el tiempo de colision
  .....
  */
  gl_FragData[0]=colision;
}



Como digo la textura de posicion me la lee bien, pero la de velocidad me la lee como si fuese la de posicion.

El codigo que tengo para prepar la llamada del shader es:


/*******************************
*Se preparan las texturas de entrada*
********************************/  

programa->use();

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texturaPosicion->getId());
GLuint manejador= programa->getUniformLocation("texposicion");
programa->sendUniform(manejador,0);


glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texturaVelocidad->getId());
manejador= programa->getUniformLocation("texvelocidad");
programa->sendUniform(manejador,1);

/*A continuacion se prepararian las texturas de salida
...
*/

//Generador del flujo, para usar shader
glBegin(GL_QUADS);
       glTexCoord2f(0,0); glVertex2f(0,0);
       glTexCoord2f(ancho,0); glVertex2f(ancho,0);
       glTexCoord2f(ancho,alto); glVertex2f(ancho,alto);
       glTexCoord2f(0,alto); glVertex2f(0,alto);

glEnd();

programa->disable();



El problema yo creo que esta en esta parte de aqui:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texturaPosicion->getId());
GLuint manejador= programa->getUniformLocation("texposicion");
programa->sendUniform(manejador,0);

Pero lo que no se es el que.

Muchas gracias. Hasta luego.
#4
General Programadores / Seguimiento de paredes
08 de Marzo de 2007, 01:40:18 PM
Gracias a los dos. Ya casi lo tengo funcionando, aunque para algunos casos me da problemas. A ver si lo soluciono. Cuando lo tenga si a alguien le interesa dejo el código por aquí. Un saludo y hasta luego.
#5
General Programadores / Seguimiento de paredes
07 de Marzo de 2007, 10:55:50 AM
Hola de nuevo, ahora si me ha quedado más claro. Me pondré a hacerlo y ya os cuento que tal. Muchas gracias. Hasta luego.
#6
General Programadores / Seguimiento de paredes
06 de Marzo de 2007, 11:00:49 PM
Hola, muchas gracias por contestar. No he llegado a entenderlo del todo. Según dices, proyectaria d sobre una de las paredes y obtendria un vector. Ese vector lo proyectaria sobre otra de las paredes y asi sucesivamente hasta recorrer todas las pardes, no?. Supongo que lo he entendido mal, porque de esta forma el orden de recorrido de las paredes influye en la direccion final obtenida. Si me lo puedes explicar con un poco mas de detalle te estaría muy agradecido. Hasta luego y muchas gracias.
#7
General Programadores / Seguimiento de paredes
06 de Marzo de 2007, 08:19:05 PM
Hola, estoy programando un juego. Lo que os quiero preguntar es si sabeis como hacer para que un personaje (envuelto en un cilindro) al colisionar siga la direccion de la pared. Hay que tener en cuenta que puede colisionar con varias paredes a la vez y que las paredes pueden tener cualquier rotacion. El juego es en 3D, la deteccion de la colision con las paredes ya la tengo hecha. A la hora de calcular la direccion que debe seguir se puede simplificar a 2D, mirando desde arriba. Os pongo una imagen de ejemplo:



d es la direccion que lleva el personaje y d' la direccion que en realidad seguirá.

Llevo pensándolo unos cuantos días pero no se me ocurre como hacerlo, muchas gracias por todo. Hasta luego.
#8
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.
#9
Bueno, se me habia olvidado meter glDrawBuffer, ahora si que actualiza el buffer, pero no con los valores que le paso.
#10
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]
#11
Programación gráfica / Acceso a datos contenidos en textura
31 de Diciembre de 2006, 05:36:36 PM
Perdon se me olvidaba decir que trabajo con c++ y  opengl. Ta luego.
#12
Programación gráfica / Acceso a datos contenidos en textura
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. :)
#13
Ok, no pasa nada si yo no es que sepa mucho, por eso te preguntaba que porque estaba mal, porque yo lo veia bien. Ahora mismo solo estoy haciendo pruebas para ir familiarizandome con los shaders. Mas adelante ya me metere con mas profundidad. Muchas gracias a todos por contestar.
#14
Ok, muchas gracias. Entonces creo que es por eso. En cuanto a una tarjeta grafica decente y no muy cara?
#15
Hola de nuevo. Se que hay dos tipos de shader, pero debido a mi tarjeta solo puedo utilizar el vertex shader. ¿Por que esta mal? ¿No se puede usar texture2D en vertex shader? En el libro que me he leido pone que se puede usar tanto en vertex shader, como en fragment shader. Gracias por contestar.





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.