2014-12-27 139 views
0

我基本上有两个纹理,一个基础和一个覆盖。我需要两个绘制他们到一个新的纹理。在opengl中绘制两个纹理到一个新纹理

所以,如果纹理1是:

AAAAA 
BBBBB 
CCCCC 

和质地2:

B 
B 
A 

那么它应该返回:

ABAAA 
BBBBB 
CACCC 

除了将它与实际的纹理,不是信件。

(注:空字符是透明度,它们会被忽略)

更新1:

我不能使用着色器,因为这是一个改装的环境,我需要绑定的纹理是由外部渲染器绘制。那有意义吗?

更新2:

用于第二图像的Alpha可以是任何东西。 0.0或透明意味着什么也不做,并使用第一张图片,否则使用第二张图片

+0

您在寻找的是混合https://www.opengl.org/wiki/Blending。基本上你首先绘制一个具有纹理1的四边形,然后绘制一个具有纹理2的四边形,其中来自纹理2的颜色由α值加权。因此,如果纹理2的alpha值为0,则会看到纹理1,如果alpha值为1,则会看到纹理2. – dari 2014-12-27 17:40:17

+1

这可以使用多纹理或着色器(但不会创建单个输出纹理)。纹理2使用什么样的透明度?只是** 0.0 **和** 1.0 **? _你可以解释为什么他们需要合并成一个纹理,而两者同时应用?_ – 2014-12-27 17:40:34

回答

0

您可以设置一个FBO,其结果纹理作为附件,然后在片段着色器中混合两个输入纹理。这只是步骤的概述:

  1. 创建并分配结果纹理。
  2. 创建并绑定FBO(glGenFramebuffers,glBindFramebuffer)。
  3. 将结果纹理附加到FBO。
  4. 将两个输入纹理绑定到两个不同的纹理单元。
  5. 使用片段着色器绑定程序,该片段着色器从两个纹理中采样并混合它们。在GLSL代码可能是这个样子:

    in vec2 TexCoord; 
    uniform sampler2D Texture1; 
    uniform sampler2D Texture2; 
    out FragColor; 
    void main() { 
        vec4 texVal1 = texture(Texture1, TexCoord); 
        vec4 texVal2 = texture(Texture2, TexCoord); 
        FragColor = mix(texVal2, texVal1, texVal2.a); 
    } 
    
  6. 设置属性,制服等

  7. 渲染的屏幕尺寸四。
+0

关于如何在纯opengl中做到这一点的更详细说明 – mincrmatt12 2014-12-27 23:37:03