提问人:qvindicator 提问时间:4/23/2023 最后编辑:starballqvindicator 更新时间:4/23/2023 访问量:173
在 Direct3D 11 中批量呈现具有不同纹理的多个四边形的好方法是什么?
What is a good way to batch render multiple quads with different textures in Direct3D 11?
问:
我想创建一个批量渲染器,它可以在每个实例的多个不同大小的纹理之间切换。我正在尝试创建一个 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 语句的解决方案,但例如,如果我想同时绑定八个纹理,它会变得很大。我也不希望它引发性能问题。我正在寻找任何可以帮助我自己实现这一点的正确方向的帮助。
答: 暂无答案
评论