Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Ajuste de las coords de textura en DX

Iniciado por XÑA, 23 de Julio de 2008, 11:08:20 AM

« anterior - próximo »

XÑA

Vereis, tengo un conjunto de grafiquitos dentro de una textura. Lo utilizo para hacer un GUI, y por tanto tengo las coordenadas de cada clip que luego utilizo para dibujar un rectángulo con los métodos de D3D, y así puedo tener un GUI propio.

Bien, el problema que tengo es que a veces al dibujarse me coge un pixel más del que toca. Entonces resolví el problema del ajuste sumando 0.5 y restando 0.5:

_TextureClip clip=texture->Clips[clipIndex];

u=(float)(clip.X+0.5f)/(float)texture->GetWidth();
v=(float)(clip.Y+0.5f)/(float)texture->GetHeight();
u2=(float)(clip.X2()-0.5f)/(float)texture->GetWidth();
v2=(float)(clip.Y2()-0.5f)/(float)texture->GetHeight();


Pero el problema que tengo ahora es que en algunos clips, este pixel que me sobraba me falta!

En realidad el problema está en que las coordenadas de textura no se adaptan a los pixels, pero la cuestión es que no sé cómo solucionar este problema.

¿Alguna idea?

Postdata:
Ya resto -0.5/viewport al dibujar el Quad en D3d.

davidgf

Hola!

Si no me equivoco el problema recae en que las texturas son "infinitas", es decir, se repiten infinitamente. En el caso que tengas activado un filtro (anisotropico, linear, etc) usará los pixeles cercanos para interpolar. Si eso lo hace cogiendo el pixel 0,0 lo interpolará con los de al lado, que son los de la esquina contraria.

Por ello te recomiendo que desactives los filtros de textura i pruebes a ver que tal se ve así.

Saludos!

David
Tàrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)


XÑA

El clamp sólo funciona caundo se superan los límites de la textura y ese no es mi caso.

Lo cierto es que debe existir un problema de redondeo, porque sabeis que si queremos asignar una textura a toda la pantalla utilizaríamos las coords de textura: (0,0)-(1,1)

Sin embargo, matemáticamente, si lo hiciéramos con clips, sería:

(0,0)-(639/GetWidth(),479/GetHeight())

Porque el último pixel es el 639,479, no el 640,480.

Pero bueno, sí lo he resuelto quitando el filtro Lineal, por Point!!!  :D

Gracias

davidgf

Hey! Perdonad que conteste ahora, pero po ahi he leido que algo similar sucede en OGL y proponen tralsadar todo 0.375

http://glprogramming.com/red/appendixg.html

Diría que va de lo mismo.

Xau!
Tàrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)






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.