首页 > 解决方案 > glTexSubImage3D(GL_TEXTURE_2D_ARRAY, ...) 和 GL_TEXTURE_SWIZZLE_RGBA

问题描述

创建单个纹理时,我可以这样做:

GLint swizzleMask[] = { GL_ONE, GL_ONE, GL_ONE, GL_RED };
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);

我可以为纹理数组的特定层执行此操作吗?(Swizzling 应该只应用于数组中的一个纹理,而不是其他纹理)。

我怀疑这是不可能的,如果是这样,首选方法是什么?(顶点属性将是我最后的选择)。

(i) 编辑:最好寻找 OpenGL 3.3 或以下的解决方案。

(ii) 编辑:我的想法是我的游戏有 RGBA 位图(草、墙等),我也有字体位图。我试图在同一个绘图调用中呈现这些。

在我的片段着色器中,我有类似的东西:

uniform sampler2DArray TextureArraySampler;

out vec4 FragmentColor;
in VertexOut
{
    vec2 UV;
    vec4 COLOR;
    flat uint TEXTURE_INDEX;
} In;

void main(void)
{
    FragmentColor = In.COLOR * texture(TextureArraySampler, vec3(In.UV.x, In.UV.y, In.TEXTURE_INDEX));
}

因此,在渲染字体时,我希望着色器采样如下:

FragmentColor = In.COLOR * vec4(1, 1, 1, texture(TextureArraySampler, vec3(In.UV.x, In.UV.y, In.TEXTURE_INDEX)).r);

并且,在渲染位图时:

FragmentColor = In.COLOR * texture(TextureArraySampler, vec3(In.UV.x, In.UV.y, In.TEXTURE_INDEX)).rgba;

标签: opengl

解决方案


首先,不,没有办法做你想做的事。好吧,有一种方法,但它涉及在片段着色器中粘贴一个非动态统一的条件分支,这不值得付出代价。

我试图在同一个绘图调用中呈现这些。

围绕 OpenGL 的性能演示经常谈到减少绘制调用是性能的一个重要方面。这是非常正确的,特别是对于高性能应用程序。

话虽如此,这并不意味着人们应该做出巨大的努力将draw call的数量减少到1。建议的重点是让人们构建他们的引擎,以便draw call的数量不会随着复杂性而增加的场景。

例如,考虑您的瓦片地图。为每个图块发出一个绘制调用是不好的,因为绘制调用的数量随着绘制的图块数量线性增加。因此,在一次调用中绘制整个瓦片地图是有意义的。

现在,假设您的场景由平铺贴图和字体字形组成,并且总是如此。您可以在两个调用中渲染它(一个用于地图,一个用于字形),或者您可以在一个调用中完成。但它们之间的性能差异将可以忽略不计。重要的是添加更多图块/字形并不意味着添加更多绘制调用。

因此,您不必担心向引擎添加新的绘图调用。您应该担心的是,如果您要为引擎添加新的 draw call per-X。


推荐阅读