Pregunta

He creado una imagen PNG en photoshop con transparencias que he cargado en el programa y OpenGL. He binded a una textura y en el programa de las miradas imagen borrosa y no estoy seguro de por qué.

alt text http://img685.imageshack.us/img685/9130/upload2 .png

alt text http://img695.imageshack.us/img695/2424/upload1e .png

Cargando Código

// Texture loading object
nv::Image title;

// Return true on success
if(title.loadImageFromFile("test.png"))
{
    glGenTextures(1, &titleTex);
    glBindTexture(GL_TEXTURE_2D, titleTex);
    glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
    glTexImage2D(GL_TEXTURE_2D, 0, title.getInternalFormat(), title.getWidth(), title.getHeight(), 0, title.getFormat(), title.getType(), title.getLevel(0));
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16.0f);
}

else
    MessageBox(NULL, "Failed to load texture", "End of the world", MB_OK | MB_ICONINFORMATION);

código de visualización

glEnable(GL_TEXTURE_2D);    
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture(GL_TEXTURE_2D, titleTex);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTranslatef(-800, 0, 0.0);
glColor3f(1,1,1);

glBegin(GL_QUADS);
    glTexCoord2f(0.0, 0.0); glVertex2f(0,0);
    glTexCoord2f(0.0, 1.0); glVertex2f(0,600);
    glTexCoord2f(1.0, 1.0); glVertex2f(1600,600);
    glTexCoord2f(1.0, 0.0); glVertex2f(1600,0);
glEnd();
glDisable(GL_BLEND);    
glDisable(GL_TEXTURE_2D);

EDIT: no creo que estoy estirando cada píxel debe ser dos en el sistema de coordenadas

int width=800, height=600;
int left = -400-(width-400);
int right = 400+(width-400);
int top = 400+(height-400);
int bottom = -400-(height-400);
gluOrtho2D(left,right,bottom,top);
¿Fue útil?

Solución

OpenGL (normalmente) requerirá que la textura en sí tiene un tamaño que es una potencia de 2, ¿cuál es (probablemente) que pasa es que su textura se está ampliando a un tamaño donde las dimensiones son una potencia de 2, a continuación, es ser reducido al tamaño original -. en el proceso de escalado dos veces, que está perdiendo algo de calidad

parecer sólo desea mostrar su mapa de bits sin cambiar la escala, sin envolver a la superficie de otro objeto, ni nada de eso (es decir, ninguna de las cosas texturas están destinados a). Siendo ese el caso, yo acababa de mostrarlo como un mapa de bits, no una textura (por ejemplo, véase glRasterPos2i y href="http://www.opengl.org/sdk/docs/man/xhtml/glBitmap.xml" rel="nofollow noreferrer"> glBitmap ).

Otros consejos

¿Por qué quieres usar mapas MIP y filtrado anisotrópico de una imagen estática en la pantalla de inicio en el primer lugar? Parece poco probable que la imagen se rotará (lo filtrado anisotrópico es para) o tiene que ser redimensionado muchas veces muy rápido (lo que es para mipmapping).

Si la textura se estira:. Trate de usar GL_NEAREST para su GL_MAG_FILTER, en este caso se podría dar mejores resultados (GL_LINEAR es más preciso, pero tiene una naturaleza de la visión borrosa)

Si la textura se reduce al mínimo:. Mismo, trate de usar GL_NEAREST_MIPMAP_NEAREST, o mejor aún, trate de usar ningún mipmaps y GL_NEAREST (o GL_LINEAR, lo que le da el mejor resultado)

Me gustaría sugerir que hacer el PNG tiene una resolución en una potencia de 2 de. Es decir 1024x512 y colocar la parte que desea dibujado en la esquina superior izquierda de ella todavía en la resolución de la pantalla. A continuación, cambiar la escala del texcoords ser 800,0 / 600,0 1.024,0 y / 512,0 llegar a la parte derecha de la textura. Me creer que lo que está pasando es glTexImage2D puede manejar algún momento anchura y altura que no son una potencia de 2, pero luego puede escalar la imagen de entrada así filtrarla.

Un ejemplo de manipulación de este se puede ver aquí (un iPhone - OpenGLES - proyecto que agarra un no-poder parte de la pantalla 2 y extrae que en una textura de 512x512 y cambia la escala de la matriz GL_TEXTURE, línea 123, en vez de hacer un reescalar manual de los texcoords)

Aquí se otro post que citan este método.

Esta es una hipótesis:

La ventana es de 800x600 (y tal vez su uso de este dispositivo también), pero su área de cliente no es, a causa de la decoración de ventanas en los lados.

Así que su marco de tampón se cambia de tamaño al ser intercambiada con el área de cliente de la ventana. ¿Se puede comprobar el código de creación de la ventana?

  • Cuidado con el tamaño exacto del área de cliente de la ventana. Vuelva a comprobar que es lo que se espera que sea
  • Cuidado con las reglas de alineación de píxeles. Es posible que tenga que añadir 0,5 a sus coordenadas x / Y para golpear los centros de píxeles. Descripción de DirectX se puede encontrar aquí - OpenGL reglas pueden ser diferentes, sin embargo.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top