混合步驟:
1.設定混合模式
2.啟用混合
glcolor4f(1.0f,1.0f,1.0f,0.5f); // 全亮度, 50% alpha 混合
glblendfunc(gl_src_alpha,gl_one); // 基於源象素alpha通道值的半透明混合函式
glenable(gl_blend); // 開啟混合
opengl 會把源顏色和目標顏色各自取出(源顏色認為是片段。目標演示是幀緩衝區內容),並乘以乙個係數(源顏色乘以的係數稱為「源因子」,目標顏色乘以的係數稱為「目標因子」),然後相加,這樣就得到了新的顏色。(也可以不是相加,新版本的opengl可以設定運算方式,包括加、減、取兩者中較大的、取兩者中較小的、邏輯運算等,但我們這裡為了簡單起見,不討 論這個了) 下面用數學公式來表達一下這個運算方式。假設源顏色的四個分量(指紅色,綠色,藍色,alpha值)是(rs, gs, bs, as),目標顏色的四個分量是(rd, gd, bd, ad),又設源因子為(sr, sg, sb, sa),目標因子為(dr, dg, db, da)。則混合產生的新顏色可以表示為: (rs*sr+rd*dr, gs*sg+gd*dg, bs*sb+bd*db, as*sa+ad*da) 當然了,如果顏色的某一分量超過了1.0,則它會被自動擷取為1.0,不需要考慮越界的問題。
源因子和目標因子是可以通過glblendfunc函式來進行設定的。glblendfunc有兩個引數,前者表示源因子,後者表示目標因子。這兩個引數可以是多種值,下面介紹比較常用的幾種。
gl_zero: 表示使用0.0作為因子,實際上相當於不使用這種顏色參與混合運算。
gl_one: 表示使用1.0作為因子,實際上相當於完全的使用了這種顏色參與混合運算。
gl_src_alpha:表示使用源顏色的alpha值來作為因子。
gl_dst_alpha:表示使用目標顏色的alpha值來作為因子。
gl_one_minus_src_alpha:表示用1.0減去源顏色的alpha值來作為因子。
gl_one_minus_dst_alpha:表示用1.0減去源顏色的alpha值來作為因子。
gl_src_color
gl_one_minus_src_color
gl_dst_color
gl_one_minus_dst_color
混合方程式組合畫素
void glblendequation(glenum mode)
假設緩衝區顏色為(1,0,0) 片段顏色是(1,1,0)
gl_func_add=(1,1,0)+(1,0,0)=(1,1,0)
gl_func_subtract=(1,1,0)-(1,0,0)=(0,1,0)
gl_func_reverse_subtract=(1,0,0)-(1,1,0)=(0,0,0)
gl_min=min((1,0,0),(1,1,0))=(1,0,0)
gl_max=max((1,0,0),(1,1,0))=(1,1,0)
gl_logic_op
#include "header.h"glfloat xrot;
glfloat yrot;
glfloat xspeed;
glfloat yspeed;
glfloat z=-5.0f;
glfloat lightambient= ;
glfloat lightdiffuse= ;
glfloat lightposition= ;
gluint filter;
gluint texture[3];
aux_rgbimagerec *loadbmp(char *filename)
file=fopen(filename,"r");
if (file)
return null;
}int loadgltextures()
if (textureimage[0])
free(textureimage[0]);
} 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(glvoid)
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);
glcolor4f(1.0f, 1.0f, 1.0f, 0.5);
glblendfunc(gl_src_alpha,gl_one);
return true;
}void drawglscene(void)
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)
隨筆(二十七)
1.安卓開發外掛程式推薦 2.必知必會 android 測試相關的方方面面都在這兒 3android ui效能優化 檢測應用中的ui卡頓 4.recyclerview的拖動和滑動 第一部分 基本的itemtouchhelper示例 支援側滑和排序 5 android觸控事件分發機制詳解 6.andr...
題解二十七
給你兩個有序整數陣列 nums1 和 nums2,請你將 nums2 合併到 nums1 中,使 nums1 成為乙個有序陣列。說明 初始化 nums1 和 nums2 的元素數量分別為 m 和 n 你可以假設 nums1 有足夠的空間 空間大小大於或等於 m n 來儲存 nums2 中的元素。示例...
二十七 快速排序
快速排序其實是逐次對每個基數進行排序,當達到乙個臨界值 也就是當元素個數達到一定數量時,簡單的插入排序速度會大於快排 的時候就用插入排序來進行,其實這也是乙個分治處理的過程,和歸併思想大同小異,由於歸併要進行多次遞迴,而快排基於基數每次進行線性時間的分組,所以理想情況下快排優於歸併。這裡就直接上 i...