Domanda

Sto tentando di disegnare un'immagine 2D sullo schermo in Direct3D, che presumo debba essere fatto mappando una trama su un poligono di cartellone rettangolare proiettato per riempire lo schermo. (Non sono interessato o non posso usare Direct2D.) Tutte le informazioni sulla trama che ho trovato nell'SDK descrivono il caricamento di una bitmap da un file e l'assegnazione di una trama per utilizzare quella bitmap, ma non ho ancora trovato un modo per manipolare una trama come bitmap pixel per pixel.

Quello che mi piacerebbe davvero è una funzione come

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

Se non riesco a impostare i pixel direttamente nell'oggetto trama, devo mantenere un array DWORD che è la bitmap e quindi assegnare la trama a ciascun frame?

Infine, mentre inizialmente suppongo che lo farò sulla CPU, probabilmente i calcoli del colore per pixel potrebbero anche essere eseguiti sulla GPU. Il codice HLSL che imposta il colore di un singolo pixel in una trama o i pixel shader sono utili solo per modificare i pixel di visualizzazione?

Grazie.

È stato utile?

Soluzione

Innanzitutto, la tua domanda diretta:

È possibile, tecnicamente, impostare i pixel in una trama. Ciò richiederebbe l'uso di LockRect e UnlockRect API.

Nel contesto D3D, il 'blocco' di solito si riferisce al trasferimento di una risorsa dalla memoria GPU alla memoria di sistema (disabilitando così la sua partecipazione alle operazioni di rendering). Una volta bloccato, è possibile modificare il buffer popolato come desiderato, quindi sbloccare, ovvero trasferire nuovamente i dati modificati nella GPU. Generalmente il blocco era considerato un'operazione molto costosa, ma poiché PCIe 2.0 probabilmente è non è più una grande preoccupazione. Puoi anche specificare un piccolo RECT (anche 1 pixel) come secondo argomento di LockRect, richiedendo quindi il trasferimento di memoria di un volume di dati trascurabile, e spero che il driver sia davvero abbastanza intelligente da trasferire proprio questo (lo so per certo che nei vecchi driver nVidia non era così).

Il modo più efficiente (e ad alta intensità di codice) per raggiungere questo obiettivo è in effetti quello di non lasciare mai la GPU. Se crei la tua texture come RenderTarget ( vale a dire, specificare D3DUSAGE_RENDERTARGET come argomento use ), è quindi possibile impostarlo come destinazione della pipeline prima di effettuare qualsiasi chiamata di disegno e scrivere uno shader (forse passando parametri ) per dipingere i tuoi pixel. Tale utilizzo dei target di rendering è considerato standard e dovresti essere in grado di trovare molti esempi di codice in giro - ma a meno che tu non stia già affrontando problemi di prestazioni, direi che è un eccessivo per un singolo cartellone 2D.

HTH.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top