Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Bordes raros en d3d9 y ogl (point y linear)

Iniciado por zupervaca, 21 de Enero de 2007, 12:36:14 AM

« anterior - próximo »

zupervaca

Hola me he dado cuenta que d3d9 y ogl sucede algo extraño cuando pones el filtro linear a una textura.
Una imagen vale mas que mil palabras:

Si os fijais detenidamente los bordes con el filtro point son perfectos, pero resulta que al poner el filtro linear el borde izquierdo amarillo coge un poco del color rojo del borde derecho y viceversa.
¿Alguien sabe solucionar esto?

PD: Es un ejemplo de codesampler, como a mi me pasaba en las rutinas que tenia lo descarge para salir de dudas, lo podeis ver en vivo aqui: http://www.codesampler.com/dx9src/dx9src_3.htm#dx9_texture_filtering

_Grey

El maximo de la textura, en la parte de abajo y la derecha, no deberia ser 1.0 sino 0.9999 o asi. No te sabria decir por que le pasa en un ejemplo y no en otro, pero si la textura se puede repetir (D3DTADDRESS_WR) la repeticion empieza en el segundo entero 0.0==1.0==2.0==3.0.

Hace mucho qu eno toco D3D... bueno y casi todo de 3D ... o ya puestos, codigo, que uno se hace viejo, pero tambien recuerdo que se puede variar el "centro del pixel de la textura" o algo asi, de todas formas ese problema se deberia solucionar cambiando los 1.0 por simplemente 0.9999.

Espero que sea de ayuda, saludos.

zupervaca

He hecho la prueba poniendo 0.9 y el borde izquierdo amarillo sigue teniendo un poco de rojo:

Tambien he probado a empezar en 0.02 y se quita, pero pierdo un pixel de la textura, me parece que el problema es que para calcular el punto 0,0 de la textura tiene en cuenta los de su alrededor, en este caso seria la otra esquina de la textura. ¿Alguna idea mas?

_Grey

ups! Ahora que lo recuerdo, el ultimo pixel de cada linea que forma el triangulo no se pinta, con lo que no deberia haber problema con 1.0.. .sorry  :oops: ... o eso creo recordar...


Se me ocurre que podrias usar D3DTADDRESS_CLAMP en el SetTextureStageState(), asi, conservarias el color de "su" borde. Pero si tienes una "gran" textura con todas las demas dentro para minimizar los cambios de estado igual no te servira... :?

No se me ocurre mucho mas.. si alguien mas se anima...

zupervaca

CitarSe me ocurre que podrias usar D3DTADDRESS_CLAMP
Ahora si que ya esta solucionado, muchas gracias grey.

Ithaqua

Para OpenGL usa:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Requiere opengl 1.2, que ya es wraro wraro que no lo soporte alguien. En todo caso si no detectas ogl 1.2 usa:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
thaqua^Stravaganza
http://ithaqua.stravaganza.org

Pogacha

Y en Direct3d los pixeles se dibujan a partir de X.5 y si dibujas en X.0 dependiendo de los filtros extras(asynontropico, antializing) que tenga la placa se dibujara el pixel anterior.






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.