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:
(http://img259.imageshack.us/img259/1633/faena9ff.th.png) (http://img259.imageshack.us/my.php?image=faena9ff.png)
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
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.
He hecho la prueba poniendo 0.9 y el borde izquierdo amarillo sigue teniendo un poco de rojo:
(http://img292.imageshack.us/img292/7526/dibujo4yd.th.png) (http://img292.imageshack.us/my.php?image=dibujo4yd.png)
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?
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...
CitarSe me ocurre que podrias usar D3DTADDRESS_CLAMP
Ahora si que ya esta solucionado, muchas gracias grey.
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);
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.