我想创建一个批处理渲染器,可以在每个实例的不同大小的多个纹理之间切换。我正在尝试创建一个 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 语句的解决方案,但是如果我想同时绑定八个纹理,那会变得很大,例如。我也不希望它引发性能问题。我正在寻找任何可以为我指明正确方向的帮助,以便我自己实施。谢谢。