Pregunta

Necesito mostrar imágenes 2D en opengl usando texturas.
Las dimensiones de la imagen no son necesariamente potencias de 2.
Pensé en crear una textura más grande y restringir la visualización a la parte que estaba usando, pero los datos de la imagen se compartirán con openCV, por lo que no quiero copiar datos de un píxel a la vez en una textura más grande.

EDITAR: resulta que incluso los gráficos integrados más simples de Intel en Windows admiten texturas sin potencia de 2.

EDIT2 - e incluso si no tiene un tamaño de textura arb, entonces hacer que su imagen sea más pequeña y redimensionarse al tamaño de la ventana es muy rápido incluso en hardware de gama baja

¿Fue útil?

Solución

Un par de extensiones GL vienen a la mente. Eche un vistazo a GL_ARB_texture_rectangle (si no necesita mipmapping) , o GL_ARB_texture_non_power_of_two (si lo hace).

Otros consejos

Un obstáculo que debe evitarse es que, por alguna razón, algunas tarjetas de video requieren que GL_UNPACK_ALIGNMENT esté configurado en 1 (glPixelStorei (GL_UNPACK_ALIGNMENT, 1);) para que la textura sin potencia de dos se cargue correctamente.

Si puedo agregar algo para cualquiera que se encuentre con esto en el futuro, la mayoría de la documentación y tutoriales / ejemplos que encuentre en la web sobre OpenGL están desactualizados muchos años, incluidas las cosas de nehe.gamedev, y lo guiarán creer que cosas como los tamaños de textura sin potencia de dos son un problema cuando realmente no lo son, o alentarlo a usar funciones de opengl obsoletas desde hace mucho tiempo, o bibliotecas que no se han actualizado durante una década.

En primer lugar, la mayoría de las tarjetas de video modernas en realidad admiten dimensiones de textura que no son cuadradas ni de potencia de dos. Pero para una máxima compatibilidad, probablemente solo se recomienda utilizar la potencia de dos texturas.

Comience por determinar la potencia más cercana de dos que sea mayor para cada una de las dimensiones de la imagen (ancho y alto) y cree una textura de ese tamaño. Entonces tienes dos opciones. El primero es hacer un cambio de tamaño del software de los datos de píxeles para que se ajuste a la imagen, y luego dimensionar su quad de acuerdo con la relación de aspecto original cuando necesite mostrarlo. O bien, puede rellenar parte de la textura con los datos de su imagen y colocar píxeles transparentes en el resto.

Si desea utilizar la potencia de 2 texturas, cree la más pequeña que pueda ocupar su imagen y calcule las coordenadas de textura adecuadas para mostrar solo la parte de la textura que contiene su imagen. P.ej. si su imagen es 400x300, usaría una textura 512x512, copie su imagen allí línea por línea, y su coordenada de textura correcta sería 400.0 / 512.0, la inferior 300.0 / 512.0. Eso se verá mejor que el escalado de software.

Hago exactamente lo que usted describe, copie en una textura de potencia de 2 y ajuste mis uv en consecuencia. Las extensiones serían buenas, pero no se garantiza que sean compatibles con una computadora arbitraria.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top