首页 > 解决方案 > 在 GLSL 中使用 GL_LINEAR 时使用 CLAMP_TO_EDGE 无法正常工作

问题描述

我正在尝试使用 OpenGL/GLSL 绘制纹理,并且可以将纹理调整为比原始尺寸大得多的尺寸。当我使用以下代码创建纹理时:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, imageDepth, GL_UNSIGNED_BYTE, pixels);
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_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

我收到以下结果:

在此处输入图像描述

所以...我尝试通过将 GL_NEAREST 更改为 GL_LINEAR 来改善结果:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, imageDepth, GL_UNSIGNED_BYTE, pixels);
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_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

然后我得到以下结果:

在此处输入图像描述

如您所见,结果要好得多,但是有那些烦人的边框伪影(用红色圆圈标记)。我试过 GL_CLAMP、GL_CLAMP_TO_EDGE、GL_CLAMP_TO_BORDER 但结果总是一样的。有什么我想念的还是它就是这样?

抽奖本身由以下方式执行:

glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, m_vertex_buffer[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(textureVerticesCoordinates), textureVerticesCoordinates, GL_STREAM_DRAW);
glVertexAttribPointer((GLuint)0, 2, GL_FLOAT, GL_TRUE, 0, 0);

glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, m_vertex_buffer[2]);
glBufferData(GL_ARRAY_BUFFER, sizeof(textureImageCoordinates), textureImageCoordinates, GL_STREAM_DRAW);
glVertexAttribPointer((GLuint)1, 2, GL_FLOAT, GL_TRUE, 0, 0);

glBindVertexArray(1);
glBindTexture(GL_TEXTURE_2D, texture_index);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glBindTexture(GL_TEXTURE_2D, 0);

textureVerticesCoordinates是绘图空间中坐标的缓冲区。 textureImageCoordinates是纹理坐标的缓冲区(0.0 = topLeft,1.1 = bottomRight)

标签: opengltexturesopengl-3texture2d

解决方案


您可能正在使用纹理图集。为了使用双线性过滤,您需要在已打包到图集中的各种精灵之间提供更多间距。


推荐阅读