在 Direct3D 11 中批量呈现具有不同纹理的多个四边形的好方法是什么?

What is a good way to batch render multiple quads with different textures in Direct3D 11?

提问人:qvindicator 提问时间:4/23/2023 最后编辑:starballqvindicator 更新时间:4/23/2023 访问量:173

问:

我想创建一个批量渲染器,它可以在每个实例的多个不同大小的纹理之间切换。我正在尝试创建一个 2D 渲染器,只想批量渲染具有不同纹理的纹理四边形。我不想将这些纹理组合成一个纹理图集。我正在观看这个视频,它显示了 OpenGL 中这个确切的实现,但我似乎无法在 DirectX 11 中实现等效的功能。在此 OpenGL 实现中,多个纹理绑定到不同的纹理槽,并且每个实例都会传递一个索引,用于在纹理之间切换。

in vec2 v_TexCoord;
in float v_TexIndex;

uniform sampler2D u_Textures[2];

void main()
{
    int index = int(v_TexIndex);
    o_Color = texture(u_Textures[index], v_TexCoord);
}

我的第一种方法是尝试同样的事情。我将纹理加载到不同的 ID3D11ShaderResourceViews 中,并使用 PSSetShaderResources 上传它们,如下所示

ID3D11ShaderResourceViews *resourceViews[2] = {texResource1, texResource2};
deviceContext->PSSetShaderResources(0, 2, resourceViews);

并尝试在像素着色器中使用此代码

Texture2D textures[3];
SamplerState sampler;

float4 main(VertexInput input) : SV_Target
{
    int index = input.TexIndex;
    return textures[index].Sample(sampler, index);
}

但我收到错误“X3512:采样器数组索引必须是文字表达式”。当我没有向像素着色器提供索引,而是对 0 或 1 等数字进行硬编码时,相应的纹理会出现在屏幕上。DirectX 似乎不支持 OpenGL 的此功能。我见过像使用 Texture2DArrays 这样的解决方案,但据我所知,这些数组中的纹理必须具有相同的大小,这与 OpenGL 不同。我也见过使用 switch 语句的解决方案,但例如,如果我想同时绑定八个纹理,它会变得很大。我也不希望它引发性能问题。我正在寻找任何可以帮助我自己实现这一点的正确方向的帮助。

2D DirectX 渲染器 Direct3D11

评论

0赞 Chuck Walbourn 6/18/2023
你对 HLSL 使用什么着色器配置文件?

答: 暂无答案