首页 > 解决方案 > 复制 mipmap 时 OpenGL 直通着色器跳过像素

问题描述

我正在尝试使用简单的直通着色器将纹理级别从一个纹理复制到另一个纹理:

#version 330 core
in  vec2 TexCoord;
out vec4 FragColor;

uniform sampler2D scene;
uniform int level;

void main()
{             
    FragColor   = textureLod(scene, TexCoord, level);
}

我将图像渲染到 FBO,生成 mipmap,然后将该 FBO 逐层复制到另一个 FBO,然后将其中一个层渲染到默认帧缓冲区,始终使用最基本的直通着色器。使用以下数据执行复制:

float quadVertices[] = {
    //   positions        texture Coords
    //----------------    -----------
    -1.0f,  1.0f, 0.0f,   0.0f, 1.0f,
    -1.0f, -1.0f, 0.0f,   0.0f, 0.0f,
     1.0f,  1.0f, 0.0f,   1.0f, 1.0f,
     1.0f, -1.0f, 0.0f,   1.0f, 0.0f,
};

这在复制级别 0 和 1 时效果很好:

在此处输入图像描述

我可以将第 2 层从一个 FBO 直接复制到默认帧缓冲区,而且看起来还不错。

在此处输入图像描述

但是由于某种原因,当先复制到另一个 FrameBuffer,然后再复制到默认帧缓冲区时,看起来有些问题:

在此处输入图像描述

所有这些副本都使用相同的直通着色器。着色器如何在某些情况下工作,而在其他情况下却不行?

我的过滤器设置为 GL_LINEAR 和 GL_LINEAR_MIPMAP_LINEAR。我根本没有收到任何 OpenGL 错误报告。

标签: openglshadermipmaps

解决方案


推荐阅读