2015-10-08 95 views

回答

1

我会做的片段着色器。

  1. 绑定等距离长方圆柱纹理2D纹理
  2. 绑定投影着色器
  3. 拉伸四覆盖在屏幕上或靶结构
  4. 存储或使用的结果。

在顶点着色器我想:

只是传递的顶点坐标为varying到片段着色器(使用矩阵在这里你可以直接使用X无连接点,Y坐标范围<-1,+1>

在片段着色器我想:

  1. 计算azimuth和从点(0,0)(简单lengthatan2调用)
  2. 然后将它们转换成纹理(u,v)坐标(只是规模...)
  3. ,最后呈现片段与选定的纹理元素,或者出去扔出去插值vertexdistance范围...

[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度以匹配北方位角为UP的结果。

+0

谢谢!将尝试这个并回来它是如何工作的,很快 – zproxy

+0

工程! https://www.youtube.com/watch?v=jUqiRsRxWD8 – zproxy