opengl實現具有凹凸感的渲染效果圖
一、設定光照
1、設定光照成分
環境光:環境光來自於四面八方。所有場景中的物件都處於環境光的照射中。
漫射光:由特定的光源產生,並在您的場景中的物件表面上產生反射。處於漫射光直接照射下的任何物件表面都變得很亮,而幾乎未被照射到的區域就顯得要暗一些。這樣在我們所建立的木板箱的稜邊上就會產生的很不錯的陰影效果。
鏡面光:
2、指定光照位置
3、繫結光源
4、啟動光源
bool ctestviewview::initializeopengl(cdc* pdc)
; glfloat light_position0=;
gllightfv(gl_light0,gl_position,light_position0);
gllightfv(gl_light0,gl_diffuse,light_diffuse);
//設定1號光源
glfloat light_position1=;
gllightfv(gl_light1,gl_position,light_position1);
gllightfv(gl_light1,gl_diffuse,light_diffuse);
//定義材質
float mat_diffuse=;
glmaterialfv(gl_front_and_back,gl_diffuse,mat_diffuse);
//啟動光源
glenable(gl_light0);
glenable(gl_light1);
gllightmodeli(gl_light_model_two_side,gl_true);//啟動雙面光照(important!)
glenable(gl_lighting);
//glcleardepth(1.0f);
//glenable(gl_depth_test);
//glmatrixmode(gl_modelview);
//glloadidentity();
//glenable(gl_lighting);
return true;
二、材質設定
三、面元法線設定
只有設定好了三角面元的法線,才有凹凸紋理的感覺
//畫渲染圖
void ctestviewview::showlight(void)
; glmaterialfv(gl_front_and_back,gl_diffuse,mat_diffuse);
glclearcolor(0.0,0.0,0.0,0.0);
glshademodel(gl_smooth);
glpolygonmode(gl_front,gl_fill);
glcolor3f(1.0f,1.0f,1.0f);
for (int i=0;iclass3d ab;
ab.x= vector3d[vectortri[i].index2].x-vector3d[vectortri[i].index1].x;
ab.y= vector3d[vectortri[i].index2].y-vector3d[vectortri[i].index1].y;
ab.z= vector3d[vectortri[i].index2].z-vector3d[vectortri[i].index1].z;
class3d bc;
bc.x = vector3d[vectortri[i].index3].x-vector3d[vectortri[i].index1].x;
bc.y = vector3d[vectortri[i].index3].y-vector3d[vectortri[i].index1].y;
bc.z = vector3d[vectortri[i].index3].z-vector3d[vectortri[i].index1].z;
//然後計算法線,即另乙個向量。求該物件的法向量(norm)。下面的**用於計算向量ab和bc的外積:
class3d norm;
norm.x = (ab.y * bc.z) - (ab.z * bc.y);
norm.y = (ab.z * bc.x) - (ab.x * bc.z);
norm.z = (ab.x * bc.y) - (ab.y * bc.x);
//歸一化
double dnormallength=sqrt(norm.x*norm.x+norm.y*norm.y+norm.z*norm.z);
if(dnormallength!=0.0)
else
glbegin(gl_polygon);
glnormal3d(norm.x,norm.y,norm.z);
glvertex3f(vector3d[vectortri[i].index1].x,vector3d[vectortri[i].index1].y,vector3d[vectortri[i].index1].z);
glvertex3f(vector3d[vectortri[i].index2].x,vector3d[vectortri[i].index2].y,vector3d[vectortri[i].index2].z);
glvertex3f(vector3d[vectortri[i].index3].x,vector3d[vectortri[i].index3].y,vector3d[vectortri[i].index3].z);
glend();
} glpopmatrix();
}
OpenGL光照陰影演算法的實現
陰影 影 又稱影子 背影 光線被不透明物體阻檔而產生的黑暗範圍,與光源的方向相反。影的橫切面是二維 輪廓 阻檔光線物體的倒轉投影。影的大小 形狀隨光線的入射角而改變。維基百科 在場景中新增陰影可以使得場景更加逼真。下面兩幅圖是有無陰影效果的對比 如何製造陰影?簡單地做法,我們可以通過把源物體壓平在物...
opengl實現X射線渲染
x射線也就是輪郭線 實現原理 物體表面的法線與入射光線的夾角為90度時,剛好能看到物體的輪郭線 實現效果,不同的計算方式會得到不同的效果 頂點shader attribute vec3 pos attribute vec2 texcoord attribute vec3 normal uniform...
opengl光照之漫反射逐頂點渲染與逐畫素渲染
1,逐頂點渲染 模型中有多少個頂點就計算多少次,這種方式比較節約系統資源,但效果比較粗糙 2,逐畫素渲染 這種方式計算量特別大,有多少個畫素就計算多少次,但是效果會很好 逐頂點渲染漫反射光照效果 頂點shader attribute vec3 pos 頂點座標 attribute vec2 texc...