geometry - 如何将着色器转换为 azimuthal_equidistant

标签 geometry glsl projection

我有一个360 texture等距柱状投影。

用什么GLSL着色器我可以将它转换成azimuthal equidistant projection

另请参阅: http://earth.nullschool.net/#current/wind/isobaric/500hPa/azimuthal_equidistant=24.64,98.15,169

最佳答案

我会在片段着色器中执行此操作。

  1. 将等距矩形纹理绑定(bind)为 2D 纹理
  2. 绑定(bind)投影着色器
  3. 绘制覆盖屏幕或目标纹理的四边形
  4. 存储或使用结果。

在顶点着色器中我会:

只需将顶点坐标传递为 varying到片段着色器(这里没有必要使用矩阵,您可以直接使用 <-1,+1> 范围内的 x,y 坐标)

在片段着色器中我会:

  1. 计算azimuthdistance插值 vertex从点(0,0) (简单的 lengthatan2 调用)
  2. 然后将它们转换为 (u,v)纹理坐标(只是比例...)
  3. 最后使用选定的纹素渲染片段,或者如果超出范围则将其丢弃......

[edit1]刚刚做了一个小例子:

GL抽奖

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

GLint id;
glUseProgram(prog_id);
id=glGetUniformLocation(prog_id,"txr"); glUniform1i(id,0);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glDisable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,txrmap);

glBegin(GL_QUADS);
glColor3f(1,1,1);
glVertex2f(-1.0,-1.0);
glVertex2f(-1.0,+1.0);
glVertex2f(+1.0,+1.0);
glVertex2f(+1.0,-1.0);
glEnd();
glDisable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,0);

glUseProgram(0);
glFlush();
SwapBuffers(hdc);

顶点:

varying vec2 pos;
void main()
    {
    pos=gl_Vertex.xy;
    gl_Position=gl_Vertex;
    }

片段:

uniform sampler2D txr;
varying vec2 pos;
void main()
    {
    const float pi2=6.283185307179586476925286766559;
    vec4 c=vec4(0.0,0.0,0.0,1.0);
    vec2 uv;        // texture coord = scaled spherical coordinates
    float a,d;      // azimuth,distance
    d=length(pos);
    if (d<1.0)      // inside projected sphere surface
        {
        a=atan(-pos.x,pos.y);
        if (a<0.0) a+=pi2;
        if (a>pi2) a-=pi2;
        uv.x=a/pi2;
        uv.y=d;
        c=texture2D(txr,uv);
        }
    gl_FragColor=c;
    }

输入纹理:

earth rectangular

输出渲染:

earth azimuthal equidistant

[注释]

竖线是由于没有使用 GL_CLAMP_TO_EDGE 造成的在源纹理上。可以通过使用展位两侧移动 1 个像素的纹理坐标范围或使用 GL_CLAMP_TO_EDGE 来修复它。扩展名(如果存在)。

奇怪atan()操作数是向左旋转 90 度以匹配北方位角向上的结果。

关于geometry - 如何将着色器转换为 azimuthal_equidistant,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33012236/

相关文章:

algorithm - 最小面积四边形算法

opencv - 在多边形中混合颜色

opengl - glStencilFunc中mask参数的作用是什么

mysql - 如何在mysql中将点添加到多边形或几何图形的所有点?

algorithm - 往返经纬度和3D点的可逆算法

c++ - 属性的多个缓冲区如何在 openGL (ES) 着色器和 C++ api 中工作

glsl - 一次绘制中 glsl 片段着色器执行多少次?

Grails 预测分组和计数

spring-boot - 如何在界面投影中为以 is 开头的 bool 变量正确设置 getter setter?

python - 手动投影坐标类似于python中的gluLookAt