使用Direct3D 9快速调色屏幕blit

时间:2012-10-30 18:06:08

标签: 2d direct3d palette

游戏使用软件渲染在内存中绘制全屏调色板(8位)图像。

使用Direct3D将图像放在屏幕上的最快方法是什么?

目前我在软件中将调色板图像转换为RGB,然后将其放在D3DUSAGE_DYNAMIC纹理上(用D3DLOCK_DISCARD锁定)。

有更快的方法吗?例如。使用着色器执行palettization?

相关问题:

2 个答案:

答案 0 :(得分:3)

创建包含调色板图像的D3DFMT_L8纹理,以及包含调色板的256x1 D3DFMT_X8R8G8B8图像。

HLSL着色器代码:

uniform sampler2D image;
uniform sampler1D palette;

float4 main(in float2 coord:TEXCOORD) : COLOR
{
    return tex1D(palette, tex2D(image, coord).r * (255./256) + (0.5/256));
}

请注意,使用乘加操作调整亮度(调色板索引)。这是必要的,因为调色板索引255被认为是白色(最大亮度),当表示为浮点数时变为1.0f。在该坐标处读取调色板纹理会使其环绕(因为只使用了小数部分)并改为读取第一个调色板条目。

用以下内容编译:

fxc /Tps_2_0 PaletteShader.hlsl /FhPaletteShader.h

像这样使用:

// ... create and populate texture and paletteTexture objects ...
d3dDevice->CreatePixelShader((DWORD*)g_ps20_main, &shader)
// ...
d3dDevice->SetTexture(1, paletteTexture);
d3dDevice->SetPixelShader(shader);
// ... draw texture to screen as textured quad as usual ...

答案 1 :(得分:1)

您可以编写一个简单的像素着色器来处理调色。创建L8动态纹理并将调色图像复制到其中并创建调色板查找纹理(或常量存储器中的颜色数组)。然后只需渲染全屏四边形,将调色图像设置为纹理,并使用像素着色器从查找纹理或常量缓冲区执行调色板查找。

也就是说,在现代CPU上执行CPU上的调色板转换不应该非常昂贵。你确定这是你的性能瓶颈吗?