opengl - glTexSubImage3D(GL_TEXTURE_2D_ARRAY, ...) 和 GL_TEXTURE_SWIZZLE_RGBA
问题描述
- 我有一个纹理数组(~512 层)。
- 我上传的一些纹理有 4 个通道 (RGBA),有些只有一个 (RED)。
创建单个纹理时,我可以这样做:
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 的性能演示经常谈到减少绘制调用是性能的一个重要方面。这是非常正确的,特别是对于高性能应用程序。
话虽如此,这并不意味着人们应该做出巨大的努力将draw call的数量减少到1。建议的重点是让人们构建他们的引擎,以便draw call的数量不会随着复杂性而增加的场景。
例如,考虑您的瓦片地图。为每个图块发出一个绘制调用是不好的,因为绘制调用的数量随着绘制的图块数量线性增加。因此,在一次调用中绘制整个瓦片地图是有意义的。
现在,假设您的场景由平铺贴图和字体字形组成,并且总是如此。您可以在两个调用中渲染它(一个用于地图,一个用于字形),或者您可以在一个调用中完成。但它们之间的性能差异将可以忽略不计。重要的是添加更多图块/字形并不意味着添加更多绘制调用。
因此,您不必担心向引擎添加新的绘图调用。您应该担心的是,如果您要为引擎添加新的 draw call per-X。
推荐阅读
- javascript - `x === y` 周围的括号是什么意思?
- sql-server - sp_send_dbmail 在 256 个字符处截断行
- android - 发布更新到 Maven Central 上的库
- qt - 动态更改 QML 元素的转换
- vba - 重置按钮 Excel VBA - 值作为数字而不是文本
- python-2.7 - 气流异常:数据流失败,返回码 2
- git - 1803更新后VS15不识别git克隆的文件
- docker-compose - docker-compose version3 数据卷容器
- python - 如何删除闭包类中捕获的变量
- c# - Blender - C# C++ 中的命令