我想绘制一个由256x256像素瓦片(很多)组成的 map 。这些占地很大。

将lat | lon(从地球)转换为x | y( map )的转换产生了很大的值。
有了这些大的值,就变得很精确,因此,如果我远离0/0点,则会在两个彼此相邻的Tile的纹理之间得到多个像素的误差(例如2E8 | 0和2E8-1 | 0)。

如何修复这些杂乱无用的网格外观?当前失败的实现是使用float绘制基元(这无关紧要,因为所有Tiles在两个坐标方向上均被裁剪为256的倍数)。

注意:我已经尝试过使用glTranslated来补偿偏移量,但是double的精度也不足够,或者这不是产生毛刺的原因。

最佳答案

实际上,我最近在实现整个行星从太空到地面的渲染过程中遇到了完全相同的问题。实际上,您需要做的是创建一个新的头寸结构,以在不同的浮标之间分配精度。例如,

struct location
{
     vec3 metre;
     vec3 megametre;
     vec3 terametre;
     vec3 examtre;
     vec3 yottametre;
};

然后,对所有运算符进行编码,并为此结构键入类型转换函数(+,-,*,/,toVec3),然后使用此location结构对摄像机和每个网格图块的位置进行编码。在渲染时,您不平移相机,而是按差异平铺图块。例如:
void render()
{
     // ...
     location diff = this->position - camera.position;
     vec3 diffvec = diff.toVec3();
     glPushMatrix();
     glTranslatef(diffvec.x, diffvec.y, diffvec.z);

     // render the tile
     glPopMatrix();
}

它的作用是从OpenGL管道中删除差值计算,而该流水线最多具有双​​精度,并将工作放在程序上,该程序实际上可以具有无限精度。现在,精度和准确度下降的是您与相机的距离越远,而不是与原件的距离越远。

编码愉快。

09-25 20:35