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
,您使用不同的插值方法并且“接缝”不可见。
一些想法:
GL_QUADS
创建四边形。
您是否按逆时针顺序传递顶点?
【讨论】:
我按逆时针顺序通过了顶点。不是两个三角形之间有条带什么的,整个纹理看起来有点怪。以上是关于Quad Texture 奇怪的行为 OpenGL 旧 GPU的主要内容,如果未能解决你的问题,请参考以下文章