opengl - 在 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)
解决方案
您可能正在使用纹理图集。为了使用双线性过滤,您需要在已打包到图集中的各种精灵之间提供更多间距。
推荐阅读
- botframework - 获取 HeroCard 的值并在 Carousel 中展示
- javascript - 从代码隐藏中触发引导模式弹出窗口不起作用
- javascript - 在 React Developer Tool 中显示来自 useState 的状态变量的名称
- python - 使用 pandas 将 dict 数据转换为数据框
- java - 如何使用arrayList在Iterator中实现next()
- imagemagick - 如何将PNG转换为pdf并将图像居中?
- node.js - Bigquery Javascript UDF 使用存储和 kms 库
- excel - 在多个工作表的一列中填写工作表名称
- nltk - 是否可以用标记数据训练情绪分类模型,然后用它来预测未标记数据的情绪?
- python - 如何将 i 变成整数?