【问题标题】:Multiple active Textures opengl多个活动纹理opengl
【发布时间】:2016-02-05 18:45:21
【问题描述】:

我有一个背景纹理和透明层纹理。 当我加载这些纹理时,只有 _layer3 最终纹理处于活动状态。

我希望所有纹理都处于活动状态,以便我知道要进一步处理的图层。

   glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture[0]);//texture _floorTexture
    glUniform1i(_textureUniform, 0);
           //glUniform1i(glPrograms[currentProgram].glUniforms[_textureUniform],_floorTexture);

    glActiveTexture(GL_TEXTURE0 + 1);
    glBindTexture(GL_TEXTURE_2D, texture[1]); //_layer0
    glUniform1i(_textureUniform, 1);

    glActiveTexture(GL_TEXTURE0 + 2);
    glBindTexture(GL_TEXTURE_2D, texture[2]); //_layer1
    glUniform1i(_textureUniform, 2);

    glActiveTexture(GL_TEXTURE0 + 3);
    glBindTexture(GL_TEXTURE_2D, texture[3]); //_layer2
    glUniform1i(_textureUniform, 3);

    glActiveTexture(GL_TEXTURE0 + 4);
    glBindTexture(GL_TEXTURE_2D, texture[4]); //_layer3
    glUniform1i(_textureUniform, 4); 

【问题讨论】:

  • 当您想使用多个纹理时,您还需要着色器中的多个采样器并组合它们的结果。 Atm,您在每次纹理绑定后覆盖制服的绑定。
  • 你好,你能分享多个纹理的示例着色器吗?

标签: opengl-es textures


【解决方案1】:

当使用多个纹理时,还必须在着色器中使用多个采样器。这可能看起来像这样:

in vec2 uv;

out vec3 color;

uniform sampler2D floor_texture;
uniform sampler2D layer0_texture;

void main()
{
    vec4 f = texture(floor_texture, uv);
    vec4 l0 = texture(layer0_texture, uv);

    color = mix(f.rgb, l0.rgb, 1 - l0.a);
}

请注意,组合取决于您想要实现的目标,此处只是一个示例。

【讨论】:

  • 您是否设置了两个采样器制服?将 mix 的第三个参数替换为 0 或 1 会发生什么?
  • 是的,两个采样器是统一的。添加上述代码后,程序链接错误,这就是它显示灰色屏幕的原因。
  • 您必须将我的代码示例改编为您的着色器。 (尤其是输入和输出的变量名)。
  • 我正在开发 IOS,所以我做了一些改动,这是我的着色器
【解决方案2】:

这是我的着色器

precision highp float;
varying vec2 interpolatedTextureCoordinate;
uniform sampler2D sourceTexture;
uniform float amount;
uniform sampler2D layerTexture;
const float PI = 3.14159265358979323846264;
const vec4 backgroundColor = vec4(0.0, 0.0, 0.0, 1.0);
const vec2 center = vec2(0.5, 0.5);
void main()
{   
vec4 source = texture2D(sourceTexture, interpolatedTextureCoordinate);
vec4 layer0 = texture2D(layerTexture, interpolatedTextureCoordinate);
float sigma = amount;
float distance = distance(center, interpolatedTextureCoordinate);
loat alpha = 2.0 * (1.0 / sqrt(2.0 * PI)) * exp((-sigma) * pow(distance, 2.0));   
gl_FragColor = mix(source.rgb, layer0.rgb , 1-layer0.a);

}

问候 沙提亚

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 2011-06-22
    相关资源
    最近更新 更多