Quad Texture 奇怪的行为 OpenGL 旧 GPU

Posted

技术标签:

【中文标题】Quad Texture 奇怪的行为 OpenGL 旧 GPU【英文标题】:Quad Texture weird behaviour OpenGL old GPU 【发布时间】:2018-01-17 20:29:11 【问题描述】:

我正在为学校编写一个 Pascal 项目(使用 Lazarus),当该项目在其中一台学校计算机上执行时,我遇到了一些奇怪的行为。

从 2011 年开始,它在配备 NVidia 650M 的笔记本电脑上运行良好。学校的计算机驱动程序已经过时,所以它回退到 Windows GDI,它基本上是 OpenGL 1.1 的软件实现。所以也许显卡不是问题的原因。

另外值得一提的是,只有在对 mag 和 min 过滤器使用 GL_NEAREST 方法时才会发生这种情况。例如,将 GL_LINEAR 用于 MAG 并将 GL_NEAREST 用于 MIN 时,不会出现此问题。

这是加载纹理的代码:

tex := LoadTGA(filename);
if tex.iType = 2 then
begin
  glGenTextures(1, @(Result.textureID));
  glBindTexture(GL_TEXTURE_2D, Result.textureID);

  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

  if tex.bpp = 3 then glFormat := GL_BGR
  else glFormat := GL_BGRA;

  glTexImage2D(GL_TEXTURE_2D, 0, tex.bpp, tex.w, tex.h, 0, glFormat, GL_UNSIGNED_BYTE, tex.data);

  FreeMem(tex.data);
end;

这是渲染四边形的代码:

glColor3ub(255, 255, 255);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, q.surface.textureID);
glBegin(GL_QUADS);
  glTexCoord2f(0, 1); glVertex3f(q.points[0].x, q.points[0].y, q.points[0].z);
  glTexCoord2f(1, 1); glVertex3f(q.points[1].x, q.points[1].y, q.points[1].z);
  glTexCoord2f(1, 0); glVertex3f(q.points[2].x, q.points[2].y, q.points[2].z);
  glTexCoord2f(0, 0); glVertex3f(q.points[3].x, q.points[3].y, q.points[3].z);
glEnd;
glDisable(GL_TEXTURE_2D);

纹理的格式为 32x32 像素。

更新: 事实证明,彩色四边形也遇到了类似的错误。在带有彩色四边形的图片中,GDI 似乎先进行裁剪,然后再应用颜色。应该反过来。现在我们只需要找出原因。 我在下图中绘制了剪裁三角形的边缘,等等,你可以准确地看到纹理“不一致”的位置

图片:

【问题讨论】:

【参考方案1】:

很难猜。该问题可能与在 Nvidia 和 ATI 驱动程序中实现的纹理插值的差异有关。使用GL_LINEAR,您使用不同的插值方法并且“接缝”不可见。 一些想法:

尝试用纯色填充四边形,例如黄色,然后检查单独的三角形是否也可见。 使用两个三角形(6 个顶点)而不是 GL_QUADS 创建四边形。 您是否按逆时针顺序传递顶点?

【讨论】:

我按逆时针顺序通过了顶点。不是两个三角形之间有条带什么的,整个纹理看起来有点怪。

以上是关于Quad Texture 奇怪的行为 OpenGL 旧 GPU的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL顶点属性指针奇怪的行为

OpenGL纹理随机未显示

使用两个着色器时的opengl奇怪行为

OpenGL奇怪的渲染行为(闪烁的面孔)

gluUnProject 尝试将鼠标坐标转换为 opengl 坐标的奇怪行为

使用制服时 Xamarin OpenGL 片段着色器的奇怪行为