0

这是来自 openGL 超级圣经(第 5 版,第 208 页)的引述:

The first is an effect called scintillation (aliasing artifacts) that appears 
on the surface of objects rendered very small on-screen compared to the 
relative size of the texture applied. Scintillation can be seen as a sort of 
sparkling that occurs as the sampling area on a texture map moves 
disproportionately to its size on the screen. The negative effects of 
scintillation are most noticeable when the camera or the objects are in motion.

我目前面临着完全相同的问题,(我正在加载一个 4912 x 3264 像素的图像)并进行一些仿射变换,如旋转和平移。它显示出模糊性,尤其是在加载的纹理具有白色像素的情况下(这可能不是一般观察,但我正在观察)。这是代码:

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image->width,image->height, 0, GL_BGR, GL_UNSIGNED_BYTE, image->imageData);
//gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGB,image->width,image->height, GL_BGR,GL_UNSIGNED_BYTE,image->imageData);

动画很流畅,除了剧透,一切都很完美。有人可以帮助我改善这种情况,因为我正在开发一个对这些东西有很大关注的应用程序吗?

另外,如果使用后glTexImage2D,如果我使用glGenerateMipmap(GL_TEXTURE_2D),它会给segmentation fault (core dump)。知道我可能会错过什么吗?

4

3 回答 3

1

如果使用 OpenGL ES/WebGL,请确保纹理的大小是 2 的幂。否则 mipmap 生成或纹理过滤无法正常工作,从而导致伪影。

来源:http ://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glGenerateMipmap.xml

于 2020-04-10T09:03:27.700 回答
0

除非您使用错误的缓冲区对象、没有足够的数据读取或其他一些非常奇怪的状态调用渲染函数,否则 OpenGL 不应崩溃。所以这里发生了某种形式的驱动程序错误。

ATI 驱动程序有一个很老的问题,glGenerateMipmap如果你不glEnable(GL_TEXTURE_2D)先打电话,哪里会失败。我不知道这是否会对您有所帮助,但您可以尝试一下。

于 2013-06-03T21:22:05.920 回答
-1

好的,我想回答一下,我找到了解决方案:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);

将此设置为纹理的参数接近完美!我不知道这是否是最佳选择,但效果很好。

但现在有一个问题:在加载纹理时,它无法使用(它提供整个白色填充而不是图像纹理):

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image->width,image->height, 0, GL_BGR, 
GL_UNSIGNED_BYTE, image->imageData);

你需要使用gluBuild2DMipmaps()调用。在考虑它时,我以某种方式试图证明它为什么不起作用,但如果有人可以评论它,我真的很想。

于 2013-06-04T11:05:39.770 回答