我最初在gamedev上问了这个问题,但没有一个答案有助于解决问题,我仍然不知道究竟是什么原因.我没有看到任何关于在常见问题解答中重新发布SE的问题,所以我只能希望这没关系.此外,回想起来,问题可能与图形编程有关,而不仅仅是游戏开发.
编辑1开始
原始帖子的行为仅适用于Windows XP和Windows 7,浏览器Firefox和Chrome.在Ubuntu上,没有这样的失真,而是在相机旋转时纹理"抖动".当旋转停止时,摇动停止,但纹理可能不在完全正确的位置.
编辑1结束
编辑3开始
该程序已经在4台不同的计算机上进行了测试,并且没有按预期在任何计算机上运行.
编辑3结束
我在WebGL中有一个大的体素,我希望用平铺纹理覆盖每个瓷砖在顶点空间中的边长为1.在该测试场景中,相机指向负z方向,并且体素的侧面在xy,xz,yz平面中.
较小的体素(即较少的重复)效果很好,但是每个面部大约2000 x和y重复(即体素大小2000*2000*2000),纹理开始看起来非常难看.当相机垂直于脸部时,无论重复的大小/数量如何,纹理看起来都是正确的,但对于上述尺寸的体素,任何甚至几度的旋转都会引起明显的问题.增加体素尺寸会增加失真.反之亦然:对于小体素,无论相机旋转如何,纹理看起来都是正确的.在我看来,尺寸没有硬阈值,但是当体素从每边约2000个增加时,效果开始从零开始逐渐增加.
有关可视化,请参见http://imgur.com/a/spQIv.第一个图像是它应该是什么样子,但是当旋转相机时,线条开始像第二个图像一样变形.通过增加体素大小和更多地旋转相机,效果会变得更糟.http://imgur.com/a/wRndy包含两个影响更严重的附加图像.
纹理(每个纹理一个X)最初为512*512像素.屏幕截图没有以任何方式缩放.
我的第一个猜测是浮动不准确,但很难相信,因为对象只有1000的数量级.
我的第二个猜测是某种奇怪的int/float舍入错误,但由于所有内容总是在浮点数中处理,我不知道这是怎么发生的.
我能想到的第三种可能性是,这是不可能的,纹理不应该多次重复.但是,这似乎不太可能是IMO.我的猜测(和希望)是存在某种非常基本的问题.
关于什么可能导致或通常导致这种事情的任何建议都很受欢迎,因为我似乎很难在我自己的范围内努力缩小这个问题的根源.
我正在使用:
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);
gl.generateMipmap(gl.TEXTURE_2D);
Run Code Online (Sandbox Code Playgroud)
并在着色器中:
#ifdef GL_ES
precision highp float;
#endif
Run Code Online (Sandbox Code Playgroud)
我还进行了一些非常基本的计算:对于32位浮点数,最大有效数是大约840万.对于体素边长2000(我注意到效果变得可见的水平),人们可以天真地期望坐标中大约0.00025的浮动舍入误差.假设每个重复在屏幕中占用大约100个像素,则误差应该明显小于1个像素,但情况并非如此.除非上面的计算不正确,否则我会提名Float32不应该受到指责,原因必须是其他地方.
线条纹理仅用于可视化问题.问题还存在于其他(更自然)的纹理中.
编辑2开始
启用或禁用抗锯齿功能没有明显区别
编辑2结束