Pregunta

En C ++ OpenGL, quiero llamar cada píxel manualmente (como una textura supongo) en a una simple cuadrados primitivos, o de hecho 2 polígonos que forman un cuadrado.

No tengo idea de por dónde empezar o qué frases para tener en cuenta. Estoy buscando el mapeado de texturas o la creación de texturas? La mayoría de los ejemplos son para cargar desde un archivo, pero no quiero hacer eso.

He intentado leer mi libro Guía de programación OpenGL, pero es sólo un laberinto como estoy bastante nuevo en OpenGL. Por favor, ayuda.

¿Fue útil?

Solución

Tome un vistazo de cerca a glTexImage2D. Esta es la llamada que carga la imagen en OpenGL para una textura 2D.

glTexImage2D realidad toma un puntero a los datos en bruto de píxel en la imagen. Puede asignar memoria a sí mismo, y establecer directamente los datos de la imagen (lo que le apetezca), a continuación, llamar a esta función para pasar la imagen a OpenGL.

Una vez que haya creado la textura, se puede obligar al estado para que sus triángulos utilizan esa textura.

No hay nada en OpenGL que requiere directamente las imágenes utilizadas como texturas para ser cargados desde los archivos. Un buen recurso para texturas puede ser encontrado en este artículo GameDev.

Otros consejos

Si el cuadrado que está dibujando a es de 2 dimensiones y no girada, es posible que se busca glDrawPixels . Se le permite dibujar una región rectangular de píxeles directamente al buffer sin necesidad de utilizar ningún polígonos.

Si usted es nuevo entonces te recomiendo partir de tutorial de uno en NeHe .

Ten en cuenta que, si bien glTexImage2D() toma un puntero a los píxeles para cargar, no se preocupa por cualquier cambio en los datos después de la llamada. Es decir, los datos son muy cargado desde el área de memoria que especifique, y OpenGL crea una copia de su propio.

Esto significa que si los datos cambian, tendrá que o bien volver a hacer la llamada glTexImage2D (), o usar algo como glTexSubImage2D() hacer una actualización parcial. Yo recomendaría pruebas y perfiles para ver si sub-textura actualización es rápida, sin saber cómo optimizar los conductores reales para ese caso.

Gracias a Reed Copsey para mí apuntando hacia glTexImage2D . Resulta que esto es muy simple; simplemente pasar una matriz de GLubyte a la <=> función (así como todas las funciones necesarias para obligar a la textura, etc). No he probado este fragmento de código exacta, pero debería funcionar bien. Los elementos de la matriz representan una versión en serie de las filas, columnas y canales.

int pixelIndex = 0;
GLubyte pixels[400];

for (int x = 0; x < 10; x++)
{
    for (int y = 0; y < 10; x++)
    {
         for (int channel = 0; channel < 4; channel++)
         {
             // 0 = black, 255 = white
             pixels[pixelIndex++] = 255;
         }
    }
}

glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RGBA, SIZE, SIZE, 0,
    GL_RGBA, GL_UNSIGNED_BYTE, pixels);

He leído en el libro de OpenGL puede utilizar una matriz 2D de las imágenes monocromas, así que supongo que se podría utilizar una matriz 3D también.

Lo que usted está buscando se llama generalmente "Dad a la textura."

http://developer.nvidia.com/object/gdc_oglrtt.html

Ese tutorial es bastante viejo. Supongo que algunas de esas extensiones no son en realidad extensiones en versiones más recientes de OGL. Siento no poder ser de más ayuda. Yo no trabajo directamente con la API de gráficos mucho más, y si lo hiciera me gustaría usar D3D si pudiera (para evitar la extensión de la sopa, y por otras razones que no voy a aburrir con aquí.)

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