Pergunta

Eu estou tentando desenhar uma imagem 2D para a tela em Direct3D, que eu estou supondo que deve ser feito mapeando uma textura para um polígono cartaz retangular projetada para preencher a tela. (Eu não estou interessado ou não pode usar Direct2D.) Todas as informações textura que eu encontrei no SDK descreve carregar um bitmap de um arquivo e atribuindo uma textura para usar esse bitmap, mas eu ainda não encontraram uma forma de manipular uma textura como um pixel bitmap por pixel.

O que eu realmente gosto é uma função, como

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

Se eu não posso definir os pixels diretamente no objeto de textura, que eu preciso para manter em torno de uma variedade DWORD que é o bitmap e depois atribuir a textura para que cada frame?

Finalmente, enquanto eu estou inicialmente supondo que eu vou estar fazendo isso na CPU, os cálculos de cor por pixel provavelmente também poderia ser feito na GPU. É o código HLSL que define a cor de um único pixel em uma textura, ou são pixel shaders útil apenas para modificar a exibição pixels?

Graças.

Foi útil?

Solução

Em primeiro lugar, a sua pergunta direta:

Você pode, tecnicamente, definir pixels em uma textura. Isso exigiria o uso de LockRect e UnlockRect API.

D3D contexto, 'bloqueio' geralmente refere-se a transferência de um recurso de memória GPU para a memória do sistema (desactivando assim a sua participação em operações render). Uma vez bloqueado, você pode modificar o buffer povoada como você deseja, e depois desbloqueio - ou seja, transferir os dados modificados de volta para a GPU. Geralmente bloqueio foi considerado uma operação muito caro, mas uma vez que PCIe 2,0 que é provavelmente não é uma grande mais preocupação. Você também pode especificar um RECT pequenos (mesmo 1 pixel) como um 2º argumento para LockRect, exigindo assim a memória de transferência de um volume de dados insignificante, e espero que o motorista é realmente bastante inteligente para transferir apenas que (eu sei para um fato que nos drivers da nVidia mais velhos, esse não era o caso).

A maneira mais eficiente (e-code intensivo) de conseguir isso, é de fato de nunca deixar a GPU. Se você criar sua textura como um RenderTarget ( isto é, especificar D3DUSAGE_RENDERTARGET como seu argumento uso ), então você poderia defini-lo como o destino do oleoduto antes de fazer quaisquer chamadas empate, e escrever um shader (talvez passagem de parâmetros ) para pintar seus pixels. Tal uso de tornar alvos é considerado padrão, e você deve ser capaz de encontrar muitos exemplos de código ao redor -. Mas a menos que você já está enfrentando problemas de desempenho, eu diria que é um exagero para um único billboard 2D

HTH.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top