创建单个纹理时,我可以这样做:
GLint swizzleMask[] = { GL_ONE, GL_ONE, GL_ONE, GL_RED };
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
我可以对纹理数组的特定层执行此操作吗? (模糊处理仅应应用于数组中的一个纹理,而不应应用于其他纹理。)
我怀疑这是不可能的,如果可以,首选的方法是什么? (顶点属性是我的最后选择)。
(i)编辑:最好寻找OpenGL 3.3或以下版本的解决方案。
(ii)编辑:我的想法是,我有用于游戏的RGBA位图(草,墙等),也有 font 位图。我正在尝试在同一绘制调用中渲染它们。
在片段着色器中,我有类似的东西:
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;
答案 0 :(得分:5)
首先,不行,您无法做自己想做的事情。嗯,有一种方法,但是它涉及到在片段着色器中粘贴非动态统一条件分支,这不值得付出代价。
我正在尝试在同一绘制调用中渲染它们。
围绕OpenGL的性能演示经常谈论减少绘图调用是性能的重要方面。这是事实,尤其是对于高性能应用程序。
话虽如此,但这并不意味着人们应该做出艰巨的努力将抽奖活动的次数减少到1。建议的重点是让人们构造他们的引擎,以便绘制调用的数量不会随着场景的复杂性而增加。
例如,考虑您的图块地图。每瓦片发出一次绘图调用是不好的,因为绘图调用的数量会随着被绘制的图块的数量线性增加。因此,一次调用即可绘制整个图块地图。
现在,假设您的场景由图块地图和字体字形组成,并且将始终如此。您可以在两个调用中渲染(一个用于地图,一个用于字形),或者可以在一个调用中进行渲染。但是它们之间的性能差异将可以忽略不计。重要的是添加更多的图块/字形并不意味着添加更多的绘制调用。
因此,您不必担心将新的绘图调用添加到引擎。如果您要向引擎添加每X的新绘制调用,则应该担心的是您。