c++ - 在纹理 OpenGL 中使用 GL_LINEAR 时的外部伪影

标签 c++ opengl texture-mapping

我成功地在 openGL 中使用纹理生成了高度图。该数据的全貌如下图所示。但是,当我在我的 glTexParameteri (MinMag) 中使用 GL_LINEAR 选项时,它会给我外部伪像。

这是我的 glTexParameter

if (interpolate) {
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}
else {
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
}

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

这是我的片段着色器代码

    "varying vec2 tex;\n"
    "uniform int colorSizeI;\n"
    "uniform vec4 colorTable[512];\n"
    "uniform vec2 minmaxZ;\n"
    "uniform vec3 backgroundColor;\n"
    "uniform sampler2D diffuse;\n"
    "uniform float transparency;\n"
    "void main() {\n"
    "   float color = texture2D(diffuse, tex).r;\n"
    "   float h = (color - minmaxZ[0])/(minmaxZ[1] - minmaxZ[0]);\n"
    "   float colorSizeF = float(colorSizeI);\n"
    "   int i = 0;\n"
    "   float j = 0.0f;\n"
    "   vec3 base;\n"
    "   if (color == 0.0f) {\n"
    "       base = vec3(0.0f, 0.0f, 0.0f);}\n"
    "   else if (color <= minmaxZ[0]) {\n"
    "       base = colorTable[0].xyz;}\n"
    "   else if (color >= minmaxZ[1]) {\n"
    "       base = colorTable[colorSizeI - 1].xyz;}\n"
    "   else { \n"
    "       while (h >= (j + 1.0f)/colorSizeF) {\n"
    "           i += 1;\n"
    "           j += 1.0f;}\n"
    "       base = mix(colorTable[i].xyz, colorTable[i+1].xyz, colorSizeF*(h - (j/colorSizeF)));}\n"
    "   gl_FragColor = vec4(base, transparency);\n"
    "}\n";

这是使用 GL_Nearest 时的图像(一切正常) using GL Nearest

这是使用 GL_Linear 时的图像(出现外部插值伪像) using GL Linear

那么,有人知道如何去除这些伪影吗?

注意:当 color = 0 时,外部黑色也被认为是数据。

最佳答案

我假设您的纹理包装当前是 GL_REPEAT。你应该试试另一个。

GL_MIRRORED_REPEAT 或 GL_CLAMP_TO_EDGE 应该有效。

关于c++ - 在纹理 OpenGL 中使用 GL_LINEAR 时的外部伪影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48424988/

相关文章:

c++ - C++ 程序中的异常行为,经常崩溃

c++ - 当将变量声明移动到接近首次使用时,它们是否在 return 语句之后有关系吗?

c++ - 从 sdl 调色板表面创建 OpenGL 纹理 (SDL_PIXELFORMAT_INDEX8)

java - 图形:.obj 文件和 Material /纹理

c - OpenGL 纹理映射 : Whole object is a single texel's color

c++ - 基于STL的map类的Graph类中的模板参数

windows - glFlush() 在具有透明背景的窗口上需要很长时间

OpenGL 3D 纹理坐标

c# - 如何在不使用 GLUT 的情况下在 OpenGL 中绘制带纹理的环面?

c++ - 如何在 VS 中使用 asm 中的浮点变量