Ramm
вот это можешь покопать в сторону софтверного рендера после получения depthbuffer
http://www.gamedev.ru/code/articles/coverage_buffer_uno
Ramm
> Я все правильно сделал?
Нет.
1. После рендера в текстуру DeviceDX.Present не нужен.
2.
> после инициализации до очистки заднего буфера и установки камеры вызываю:
Это делается не просто до очистки заднего буфера, а до начала цикла рендера.
3. Зачем каждый кадр сохранять в файл? Для чтения RENDERTARGET данных есть GetRenderTargetData, но это в любом случае делается после восстановления рендера в бэкбуфер.
4. Не уверен, что формат D3DFMT_R8G8B8 будет поддерживаться на любом железе и в любой ОС, лучше задействовать D3DFMT_A8R8G8B8.
1. Исправил. Получается, что вместо заднего буфера - текстура, а текстура автоматом все сохраняет в себе?
2. Т.е. однократно. Так и сделал.
3.
> Зачем каждый кадр сохранять в файл?
Отслеживать поведение текстуры.
Mikle
> Для чтения RENDERTARGET данных есть GetRenderTargetData,
Можно подробнее? Зачем эта функция? Я не могу просто восстановить рендер в бекбуфер, а затем использовать текстуру? И что подразумевается под RENDERTARGET.
Ramm
> Можно подробнее? Зачем эта функция? Я не могу просто восстановить рендер в
> бекбуфер, а затем использовать текстуру? И что подразумевается под
> RENDERTARGET.
RENDERTARGET дословно - цель для рендера, то есть то, куда мы рендерим, по умолчанию это бэкбуфер, но мы временно подменяем его на текстуру.
После восстановления бэкбуфера в качестве RENDERTARGET мы можем использовать текстуру для текстурирования, но не можем её читать просто так с помощью Lock(). Ты для чтения задействовал сохранение в файл, это очень медленно, GetRenderTargetData() - это функция, которая читает непосредственно из RENDERTARGET текстуры в память, например, в заранее созданный массив с соответствующим размером. Далее тебе останется просто взять из массива по координатам курсора значение - и ты опросил RENDERTARGET текстуру.
Спасибо, но вот как GetRenderTargetData пользоваться?
Текстура получена, я думал сделать как-то так:
LockedRect: D3DLOCKED_RECT; RenderTexture.LockRect(0, @LockedRect, nil, nil);//залочим текстуру
Затем ищем текстуре в виде строки. Координаты курсора есть, пытаемся найти этот элемент в строке примерно так:
Color :=LockedRect.pBits[(координата Y-1) * texture.width + координата Х];
Затем разлочиваем:
RenderTexture.UnlockRect(0 );
Вот и все... Пишут, что бывают проблемы и не всегда можно получить нужный пиксель из-за выравнивания и чего-то еще...
Можно проще сделать?
Ramm
GetRenderTargetData копирует данные из RENDERTARGET сюрфейса в обычный, который можно локать.
Ramm
> Пишут, что бывают проблемы и не всегда можно получить нужный пиксель из-за
> выравнивания и чего-то еще...
> texture.width
Вместо этого надо использовать LockedRect.Pitch, и всё будет в шоколаде.
Тема в архиве.