Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





rectángulo de clipping en OpenGL

Iniciado por NewMac, 12 de Julio de 2007, 02:23:00 AM

« anterior - próximo »

NewMac

Hola,

Estoy haciendo un motorcito 2D usando OpenGL y me gustaría saber el modo de establecer un rectángulo de clipping en la pantalla. He probado a usar glViewport pero esto "achata" los sprites para que entren en el área especificada, y yo simplemente busco que lo que no entre en ese área no se pinte, no que me deforme los sprites. Alguna ayuda?

Gracias.

senior wapo

Lo suyo es glScissor();

Y si no te mola o te activa el render por software, usa el viewport pero acuerdate de compensar la matriz de proyección o te pasará lo que describes.

NewMac

Muchas gracias, parece que glScissor() es lo que busco, pero me ha dejado un poco mosca lo de que te activa el render por software, quieres decir que en algunos ordenadores (en el mio parece que va igual) puede bajar el framerate al hacerlo por software? Si ese es el caso, prefiero usar el glViewport(), aunque lo de compensar la matriz me suene a chino  :oops:

Gracias.

senior wapo

Lo del render por software es algo que digo siempre en OpenGL para curarme en salud.
Dudo que te pase con una tarjeta de video del año 2000 para arriba (por decir algo). Lo digo porque si noto un bajón de rendimiento al hacer algo en OpenGL lo primero que miro es que no me haya saltado el modo software aunque sea para hacer transformación+clipping (sobre todo en Linux).

Lo de ajustar la matriz de proyección (escalado para contrarrestar un viewport mas pequeño y traslación para contrarrestar que 0,0 está siempre en el centro del viewport) es un berenjenal que no te menees (hacer clippng con viewport es una guarreria gordisima) y solo podría compensar si scissor te cambiase a modo software y necesites SI o SI clipping (y aún así no se yo). Porque si no, te renta más pintar todo y que descarte pixels el zbuffer.

Sin ladrillo que he soltado :p

NewMac

Gracias por tus respuestas, SeniorWapo. Rescato el post para no poner uno nuevo, ya que seguiré hablando de OpenGL :)

Como ya comenté, estoy haciendo un motorcillo 2D en OGL, y ahora estaba probando a meter primitivas de dibujo y sprites. Mi problema es con las coordenadas, quisiera saber la forma correcta de indicarselas. A ver si me explico, tengo esta función que dibuja un rectángulo hueco:

void DibujaRect( Vector2 v2T )
{
  glBegin( GL_LINE_LOOP );
     glVertex2f( 0.f, 0.f );
     glVertex2f( v2T.x, 0.f );
     glVertex2f( v2T.x, v2T.y );
     glVertex2f( 0.f, v2T.y );
  glEnd();  
}

Lo dibuja sobre el origen de coordenadas, pero antes de llamar a esta función, establezco una matriz que tiene información de traslación, rotación y escalado. Ahora voy y pinto un rectángulo de 200x200 en la posición 10,10. El resultado es un rectángulo de 200x201 en la posición 10,9 dejando el pixel de arriba a la derecha del rectángulo sin pintar. Vale, empiezo a buscar por google y tal, y me encuentro un factor por el que hay que trasladar los objetos 2d para que se pinten bien (0.375f). Meto que cuando se crea la matriz, además de la traslación del objeto se le añada el factor ese en X e Y. Ejecuto y me crea un rectángulo de 200x201 en la posición 10,10 y deja sin pintar el pixel de abajo a la derecha. Bueno, al menos ahora la posición es correcta :) Como última prueba hice que al pintar el rectángulo se le restara el factor de x e y, ejecuto y ya parece que se pinta bien... coño, que raro, si juraría que probé esto antes y no iba, bueno, es igual.

Después de todo este rollo me gustaría saber:

1º) Lo estoy haciendo de la forma correcta? hay que restar ese factor tanto a la posición como al tamaño?
2º) Al escalar el rectángulo por un factor 1.5f pierde 1px de ancho, al hacerlo por un factor 2.f, pierde 2px, al hacerlo por 2.5f pierde 3px, y creo que así sucesivamente. Que se va de baretas aquí?

Muchas gracias.

senior wapo

-El ajuste se le resta a la posición no al tamaño. La causa es que en OpenGL una coordenada entera (sin decimales) apunta al centro de un pixel.
Si tu pintas algo de ancho 1 pixel justo en la mitad de un pixel pues pintarás parte de ese pixel y parte del siguiente, viéndose afectados 2 pixels en esa dirección. Pintar medio pixel significa que el color que pones se mezcla al 50% con el que había antes de pintar.

- El ajuste a realizar depende de la matriz de proyección usada. Si usas ortho, debería ser de 0.5, si usas una proyección en perspectiva dependerá de la profundidad del vértice y del factor de escala de la  matriz, entre otras cosas.

- Lo que comentas de 1.5, 2 y tal tiene pinta de ser cosa de redondeos.

- Otra cosa, yo pinto en pixels, no ajusto la matriz para cada sprite. Asigno la matriz una vez en modo ortogonal incluyendo el ajuste de medio pixel (creo la matriz a mano sin usar glOrtho) y luego simplemente dibujo en las coordenadas. En vez de dibujar en 0,0 dibujo en x,y.
En tu caso te recomendaría glOrtho y sumar el ajuste cada vez a las coordenadas.

PD: Yo trabajo con una capa de abstracción DirectX/OpenGL asi que si algo sale mal como lo pongo es que he mezclado algo del otro API. Yo me lavo las manos :p

NewMac

- Al principio yo también pintaba como dices, activaba el glOrto, luego el glTranslate( 0.375f, 0.375f, 0.f ) y luego ya hacía el glVertex() con la posición entera del pixel. El motivo por el que he cambiado a matrices es para poder efectuar las transformaciones básicas con los sprites y las primitivas: escalado, traslacion y rotacion. Las 2 primera es fácil montarselo sin nada en particular, simplemente calcular la coordenada y ponerla en glVertex(), pero para las rotaciones ya tendría que girar cada vértice, y no sé, con las matrices me parecía más elegante :)

- Si al comenzar la aplicación a la matriz modelview le hago lo del gltranslate(0.5f, 0.5f, 0.f) ( por cierto, sería en positivo o en negativo como en directx??) ya no hace falta que reste ningún factor a las coordenadas cuando pinte, no? ya se supone que eso lo hace (mientras no toque la matriz modelview)?

- Para guardar coordenadas qué crees que es mejor, usar floats o integers? y para los tamaños? (por ejemplo, el ancho de un sprite) float o int?

Gracias por contestarme, es importante para mi tener estas cosas claras antes de seguir con el motorcillo.






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.