OpenGL學習三十三 球面對映

2021-06-20 07:10:46 字數 4152 閱讀 6890

(此節內容對應nehe教程第23課)

把環境紋理包裹在你的3d模型上,讓它看起來象反**周圍的場景一樣。

球體環境對映是乙個建立快速金屬反射效果的方法

首先,你需要一幅球體環境對映圖,用來把它對映到球體上。在photoshop中開啟一幅圖並選擇所有的畫素,建立它的乙個複製。

接著,我們把影象變為2的冪次方大小,一般為128x128或256x256。

最後使用扭曲(distort)濾鏡,並應用球體效果。然後把它儲存為reflect.bmp檔案。

如右圖上面的為背景的,下面為經過球面濾鏡處理過的,用於進行球面貼圖的紋理

對於球面對映往往我們希望背景是不變的,前面球面是可以轉動的,因此適當的push 與pop 檢視模型 可以帶到效果

原始                                                處理後                                       合成後效果

#include "header.h"

int part1;

int part2;

int p1=0;

int p2=1;

glfloat xrot;

glfloat yrot;

glfloat xspeed;

glfloat yspeed;

glfloat z=-10.0f;

gluquadricobj *quadratic;

glfloat lightambient= ;

glfloat lightdiffuse= ;

glfloat lightposition= ;

gluint filter;

gluint texture[6];

gluint object=1;

aux_rgbimagerec *loadbmp(char *filename)

file=fopen(filename,"r");

if (file)

return null;

}int loop=0;

int loadgltextures()

for (loop=0; loop<2; loop++)

free(textureimage[loop]);

}} }

return status;

}glvoid resizeglscene(glsizei width, glsizei height)

glviewport(0,0,width,height);

glmatrixmode(gl_projection);

glloadidentity();

// calculate the aspect ratio of the window

gluperspective(45.0f,(glfloat)width/(glfloat)height,0.1f,100.0f);

glmatrixmode(gl_modelview);

glloadidentity();

}int initgl(void)

glenable(gl_texture_2d);

glshademodel(gl_smooth);

glclearcolor(0.0f, 0.0f, 0.0f, 0.5f);

glcleardepth(1.0f);

glenable(gl_depth_test);

gldepthfunc(gl_lequal);

glhint(gl_perspective_correction_hint, gl_nicest);

gllightfv(gl_light1, gl_ambient, lightambient);

gllightfv(gl_light1, gl_diffuse, lightdiffuse);

gllightfv(gl_light1, gl_position,lightposition);

glenable(gl_light1);

quadratic=glunewquadric();

gluquadricnormals(quadratic, glu_smooth);

gluquadrictexture(quadratic, gl_true);

gltexgeni(gl_s, gl_texture_gen_mode, gl_sphere_map);

gltexgeni(gl_t, gl_texture_gen_mode, gl_sphere_map);

return true;

}void gldrawcube()

void drawglscene(void)

; glpopmatrix();

gldisable(gl_texture_gen_s);

gldisable(gl_texture_gen_t);

glbindtexture(gl_texture_2d, texture[filter*2]);

glpushmatrix();

gltranslatef(0.0f, 0.0f, -24.0f);

glbegin(gl_quads);

glnormal3f( 0.0f, 0.0f, 1.0f);

gltexcoord2f(0.0f, 0.0f); glvertex3f(-13.3f, -10.0f, 10.0f);

gltexcoord2f(1.0f, 0.0f); glvertex3f( 13.3f, -10.0f, 10.0f);

gltexcoord2f(1.0f, 1.0f); glvertex3f( 13.3f, 10.0f, 10.0f);

gltexcoord2f(0.0f, 1.0f); glvertex3f(-13.3f, 10.0f, 10.0f);

glend();

glpopmatrix();

xrot+=xspeed;

yrot+=yspeed;

glflush();

}void rotate()

void keyboard(unsigned char key,int x,int y)

glutpostredisplay();

break;

case 'w':

yspeed+=0.01f;

glutidlefunc(rotate);

break;

case 's':

yspeed-=0.01f;

glutidlefunc(rotate);

break;

case 'a':

xspeed+=0.01f;

glutidlefunc(rotate);

break;

case 'd':

xspeed-=0.01f;

glutidlefunc(rotate);

break;

case 'z':

z-=0.01f;

glutidlefunc(rotate);

break;

case 'x':

z+=0.01f;

glutidlefunc(rotate);

break;

case 'r':

glutidlefunc(null);

break; }}

int main(int argc,char **argv)

CUDA學習(三十三)

最大化指令吞吐量 為了最大化指令吞吐量,應用程式應 在本節中,吞吐量以每個多處理器每個時鐘週期的操作次數給出。對於32的變形大小,一條指令對應於32個操作,所以如果n是每個時鐘週期的運算元,則指令吞吐量是每個時鐘週期n 32條指令。所有的吞吐量都是針對乙個多處理器的。它們必須乘以裝置中的多處理器數量...

學習總結 三十三

1 什麼是守護程序 程序是乙個正在執行的程式,守護程序也是乙個程序,守護程序的意思就是乙個程序保護另乙個程序 2 守護程序使用場景 1 什麼是互斥鎖 互斥鎖就是互相排斥的鎖,乙個資源被鎖了,其他子程序就無法使用 2 為什麼需要互斥鎖 因為併發帶來的資源競爭問題,當多個程序同時要操作乙個資源將會導致資...

Python學習之旅(三十三)

網路通訊是兩台計算機上的兩個程序之間的通訊,而網路程式設計就是如何在程式中實現兩台計算機的通訊 p協議負責把資料從一台計算機通過網路傳送到另一台計算機 tcp協議則是建立在ip協議之上的。tcp協議負責在兩台計算機之間建立可靠連線,保證資料報按順序到達 許多常用的更高階的協議都是建立在tcp協議基礎...