Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





50+50=101! Resolución Del Problema

Iniciado por Haddd, 06 de Febrero de 2004, 09:57:57 PM

« anterior - próximo »

Haddd

 Bueno, al final he resuelto el problema, pero no estoy muy convencido, así que me gustaría que si alguien conoce el porqué final, lo dijera.

Primero, deciros que yo utilizo shaders y que por tanto hay muchas cosas del pipeline que no se tienen que hacer. Para indicar la posición del sprite, yo ya lo paso en Clip Space, que son coordenadas que en X van de -1 a 1.

El problema era que al dibujar dos tiles, aparecía una línea entre ellos. Concretamente los tiles eran de 50x50(Gracias Loover!!)  y el pixel 49 aparecía como si no se hubiera dibujado encima. Yo pensaba que quizás fuera un problema de resolución al pasar a Clip Space, pero después probé a poner algo en la posición 49, y ...¡sí funcionó! Entonces, ya no era cosa de la resolución....

Entonces cree un sprite con 2 pixels de ancho y de alto. Lo renderizé y...¡sólo aparecía 1 pixel!

Es decir, que si yo tenía como coordenadas:

x:0,y:0
x2:49,y2:49

El render en realidad se hacía en 0-48 !!!!  :blink:

Entonces, para resolverlo, sólo he tenido que sumar 1 a x2 y a y2.¡Y ha funcionado!  (uoh)

Después de este alucine, por favor, no penseis que he hecho algo mal. He sido muy metódico y creo que las pruebas que he hecho lo demuestran. He grabado las pantallas del render y con un programa de dibujo comprobaba los pixels y hacía montajes para ver si discernía el problema. ¡Me he pegado una buena panzada!

En fin, si alguien sabe ¡porqué!, por favor, que lo comparta.


jpastor

 No se nada sobre lo que hablas pero se me a ocurrido algo:

x2, y2 ¿no seran alto y ancho?

Siento si esto es una tonteria pero se me ha ocurrido al ver tu ejemplo y a lo mejor a ti se te habia pasado.

Haddd

 No, x2=ancho-1 porque se entiende que x1=0.

Loover

 Pues yo sigo pensando que es el clásico problema de ajuste entre texel y pixel que se resuelve restando -0.5f, xDDD Pero vamos, será alguna movida rara de los PS de los cuales no tengo ni pajolera idea.
Anda que vaya horicas tengo para postear.
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

Haddd

 Loover, no es eso. Mira, si dibujo:

x1=y1=0;x2=y2=49        En realidad se dibuja desde 0 hasta 48

x1=y1=50;                      Desde 50 hasta 98

Según tu lógica, el problema es de -0.5f en TODOS los vértices. Pues no, porque si dibujo

x1=y1=49;                       Desde 49 hasta 97

Es decir, que el origen SI lo coje bien!

ibasurto

 Creo que este problema se debe a como funcionan el rasterizador.

En OpenGL (y es posible que en DirectX sea parecido) es mas o menos asi: un pixel se considera que es "rellenado" por una primitiva (linea, triangulo, quad) si la primitiva incluye el punto central del pixel. El punto central del pixel es el que tiene cordenadas enteras, en tu caso, por ejemplo, seria  (0,50). El pixel se puede ver como una area cuadrada centrada en este punto. Al "rasterizar" una linea de (0,0) a (0,50) le estas indicando una linea que va desde el punto central del pixel (0,0) al punto central del pixel (0,50)  pero sin llegar a incluir el punto central. Esto produce que el ultimo pixel no se rellene (al no estar incluido su punto central). Si sumas una pequeña cantidad a la coordenadas del punto final (no hace falta que sea tanto como 1.0f sino con 0.25f o 0.35f deberia valer) entonces si se rellena el ultimo pixels.

Creo recordar que lei algo de esto en la ayuda de DirectX, sobre como funcionaba el rasterizador... espera dejame que lo busque... aqui este un link a la MSDN:

Rasterization Rules

Como dice en el link esta regla se llama "top-left filling convention" y tiene sentido para poder "encadenar" varias primitivas, empezando una donde acaba la anterior sin rellenar los pixeles comunes dos veces




Loover

 En el ejemplo que pone ibarsuto se ve como el rectángulo de la coordenada 0.5, 0.5 se dibuja en realidad en la 1.0, 1.0 lo que ya no se Hadd es que regla hay que seguir a la hora de convertirlo de -1 a 1 y luego pasarselo al shader, lo que tengo claro es lo del 0,5f. Sin el cuál me da el mismo problema que a ti. Pero sí, perfectamente puede ser otra cosa, pero como tu problema es tan similar al que tuve yo... y encima viendo el link que ha puesto ibarsuto...
Pero nada, tienes razón, tu sumas una cantidad y yo la resto (me rasco la cabeza  :blink: ).

http://msdn.microsoft.com/archive/default....zationrules.asp
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

Loover

 Haz una cosa, prueba a dibujar una textura de fondo blanco y lineas cruzadas negras verticales y horizontales de un solo pixel. A ver si notas alguna anomalía (un escalón). Si es así es que estas ajustando mal el texel con el pixel. Y sino, pues así ya descartamos eso.
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

Haddd

 Gracias Ibasurto, ahora esta clara la explicación. Me imaginaba que era algo del rasterizador, era lo único posible. Ahora pensaré alguna forma lógica de resolverlo.  (ole)

Loover, lo tuyo no tiene que ver. Si miras el Clipping Viewport verás que se suman las coordenadas que tu restas. Por eso tienes que hacer la traslación. Al trabajar en Clip Space, esto se obvia

fiero

 Habia pensado que podria ser el estado D3DRS_LASTPIXEL que hace que se dibuje el último pixel de cada scanline de los triángulos, pero por defecto viene a TRUE así que eso no será, a no ser que lo tengas a FALSE....

un saludo
www.videopanoramas.com Videopanoramas 3D player






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.