Pregunta

Estoy intentando dibujar una imagen 2D en la pantalla en Direct3D, que supongo que se debe hacer mediante el mapeo de una textura en un polígono de cartelera rectangular proyectado para llenar la pantalla. (No estoy interesado o no puedo usar Direct2D). Toda la información de textura que he encontrado en el SDK describe cómo cargar un mapa de bits de un archivo y asignar una textura para usar ese mapa de bits, pero todavía no he encontrado una manera de manipular una textura como mapa de bits píxel a píxel.

Lo que realmente me gustaría es una función como

void TextureBitmap :: SetBitmapPixel (int x, int y, DWORD color);

Si no puedo establecer los píxeles directamente en el objeto de textura, ¿debo mantener una matriz DWORD que sea el mapa de bits y luego asignar la textura a cada fotograma?

Finalmente, aunque inicialmente asumo que haré esto en la CPU, los cálculos de color por píxel probablemente también podrían realizarse en la GPU. ¿Es el código HLSL que establece el color de un solo píxel en una textura, o los sombreadores de píxeles solo son útiles para modificar los píxeles de la pantalla?

Gracias.

¿Fue útil?

Solución

Primero, tu pregunta directa:

Técnicamente, puedes establecer píxeles en una textura. Eso requeriría el uso de LockRect y UnlockRect API.

En el contexto D3D, el "bloqueo" generalmente se refiere a transferir un recurso de la memoria de la GPU a la memoria del sistema (lo que desactiva su participación en las operaciones de representación). Una vez bloqueado, puede modificar el búfer lleno como desee y luego desbloquearlo, es decir, transferir los datos modificados a la GPU. En general, el bloqueo se consideró una operación muy costosa, pero desde PCIe 2.0 eso es probablemente Ya no es una preocupación importante. También puede especificar un RECT pequeño (incluso de 1 píxel) como segundo argumento para LockRect, lo que requiere la transferencia de memoria de un volumen de datos insignificante, y espero que el controlador sea lo suficientemente inteligente como para transferir eso (lo sé por cierto) que en los controladores antiguos de nVidia este no era el caso).

La forma más eficiente (y de uso intensivo de código) de lograrlo es, de hecho, nunca abandonar la GPU. Si crea tu textura como un RenderTarget ( es decir, especifique D3DUSAGE_RENDERTARGET como uso argumento ), luego puede configurarlo como el destino de la tubería antes de realizar llamadas de sorteo y escribir un sombreado (quizás pasar parámetros ) para pintar tus píxeles. Este uso de los objetivos de renderizado se considera estándar, y debería poder encontrar muchos ejemplos de código, pero a menos que ya esté enfrentando problemas de rendimiento, diría que es una exageración para una única cartelera 2D.

HTH.

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