抗鋸齒
混合的2 功能:顏 組合、抗鋸
混合處理-抗鋸齒
//開啟混合處 glEnable(GL_BLEND);
//指定混合因 GLBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
//指定混合 程式glBlendEquation(GL_FUNC_ADD);
glEnable(GL_POINT_SMOOTH); //對點進 抗鋸 處 glEnable(GL_LINE_SMOOTH);//對線進 抗鋸 處 glEnable(GL_POLYGON_SMOOTH);//對多邊形進 抗鋸 處
多重采樣
//1.可以調? glutInitDisplayMode 添加采樣緩存區glutInitDisplayMode(GLUT_MULTISAMPLE);
//2.可以使 glEnable| glDisable組合使 GLUT_MULTISAMPLE 打開|關閉 多重采樣。
glEnable(GLUT_MULTISAMPLE);
glDisable(GLUT_MULTISAMPLE);
多重采樣、抗鋸 混合綜合使
? ? ? ? ? glDisable(GLUT_MULTISAMPLE);
? ? ? ? ? glEnable(GL_POINT_SMOOTH);
? ? ? ? ? //Draw some smooth point
? ? ? ? ? glDisable(GL_POINT_SMOOTH);
? ? ? ? ? glDisable(GL_LINE_SMOOTH);
? ? ? ? ? glEnable(GLUT_MULTISAMPLE);
? ? ? ? //Draw some smooth polygon
多重采樣 展
多重采樣緩存區在默認情況下使? 段RGB值,并 包含顏
的alpha成分,我們可以通過調 glEnable來修改這個
為:
* GL_SAMPLE_ALPHA_TO_COVERAGE 使 alpha值
* GL_SAMPLE_ALPHA_TO_ON 使 alpha值并設為1,并
使 它。
使用矩陣堆棧
//類型
GLMatrixStack::GLMatrixStack(int iStackDepth = 64);
//在堆棧頂部載? 個單元矩陣
void GLMatrixStack::LoadIdentity(void);
//在堆棧頂部載 任何矩陣//參數:4*4矩陣
? ? void GLMatrixStack::LoadMatrix(const M3DMatrix44f m);
//矩陣乘以矩陣堆棧頂部矩陣,相乘結果存儲到堆棧的頂部
void GLMatrixStack::MultMatrix(const M3DMatrix44f);
//獲取矩陣堆棧頂部的值 GetMatrix 函數//為 適應GLShaderMananger的使 ,或者獲取頂部矩陣的副本
? ? const M3DMatrix44f & GLMatrixStack::GetMatrix(void);
? ? void GLMatrixStack::GetMatrix(M3DMatrix44f mMatrix);
* GL_SAMPLE_COVERAGE 使 glSampleCoverage所設置的值。
當啟? GL_SAMPLE_COVERAGE 時,可以使 glSampleCoverage函數允許指定 個特定的值,它是與
段覆蓋值進 按位與操作的結果。
壓棧、出棧
//將當前矩陣壓 堆棧
void GLMatrixStack::PushMatrix(void);
//將M3DMatrix44f 矩陣對象壓 當前矩陣堆棧
void PushMatrix(const M3DMatrix44f mMatrix);
//將GLFame 對象壓 矩陣對象
void PushMatrix(GLFame &frame);
//出棧(出棧指的是移除頂部的矩陣對象)void GLMatrixStack::PopMatrix(void);
仿射變換 GLMastrixStack 內建了旋轉\平移\縮放
//Rotate 函數angle參數是傳遞的度數,? 是弧度
void MatrixStack::Rotate(GLfloat angle,GLfloat x,GLfloat
y,GLfloat z);
void MatrixStack::Translate(GLfloat x,GLfloat y,GLfloat z);
void MatrixStack::Scale(GLfloat x,GLfloat y,GLfloat z);
使用照相機 和 角色幀 進行移動
class GLFrame
? ? {
protected:
M3DVector3f vOrigin; // Where am I?M3DVector3f vForward; // Where am I going?M3DVector3f vUp; // Which way is up?
}
GLFrame
//將堆棧的頂部壓 任何矩陣
void GLMatrixStack::LoadMatrix(GLFrame &frame);
//矩陣乘以矩陣堆棧頂部的矩陣。相乘結果存儲在堆棧的頂部void GLMatrixStack::MultMatrix(GLFrame &frame);
//將當前的矩陣壓棧
void GLMatrixStack::PushMatrix(GLFrame &frame);
一、在渲染過程可能產生的問題
解決方法
1、油畫法
2、正面、背面剔除
3、深度測試
正面、背面剔除
可以如下調用開啟或關閉表面剔除。
glEnable(GL_CULL_FACE);
glDisable(GL_CULL_FACE);
正面、背面剔除
該函數的原型如下:
void glFrontFace(GLenum mode);
mode 參數的可選的值有 GL_CW 和 GL_CCW(默認
值是 GL_CCW)。
GL_CW 表示頂點的排列順序是順時針的面是正面。GL_CCW 表示頂點的排列順序是逆時針的面是正面(默
認值)。
void glCullFace()
GL_FRONT //正面剔除
GL_BACK //背面剔除
GL_FRONT_AND_BACK
//正面和反面都要剔除
深度測試
該函數的原型如下:
void glutInitDisplayMode(GLUT_DEPTH);開啟深度測試
glEnable(GL_DEPTH_TEST);
多邊形模型
使用glPolygonMode(Glenum face,Glenum mode) 函數來指定填充方式
Face參數:GL_FRONT、GL_BACK、GL_FRONT_AND_BACK
Mode參數:GL_FILL(默認實心填充) 、GL_LINE、GL_POINT
多邊形偏移
深度測試實現深度的過程中,可能產生的2種問題:
1、z-fighting(z沖突)
2、圖形重疊(無法體現深度)
解決方法
1、調整Z值
2、使用glPolygonOffset函數,調節片段深度值。
glPolygonOffset 函數
void glPolygonOffset(Glfloat factor,Glfloat units);
應用到片段上總偏移計算方程式:
Depth Offset = (DZ * factor) + (r * units);
DZ:深度值(Z值)
r:使得深度緩沖區產生變化的最小值
負值,將使得z值距離我們更近,而正值,將使得z值距離我們更遠,
對于上節課的案例,我們設置factor和units設置為-1,0
裁剪
在OpenGL 提高渲染的一種方式,只刷新屏幕上發生變化的部分。OpenGL 允許我們將
要進行渲染的窗口只去指定一個裁剪框。
//1 開啟裁剪測試
glEnable(GL_SCISSOR_TEST);
//2.關閉裁剪測試
glDisable(GL_SCISSOR_TEST);
//3.指定裁剪窗口
void glScissor(Glint x,Glint y,GLSize width,GLSize height);
x,y:指定裁剪框左下角位置;
width,height:指定裁剪尺寸
混合
我們把OpenGL 渲染時會把顏色值存在顏色緩存區中,每個片段的深度值也是放在深
度緩沖區。當深度緩沖區被關閉時,新的顏色將簡單的覆蓋原來顏色緩存區存在的顏
色值,當深度緩沖區再次打開時,新的顏色片段只是當它們比原來的值更接近鄰近的
裁剪平面才會替換原來的顏色片段。
glEnable(GL_BlEND);
組合顏色目標顏色:已經存儲在顏色緩存區的顏色值
? 源顏色:作為當前渲染命令結果進入顏色緩存區的顏色值
? 當混合功能被啟動時,源顏色和目標顏色的組合方式是混合方程式控制的。在默認情
? 況下,混合方程式如下所示:
Cf = (Cs * S) + (Cd * D)
Cf :最終計算參數的顏色Cs : 源顏色
Cd :目標顏色S:源混合因子D:目標混合因子
設置混合因子
設置混合因子,需要用到glBlendFun函數
glBlendFunc(GLenum S,GLenum D);
S:源混合因子
D:目標混合因子
混合因子枚舉列表
表中R、G、B、A 分別代表
紅、綠、藍、alpha。
表中下標S、D,分別代表源、
目標
表中C 代表常量顏色(默認黑
色)
glBlendFuncSeparate 函數
除了能使用glBlendFunc 來設置混合因子,還可以有更靈活的選擇。
void glBlendFuncSeparate(GLenum strRGB,GLenum dstRGB,GLenum strAlpha,GLenum
dstAlpha);
strRGB: 源顏色的混合因子
dstRGB: 目標顏色的混合因子
strAlpha: 源顏色的Alpha因子
dstAlpah: 目標顏色的Alpha因子
glBlendFuncSeparate 注意
glBlendFunc 指定 源和目標 RGBA值的混合函數;但是glBlendFuncSeparate函
數則允許為RGB 和 Alpha 成分單獨指定混合函數。
在混合因子表中,
GL_CONSTANT_COLOR,GL_ONE_MINUS_CONSTANT_COLOR,GL_CONSTANT_
ALPHA,GL_ONE_MINUS_CONSTANT值允許混合方程式中引入一個常量混合顏
色。
常量混合顏色
常量混合顏色,默認初始化為黑色(0.0f,0.0f,0.0f,0.0f),但是還是可以修改這個常量
混合顏色。
void glBlendColor(GLclampf red ,GLclampf green ,GLclampf blue ,GLclampf alpha );