Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用GLSL、lwjgl将原始数据写入纹理_Java_Opengl_Glsl_Textures_Lwjgl - Fatal编程技术网

Java 使用GLSL、lwjgl将原始数据写入纹理

Java 使用GLSL、lwjgl将原始数据写入纹理,java,opengl,glsl,textures,lwjgl,Java,Opengl,Glsl,Textures,Lwjgl,目前,我需要片段着色器写入纹理(确实如此),但不是覆盖,而是混合。这是片段着色器本身 #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 overla

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

#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通道

取决于混合功能,并且可以禁用(
glDisable(GL\u混合)
)。
如果正在使用传统的alpha混合函数(
glBlendFunc(GL_SRC_alpha,GL_ONE_减去_SRC_alpha)
)或预乘alpha混合(
glBlendFunc(GL_SRC_alpha,GL_ONE)
),则可以通过将输出alpha通道设置为1来将纹理视为不透明:

out\u Color[3]=finalA

out_Color[3]=1.0;

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

  • 最简单的方法是在渲染调用
    glDisable(GL\u BLEND)
    之前禁用混合,然后再次启用
  • 您可以在渲染之前(如果您需要的话)通过opengl调用清除纹理数据,例如
    glClear(GL\u COLOR\u BUFFER\u BIT)
    glClearColor(r,g,b)
  • 将片段着色器中的alpha更改为
    if(out\u Color.a>0)out\u Color=vec4(vec3(0,0,0)*(1.0-out\u Color.a)+out\u Color.rgb*out\u Color.a,1.0)
    这只是手动将背景设置为黑色,但是如果
    out\u Color.a==0,也可以放弃背景(只是
    放弃;
    ,这将-至少在没有glClear调用的情况下-导致旧数据在此像素处保持可见)
  • 我希望我能够帮助您:)

    “但它不是覆盖,而是混合。”-那么,为什么不禁用呢?或者,您可以将输出的alpha通道设置为1:
    out\u Color[3]=1.0