OpenGL着色器 - 重叠多个纹理

Posted

技术标签:

【中文标题】OpenGL着色器 - 重叠多个纹理【英文标题】:OpenGL shader - overlaping multiple textures 【发布时间】:2013-01-31 18:49:20 【问题描述】:

我无法找到一种模式来绘制纹理。 我需要将结果片段颜色设置为:

tex1 + (1-tex1alpha)*tex2 + (1-tex1alpha-tex2alpha)*tex3

不是混合纹理,而是在图像编辑器中将一个放在其他类似图层上。

【问题讨论】:

您的场景是否允许使用不同的纹理多次绘制几何图形? 如果将其写入顶点着色器会发生什么? 我需要在着色器中计算片段颜色。我的顶部纹理只有黑色和透明度,所以当我使用 color1 + color2 时,黑色不会出现。 所以你需要alpha==1的最顶层纹理的颜色。确定应该没问题(例如使用 for 循环)。 你能举个例子吗? 【参考方案1】:

我并没有真正使用 OpenGL,因此 GLSL 代码可能并不完全有效。但是您正在寻找的着色器应该看起来像这样。如有错误,请随时纠正。

vec4 col;
col = texture2D(tex3, uv)
if(col.a == 1)  gl_FragColor = col; return; 
col = texture2D(tex2, uv)
if(col.a == 1)  gl_FragColor = col; return; 
col = texture2D(tex1, uv)
if(col.a == 1)  gl_FragColor = col; return; 

也就是说,如果纹理的数量是固定的。如果您有可变数量的纹理,您可以将它们放入纹理数组并执行以下操作:

vec4 col;
for(int i = nTextures - 1; i >= 0; --i)

    col = texture2DArray(textures, vec3(uv, i));
    if(col.a == 1)
    
        gl_FragColor = col;
        return;
    

【讨论】:

【参考方案2】:

您可以将发布的公式直接写入着色器。以下将起作用:

uniform sampler2D sampler1;
uniform sampler2D sampler2;
uniform sampler2D sampler3;

varying vec2 texCoords;

void main()

    vec4 tex1 = texture(sampler1, texCoords);
    vec4 tex2 = texture(sampler2, texCoords);
    vec4 tex3 = texture(sampler3, texCoords);
    gl_FragColor = tex1 + (1 - tex1.a) * tex2 + (1 - tex1.a - tex2.a) * tex3;
;

但是,第三个参数可能会变成负数,这会产生不希望的结果。更好的是:

gl_FragColor = tex1 + (1 - tex1.a) * tex2 + max(1 - tex1.a - tex2.a, 0) * tex3;

【讨论】:

以上是关于OpenGL着色器 - 重叠多个纹理的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL:如何将多个纹理传递给具有一个变量的着色器?

OpenGL/C++:将多个纹理传递给一个着色器的问题

帧缓冲区和在opengl中使用着色器

OpenGL几何着色器传递纹理坐标

OpenGL着色器没有传递正确的纹理坐标

计算着色器 OpenGL 写入纹理