Cara menyalin data frontBuffer ke tekstur DirectX 9

Sepertinya saya tidak dapat menemukan cara untuk membuat tekstur dari data permukaan yang saya peroleh melalui data buffer depan aplikasi saya

Ini adalah kode yang saya yakini berfungsi (Direct X 9, C++)

// capture screen
IDirect3DSurface9* pSurface;
g_pd3dDevice->CreateOffscreenPlainSurface(640, 480,
    D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pSurface, NULL);
g_pd3dDevice->GetFrontBufferData(0, pSurface);

Sekarang saya sudah mendapatkan frontBufferData, saya ingin membuat objek IDirect3DTexture9 dengannya.

Fungsi ini /D3DXCreateTextureFromFileInMemory / tampaknya paling logis tetapi tampaknya tidak berhasil.

Saya cukup yakin ada cara untuk melakukan ini, meskipun saya tidak yakin bagaimana caranya. Bantuan apa pun akan sangat kami terima!

Terima kasih!


person zeroxgames    schedule 30.05.2012    source sumber


Jawaban (1)


Sebaiknya gunakan GetRenderTargetData() daripada GetFrontBufferData(), karena GetRenderTargetData() lebih cepat. Meski begitu, sebenarnya bukan itu pertanyaannya. Anda ingin menyimpan data yang Anda peroleh dari frontbuffer, atau hal-hal yang sedang Anda amati di layar, ke dalam sebuah tekstur.

Pertama-tama, IDirect3DTexture9 dan IDirect3DSurface9 sebenarnya adalah sejenis saudara kandung, tetapi mereka tidak sama meskipun pada titik tertentu dalam hierarki kelas mereka menyatu ke IDirect3DResource9 (hal ini logis, karena memang demikian adanya). sumber daya). Yang menarik dari keduanya adalah mereka mengimplementasikan fungsionalitas umum, khususnya kemungkinan LockRect() dan menyalin data secara manual dari permukaan (yang, kasarnya, hanya satu permukaan level mipmap (sekumpulan piksel) ke tekstur (yang mungkin terdiri dari beberapa level mipmap). Oleh karena itu, target Anda adalah permukaan level0 dari objek tekstur.

Dengan mengingat hal tersebut, karena semua CreateOffscreenPlainSurface() dianggap berdiri sendiri, kita tidak dapat menemukan tekstur induk yang permukaannya mungkin menjadi turunannya (menjadi mipmap tertentu dari suatu tekstur). Singkat cerita, jika kita tidak LockRect keduanya dan menyalin data secara manual, kita bisa menggunakan StretchRect().

Meskipun namanya mungkin tidak mengungkapkan salah satu tujuannya, ini akan membantu kita dalam hal ini. Ingat tentang perbandingan pembicaraan kita antara tekstur dan permukaan, permukaan adalah adiknya. Nah, jika Anda mendefinisikan tekstur dengan benar (sama seperti permukaan), Anda sebenarnya mendapatkan miplevel otomatis yang dapat Anda tentukan secara manual berapa banyak tekstur yang ada. Namun pada hakikatnya, masing-masing level ini adalah sebuah permukaan. Dan "mengonversi" dari IDirect3DSurface9 ke IDirect3DTexture9 hanyalah masalah mengisi permukaan miplevel yang tepat (yang dalam hal ini seharusnya level0, karena pada dasarnya ini adalah tangkapan layar).

Oleh karena itu, memasukkan ini ke dalam kode kasar memberi kita:

IDirect3DTexture9* texture; // needs to be created, of course
IDirect3DSurface9* dest = NULL; // to be our level0 surface of the texture
texture->GetSurfaceLevel(0, &dest);
g_pD3DDevice->StretchRect(pSurface, NULL, dest, NULL, D3DTEXF_LINEAR);

Dan ini dia, tinggal satu IDirect3DTexture9. Apakah Anda ingin kentang goreng dengan itu, Pak? Perhatikan bahwa saya sedang kehabisan memori di sini, saya sudah cukup lama tidak menyentuh DX9 (lebih memilih DX10). Semoga ini bisa membantu.

person Community    schedule 30.05.2012
comment
Terima kasih kembali. Harap pertimbangkan untuk menerima ini sebagai jawaban jika ini telah menyelesaikan masalah Anda. - person ; 02.06.2012