avatar

Чёрная кубическая текстура в DX9

Спросил ,
Пытаюсь отрендерить под DX9 сцену в кубическую текстуру, столкнулся с тем, что получаю в итоге абсолютно чёрную текстуру, т.е. буквально каждый пиксель ARGB 0x00000000.

Код: (С++)
LPDIRECT3DCUBETEXTURE9 pTexTemp;

pD3DDevice->CreateCubeTexture(256, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pTexTemp, NULL);
pD3DDevice->GetRenderTarget(0,&pBackBuffer);

for(int j=0;j<6;++j)
{
	LPDIRECT3DSURFACE9 pSurf;
	pTexTemp->GetCubeMapSurface((D3DCUBEMAP_FACES)j, 0,  &pSurf);
	pD3DDevice->SetRenderTarget(0, pSurf);
	
	//the same thing as microsoft's SAFE_RELEASE macro does here
	pSurf->Release();
	pSurf = NULL;

	pD3DDevice->BeginScene();
	
	RenderMesh((Mesh*)meshes[0]);
	RenderMesh((Mesh*)meshes[1]);

	pD3DDevice->EndScene();
}

D3DXSaveTextureToFile("rendertarget.dds", D3DXIFF_DDS, pTexTemp, NULL);
pD3DDevice->SetRenderTarget(0, pBackBuffer); //setting render target back to screen

debug("render target saved");


Т.е. сначала создаётся болванка кубической текстуры pTexTemp, сохраняется текущий RenderTarget, затем начинается рендеринг в каждую из 6 граней куба, сопровождающийся созданием новой поверхности pSurf, которая содержит в себе результат рендеринга. Наконец, RenderTarget восстанавливается обратно и в отладку выводится сообщение о завершении.

Предположительно, DX получает неверный RenderTarget:

pTexTemp->GetCubeMapSurface((D3DCUBEMAP_FACES)j, 0,  &pSurf);
pD3DDevice->SetRenderTarget(0, pSurf);


Уже неделю не могу понять, почему текстура чёрная. Какие могут быть варианты?

1 ответ

avatar
Вопрос снят :) разобрался наконец. Нужно было сначала убрать уничтожение полученных с кубической карты изображений:

pSurf->Release();
pSurf = NULL;


у мелкомягких это описывается макросом SAFE_RELEASE, затем поправил порядок рендеринга сеток, там небольшая ошибка была. Этот порядок подробно описан ТУТ, может кому тоже пригодится.
Только зарегистрированные и авторизованные пользователи могут отвечать на вопросы.