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

问题描述 投票:0回答:0

我想创建一个批处理渲染器,可以在每个实例的不同大小的多个纹理之间切换。我正在尝试创建一个 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 direct3d renderer direct3d11
© www.soinside.com 2019 - 2024. All rights reserved.