2015-10-08 23 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