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