我會做的片段着色器。
- 綁定等距離長方圓柱紋理2D紋理
- 綁定投影着色器
- 拉伸四覆蓋在屏幕上或靶結構
- 存儲或使用的結果。
在頂點着色器我想:
只是傳遞的頂點座標爲varying
到片段着色器(使用矩陣在這裏你可以直接使用X無連接點,Y座標範圍<-1,+1>
)
在片段着色器我想:
- 計算
azimuth
和從點(0,0)
(簡單length
和atan2
調用)
- 然後將它們轉換成紋理
(u,v)
座標(只是規模...)
- ,最後呈現片段與選定的紋理元素,或者出去扔出去插值
vertex
的distance
範圍...
[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;
}
輸入質地:
輸出渲染:
[註釋]
垂直線是由於在源紋理上未使用GL_CLAMP_TO_EDGE
而導致的。它可以通過使用在展位側移動1個像素的紋理座標範圍來修復,或者使用GL_CLAMP_TO_EDGE
擴展名(如果存在)來修復。
怪異atan()
操作數是向左旋轉90度以匹配北方位角爲UP的結果。
謝謝!將嘗試這個並回來它是如何工作的,很快 – zproxy
工程! https://www.youtube.com/watch?v=jUqiRsRxWD8 – zproxy