OpenGLES 使用 glReadPixels 读取 RGB 值时,Alpha 值会修改它们

问题描述 投票:0回答:2

glReadPixels
读出 rgba(1,1,1,0.1) 时将得到 rgba(0.1,0.1,0.1,???)。该函数正在从帧缓冲区读取修改后的值,我认为是因为 alpha 混合。

我使用的示例具有以下设置:

片段着色器:

String fragmentShaderSource =
        "  #version 440\n" +
        "  out vec4 gl_FragColor;\n" +
        "  in vec4 gl_FragCoord;  \n" +
        "  varying vec2 v_texCoords;\n" +
        "\n" +
        "  uniform float chunkSize;\n" +
        "  layout(binding=1)uniform sampler2D inputs1;\n" +
        "  layout(binding=2)uniform sampler2D inputs2;\n" +
        "\n" +
        "  void main(void){\n" +
        "    gl_FragColor.r = 1;\n" +
        "    gl_FragColor.g = 1;\n" +
        "    gl_FragColor.b = 1;\n" +
        "    gl_FragColor.a = 0.1;\n" +
        "  }"
        ;

初始化:

fboHandle = Gdx.gl.glGenFramebuffer();
Gdx.gl.glBindFramebuffer(GL20.GL_FRAMEBUFFER, fboHandle);

/* Create output texture */
outputTextureHandle = Gdx.gl.glGenTexture();
Gdx.gl.glActiveTexture(GL20.GL_TEXTURE0);
Gdx.gl.glBindTexture(GL20.GL_TEXTURE_2D, outputTextureHandle);
Gdx.gl.glTexParameteri(GL20.GL_TEXTURE_2D, GL20.GL_TEXTURE_MIN_FILTER, GL20.GL_NEAREST);
Gdx.gl.glTexParameteri(GL20.GL_TEXTURE_2D, GL20.GL_TEXTURE_MAG_FILTER, GL20.GL_NEAREST);
Gdx.gl.glTexImage2D(
    GL20.GL_TEXTURE_2D, 0, GL30.GL_RGBA32F,
    width, height, 0, GL20.GL_RGBA, GL20.GL_FLOAT, null
);

/* Configure Framebuffer */
/* Set "renderedTexture" as our colour attachement #0 */
Gdx.gl.glFramebufferTexture2D(
    GL20.GL_FRAMEBUFFER, GL20.GL_COLOR_ATTACHMENT0,
    GL20.GL_TEXTURE_2D, outputTextureHandle, 0
);

渲染后:

Gdx.gl30.glReadPixels(0,0,width, height, GL20.GL_RGBA, GL20.GL_FLOAT, resultBuf);
System.out.println("result r: " + resultBuf.get(0));
System.out.println("result g: " + resultBuf.get(1));
System.out.println("result b: " + resultBuf.get(2));
System.out.println("result a: " + resultBuf.get(3));

输出:

result r: 0.1
result g: 0.1
result b: 0.1
result a: 0.90999997

我不明白为什么alpha值是这样的。根据这个答案,在渲染到帧缓冲区时,Alpha 通道会丢失,并用于修改像素值。

我的问题:

  • 当 RGB 值发生“组合”时,Alpha 通道会发生什么?
  • 我明白除了 alpha 之外的像素值会发生什么,但这是为什么?
  • 是否可以禁用此行为,以便使用
    glReadPixels
    保留 alpha 值以及原始像素值?

添加: 当调用

Gdx.gl.glBlendFunc(GL20.GL_ONE, GL20.GL_ZERO);
或使用
Gdx.gl.glDisable(GL20.GL_BLEND);
禁用混合时,会观察到相同的行为。

使用渲染缓冲区代替纹理颜色附件具有相同的效果。

java opengl-es libgdx lwjgl framebuffer
2个回答
0
投票

glReadPixels
未修改任何值。

我认为你的帧缓冲区的像素开始为 rgba(0,0,0,1),然后你使用 rgba(1,1,1,0.1) 并启用 alpha 混合进行渲染。

所以你看到的是:

src * srcalpha + dest * (1.0 - srcalpha)

(1,1,1,0.1)*0.1 + (0,0,0,1)*0.9 = (0.1,0.1,0.1,0.901)

您需要禁用 Alpha 混合才能看到您期望的结果(我假设您正在期望

rgba(1,1,1,0.1)
)。

它是

glDisable(GL_BLEND)
或者可能是
Gdx.gl.glDisable(GL20.GL_BLEND)
用于您的 libgdx。


0
投票

我在处理时遇到问题(www.processing.org)。

使用

blendMode(REPLACE);
为我解决了这个问题。 我用调试器一步步抛出它,这就是正在设置的内容:

pgl.enable(PGL.BLEND);
pgl.blendEquation(PGL.FUNC_ADD);
pgl.blendFunc(PGL.ONE, PGL.ZERO);
© www.soinside.com 2019 - 2024. All rights reserved.