【问题标题】:OpenGL Frag Shader texture fades after every write每次写入后,OpenGL Frag Shader 纹理都会消失
【发布时间】:2018-08-08 10:05:24
【问题描述】:

我有一个程序采用以下纹理:

通过 FreeType2 生成。基本上,它为我要求绘制的每个角色创建了一个纹理图集。如您所见,字符明亮清晰。实际上,当我在 RenderDoc 中检查纹理时,您可以看到小写“i”的最左上角像素的值为 71(在 255 之外)或 0.7098

接下来,引擎将字母 blit 到帧缓冲区对象上。这是通过纹理四边形完成的。顶点着色器:

#version 330

layout(location=0) in vec2 inVertexPosition;
layout(location=1) in vec2 inTexelCoords;
layout(location=2) in float inDepth;

out vec2 texelCoords;
out float depth;

void main()
{
    gl_Position = vec4(inVertexPosition.x,-inVertexPosition.y, 0.0, 1.0);
    texelCoords = vec2(inTexelCoords.x,1-inTexelCoords.y);
    depth = inDepth;
}

片段着色器:

#version 330

layout(location=0) out vec4 frag_colour;

in vec2 texelCoords;
in float depth;

uniform sampler2D uTexture;
uniform vec4 uTextColor;

void main()
{
    vec4 c = texture(uTexture,texelCoords);
    frag_colour = uTextColor * c.r;
    gl_FragDepth = depth;
}

如您所见,它将像素颜色设置为红色通道的一个因素。

但是,当我通过 RenderDoc 查看 FBO 的内容并在此处保存到文件时,您会看到:

如果你不透明地看这个(只是在 Gimp 中添加了第二层以更好地说明):

您可以看到文本与之前相比有些褪色。如果您查看小写“i”的最左上角像素,它现在的值是 50.2,或者对于 0-1 的范围,它是 0.50196(通过 RenderDoc)。

接下来,当 FBO 最终通过另一个带纹理的四边形放置到屏幕上时,它会更加淡化。首先是顶点着色器:

#version 330

layout(location=0) in vec2 inVertexPosition;
layout(location=1) in vec2 inTexelCoords;

varying vec2 texelCoords;

void main()
{
    gl_Position = vec4(inVertexPosition.x,-inVertexPosition.y, 0.0, 1.0);
    texelCoords = vec2(inTexelCoords.x,1-inTexelCoords.y);
}

和片段着色器:

#version 330

precision highp float;

layout(location=0) out vec4 frag_colour;

varying vec2 texelCoords;

uniform sampler2D uTexture;

void main()
{
    vec4 c = texture(uTexture,texelCoords);
    frag_colour = c;
}

结果,正如我所说,比以前更褪色:

原文:

gimp 背景清晰:

现在该像素的值为25.10.05139

是什么导致每次渲染后出现这种褪色?

我认为重要的是要注意较亮的区域不会褪色。

我的 Framebuffer 创建代码

glGenFramebuffers(1, &m_framebuffer);
glGenTextures(1, &m_fboColorAttachment);
glGenTextures(1, &m_fboAdditionalInfo);
glGenTextures(1, &m_fboDepthStencil);

glCall(glBindFramebuffer,GL_FRAMEBUFFER, m_framebuffer);

    /* setup color output 0 */
    glBindTexture(GL_TEXTURE_2D, m_fboColorAttachment);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
        glCall(glTexImage2D, GL_TEXTURE_2D, 0, GL_RGBA8, screenDimensionsX, screenDimensionsY, 0, GL_BGRA, GL_UNSIGNED_BYTE, nullptr);
        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_fboColorAttachment, 0);
    glBindTexture(GL_TEXTURE_2D, 0);

    /* setup color output 1 */
    glBindTexture(GL_TEXTURE_2D, m_fboAdditionalInfo);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
        glCall(glTexImage2D, GL_TEXTURE_2D, 0, GL_R32UI, screenDimensionsX, screenDimensionsY, 0, GL_RED_INTEGER, GL_UNSIGNED_INT, nullptr);
        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, m_fboAdditionalInfo, 0);
    glBindTexture(GL_TEXTURE_2D, 0);

    /* setup depth and stencil */
    glBindTexture(GL_TEXTURE_2D, m_fboDepthStencil);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
        glCall(glTexImage2D, GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, screenDimensionsX, screenDimensionsY, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, nullptr);
        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, m_fboDepthStencil, 0);
    glBindTexture(GL_TEXTURE_2D, 0);

初始(红色)纹理创建:

glActiveTexture(GL_TEXTURE0);
glGenTextures(1,&textureData.texture);
glBindTexture(GL_TEXTURE_2D,textureData.texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, 500, 500, 0, GL_RED, GL_UNSIGNED_BYTE, 0);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

我的混合完成了

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

【问题讨论】:

  • 50.225.1(共 255 个)的值在某些整数表示中 是多少?除此之外,检查你的纹理过滤器,检查你的 texcoords,检查你的制服,检查你的帧缓冲格式,检查你的混合设置。这个问题无法回答,因为它缺少对控制实际输出颜色的大部分状态的描述。

标签: opengl shader


【解决方案1】:

值为71(在255之外)或0.7098

不知道,你在这里的意思。 71/255 将是 0.2780.7098 标准化将是181255。看起来您的“满分 255”只是百分比值,满分 100%。

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

您将红色通道中的颜色值也用作 alpha,因此,当您启用混合时,您最终会得到 0.7098*0.7098=.5038。由于结果将四舍五入到最接近的可表示值,我们宁愿以181/255 * 181/255 = .50382 结束,四舍五入为128/255

现在是 50.2 的值,或者对于 0-1 的范围,它是 0.50196

128/2550.50196078...

所以解决方案是:在不需要时禁用所有步骤的混合。或者,如果您需要,设置有用的 alpha 值。

旁注:

现在该像素的值为25.10.05139

不知道这意味着什么,25.10.05139 没有任何明显的关系,你明确地再次改变了这些值的含义。

【讨论】:

  • 将 png 加载到 Gimp 中。整数值来自 gimp(即使是十进制值......我不知道 gimp 在做什么)。不过绝对是255分。浮点数来自 renderdoc,png 从 renderdoc 保存。
  • “整数值来自 gimp(即使是十进制值...)”。不。 整数 根据定义没有小数。我也不知道您可能指的是 GIMP 的什么值。
  • 在最新版本的 gimp 中加载 png。使用吸管工具检查颜色值。 Gimp 显示十进制值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-30
  • 2016-07-08
  • 2022-11-20
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多