【问题标题】:Writing raw data to texture using GLSL, lwjgl使用 GLSL、lwjgl 将原始数据写入纹理
【发布时间】:2021-04-20 03:27:34
【问题描述】:

目前,我需要片段着色器写入纹理(它确实如此),但不是覆盖,而是混合。这是片段着色器本身

#version 400 core

in vec2 pass_textureCoordinates;

out vec4 out_Color;
layout(location = 1) out vec4 out_location0;

uniform sampler2D modelTexture;
uniform sampler2D bumpTexture;

uniform sampler2D overlayTexture;
uniform sampler2D scratchLevels;

void main(void)
{
    vec2 txt = pass_textureCoordinates;
    vec4 base = texture(overlayTexture,txt);
    vec4 over = texture(modelTexture,txt);
    
    float baseA = base[3] * (1.0f - over[3]);
    float overA = over[3];
    float finalA = base[3] + (1.0f - base[3]) * overA;
    if(finalA == 0)
    {
        out_Color[0] = 0;
        out_Color[1] = 0;
        out_Color[2] = 0;
    }
    else
    {
        out_Color[0] = (base[0] * baseA + over[0] * overA) / finalA;
        out_Color[1] = (base[1] * baseA + over[1] * overA) / finalA;
        out_Color[2] = (base[2] * baseA + over[2] * overA) / finalA;
    }
    out_Color[3] = finalA; 
    out_location0 = out_Color;
}

如何在不混合的情况下写入纹理?

编辑:我也需要覆盖 alpha 通道

【问题讨论】:

  • "但不是覆盖,而是混合。" - 那么,为什么不禁用blending?或者,您可以将输出的 alpha 通道设置为 1:out_Color[3] = 1.0;

标签: java opengl glsl textures lwjgl


【解决方案1】:

Blending 取决于混合功能,可以禁用 (glDisable(GL_BLEND))。
如果您使用传统的 alpha 混合功能 (glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)) 或预乘 alpha 混合 (glBlendFunc(GL_SRC_ALPHA, GL_ONE)),您可以通过将输出 alpha 通道设置为 1 来将纹理视为不透明:

out_Color[3] = finalA;

out_Color[3] = 1.0;

【讨论】:

    【解决方案2】:

    您有多种解决方案可供选择:

    1. 最简单的方法是在渲染调用 glDisable(GL_BLEND) 之前禁用混合,然后再次启用它
    2. 您可以在渲染之前使用 opengl 调用清除纹理数据(如果这是您想要的),例如glClear(GL_COLOR_BUFFER_BIT)glClearColor(r,g,b)
    3. 更改片段着色器中的 Alpha,例如到 if(out_Color.a > 0) out_Color = vec4(vec3(0,0,0)*(1.0-out_Color.a) + out_Color.rgb*out_Color.a, 1.0); 这只是手动将背景设置为黑色,但如果 out_Color.a == 0 也可以丢弃它(只是 discard;,这将 - 至少没有 glClear 调用 - 导致旧数据在该像素处保持可见) .

    希望能帮到你:)

    【讨论】:

      猜你喜欢
      • 2015-01-22
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      相关资源
      最近更新 更多