gpt4 book ai didi

opengl - 为什么我的 GLSL 着色器会呈现乳沟?

转载 作者:行者123 更新时间:2023-12-04 23:17:35 26 4
gpt4 key购买 nike

我正在研究 2D 中的延迟照明技术,使用帧缓冲区使用 GL_MAX 混合方程累积光源。

这是将一个光源(几何体是一个没有纹理的四边形,我只使用片段着色器进行着色)渲染到我的缓冲区时得到的结果:

enter image description here

这正是我想要的 - 来自光源的衰减。然而,当两个光源彼此靠近时,当它们重叠时,它们似乎会在它们相遇的地方产生较低的 RGB 值,如下所示:

enter image description here

为什么两者之间有一条较暗的线? 我期待着 GL_MAX混合方程,它们将使用每个位置中片段的最大值平滑地相互混合。

这是 FBO 的设置(使用 LibGDX):

    Gdx.gl.glClearColor(0.14f, 0.14f, 0.19f, 1); 
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
Gdx.gl.glBlendEquation(GLMAX_BLEND_EQUATION);
Gdx.gl.glBlendFunc(GL20.GL_SRC_COLOR, GL20.GL_DST_COLOR);
Gdx.gl.glEnable(GL20.GL_BLEND);

我不认为在使用这个方程时调用 glBlendFunc 实际上是必要的。 GLMAX_BLEND_EQUATION设置为 0x8008 .
varying vec2 v_texCoords;
varying vec2 v_positionRelativeToLight;
uniform sampler2D u_texture;
uniform vec3 u_lightPosition;
uniform vec3 u_lightColor;

void main() {
float distanceToLight = length(v_positionRelativeToLight);
float falloffVarA = 0.1;
float falloffVarB = 1.0;
float attenuation = 1.0 / (1.0 + (falloffVarA*distanceToLight) + (falloffVarB*distanceToLight*distanceToLight));
float minDistanceOrAttenuation = min(attenuation, 1.0-distanceToLight);
float combined = minDistanceOrAttenuation * attenuation;
gl_FragColor = vec4(combined, combined, combined, 1.0);
}

由于此片段着色器通常更复杂,因此传入了额外的变量,但我已将其缩减以仅显示衰减和混合的行为。

这发生在我在它们相遇的地方渲染的每个光源之间 - 而不是我期望的颜色,两个光源的相遇 - 两个四边形之间的等距点,是我期望的较暗的颜色。知道为什么以及如何解决它吗?

最佳答案

这是从第二个图像中减去第一个图像的结果:

Result of image 1 subtracted from image 2

第一个的背景不是很黑,因此右侧变黄,但除此之外,您可以清楚地看到左侧保留原始值的黑色区域,较暗的弧线,其中评估了两个灯的值,但右侧是更大,然后是原始光线未触及的所有右侧区域。

因此,我认为您正在获得最大选择混合。但你想要的是加法混合:

Gdx.gl.glBlendFunc(GL20.GL_ONE, GL20.GL_ONE);

...并将混合方程保留为默认值 GL_FUNC_ADD .

关于opengl - 为什么我的 GLSL 着色器会呈现乳沟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36426012/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com