glTexSubImage3D(GL_TEXTURE_2D_ARRAY,...)和GL_TEXTURE_SWIZZLE_RGBA

Mat*_*000 1 opengl

  • 我有一个纹理数组(〜512层)。
  • 我上传的某些纹理有4个通道(RGBA),有些只有一个(RED)。

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

GLint swizzleMask[] = { GL_ONE, GL_ONE, GL_ONE, GL_RED };
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
Run Code Online (Sandbox Code Playgroud)

我可以对纹理阵列的特定图层执行此操作吗?(模糊处理仅应应用于数组中的一个纹理,而不应应用于其他纹理)。

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

(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));
}
Run Code Online (Sandbox Code Playgroud)

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

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

并且,在渲染位图时:

FragmentColor = In.COLOR * texture(TextureArraySampler, vec3(In.UV.x, In.UV.y, In.TEXTURE_INDEX)).rgba;
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 5

首先,没有,没有办法做您想要的事情。那么,有一种方式,但它涉及您的片段着色器,这是不是一种成本值得付出坚持非均匀动态条件分支。

我正在尝试在同一绘制调用中渲染它们。

围绕OpenGL的性能演示经常谈论减少绘图调用是性能的重要方面。这是真的,尤其是对于高性能应用程序。

话虽如此,这并不意味着就应该做出艰巨的努力以将抽奖电话的数量减少到1。建议的重点是让人们构造他们的引擎,以使抽奖电话的数量不会随着复杂性的增加增加。现场。

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

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

因此,您不必担心将新的绘图调用添加到引擎。如果要向引擎添加每X的新绘制调用,则应该担心的是。