OpenGL學習二十七 混合

2021-09-01 21:59:37 字數 4056 閱讀 1870

混合步驟:

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...