首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Direct3D 9快速显示屏幕blit

用Direct3D 9快速显示屏幕blit
EN

Stack Overflow用户
提问于 2012-10-30 18:06:07
回答 2查看 756关注 0票数 0

游戏使用软件渲染,在内存中绘制一个全屏幕的(8位)图像。

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

目前,我在软件中将苍白图像转换为RGB,然后将其放在D3DUSAGE_DYNAMIC纹理上(这是用D3DLOCK_DISCARD锁定的)。

有更快的路吗?例如使用着色器进行调色?

相关问题:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-30 23:49:48

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

HLSL着色器代码:

代码语言:javascript
复制
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。在该坐标下读取调色板纹理会使其环绕(因为只使用分块)并读取第一个调色板条目。

编译它时:

代码语言:javascript
复制
fxc /Tps_2_0 PaletteShader.hlsl /FhPaletteShader.h

像这样使用它:

代码语言:javascript
复制
// ... 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 ...
票数 4
EN

Stack Overflow用户

发布于 2012-10-30 21:30:57

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13145084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档