Я пишу движок 2D игры с открытым исходным кодом и хочу поддерживать как можно больше устройств и платформ. Я в настоящее время только Windows Mobile, хотя. Я рендеринг с использованием DirectX Mobile, с DirectDraw в качестве запасного пути. Тем не менее, я столкнулся с небольшой проблемой.
Кажется, что хотя эталонный драйвер поддерживает createRenderTarget, многие многие многие физические устройства не поддерживают. Мне нужен какой-то способ рендеринга на экран без использования цели рендеринга, потому что я рендерирую спрайты, используя текстурированные квадраты, но мне также нужно уметь рисовать отдельные пиксели.
Вот как я это делаю прямо сейчас:
// save old values
if (Error::Failed(m_D3DDevice->GetRenderTarget(&m_D3DOldTarget)))
{
ERROR_EXPLAIN("Could not retrieve backbuffer.");
return false;
}
// clear render surface
if (Error::Failed(m_D3DDevice->SetRenderTarget(m_D3DRenderSurface, NULL)))
{
ERROR_EXPLAIN("Could not set render target to render texture.");
return false;
}
if (Error::Failed (m_D3DDevice->Clear(
0,
NULL, // target rectangle
D3DMCLEAR_TARGET,
D3DMCOLOR_XRGB(0, 0, 0), // clear color
1.0f,
0
)
)
)
{
ERROR_EXPLAIN("Failed to clear render texture.");
return false;
}
D3DMLOCKED_RECT render_rect;
if (Error::Failed(m_D3DRenderSurface->LockRect(&render_rect, NULL, NULL)))
{
ERROR_EXPLAIN("Failed to lock render surface pixels.");
}
else
{
m_D3DBackSurf->SetBuffer((Pixel*)render_rect.pBits);
m_D3DRenderSurface->UnlockRect();
}
// begin scene
if (Error::Failed(m_D3DDevice->BeginScene()))
{
ERROR_EXPLAIN("Failed to start rendering.");
return false;
}
// =====================
// example rendering
// =====================
// some other stuff, but the most important part of rendering a sprite:
device->SetTexture(0, m_Texture));
device->SetStreamSource(0, m_VertexBuffer, sizeof(Vertex));
device->DrawPrimitive(D3DMPT_TRIANGLELIST, 0, 2);
// plotting a pixel
Surface* target = (Surface*)Device::GetRenderMethod()->GetRenderTarget();
buffer = target->GetBuffer();
buffer[somepixel] = MAKECOLOR(255, 0, 0);
// end scene
if (Error::Failed(device->EndScene()))
{
ERROR_EXPLAIN("Failed to end scene.");
return false;
}
// clear screen
if (Error::Failed(device->SetRenderTarget(m_D3DOldTarget, NULL)))
{
ERROR_EXPLAIN("Couldn't set render target to backbuffer.");
return false;
}
if (Error::Failed(device->GetBackBuffer (
0,
D3DMBACKBUFFER_TYPE_MONO,
&m_D3DBack
)
)
)
{
ERROR_EXPLAIN("Couldn't retrieve backbuffer.");
return false;
}
RECT dest = {
0,
0,
Device::GetWidth(),
Device::GetHeight()
};
if (Error::Failed( device->StretchRect (
m_D3DRenderSurface,
NULL,
m_D3DBack,
&dest,
D3DMTEXF_NONE
)
)
)
{
ERROR_EXPLAIN("Failed to stretch render texture to backbuffer.");
return false;
}
if (Error::Failed(device->Present(NULL, NULL, NULL, NULL)))
{
ERROR_EXPLAIN("Failed to present device.");
return false;
}
Я ищу способ сделать то же самое (рендерить спрайты с использованием аппаратного ускорения и наносить пиксели на буфер) без использования цели рендеринга.
Заранее спасибо.