1. 程式人生 > >OpenGL chapter3 基礎渲染

OpenGL chapter3 基礎渲染

identity oop 我們 包含 back 裁剪框 目標 smooth triangle

3.1 基礎圖形管線
三種向OpenGl著色器傳遞渲染數據的方法:屬性,Uniform和紋理.
3.2 創建坐標系
3.2.1 正投影
GLFrustum::SetOrthographic(??);
3.2.2 透視投影
GLFrustum::SetPerspective(float fFov, float fAspect, float fNear, float fFar);
3.3 使用存儲著色器
GLShaderManager 在使用前必須進行初始化
shaderManager.InitializeStockShaders();
3.3.1 屬性
GLShaderManager預定義的標識符
GLT_ATTRIBUTE_VERTEX 3分量(x, y, z)頂點位置
GLT_ATTRIBUTE_COLOR
GLT_ATTRIBUTE_NORMAL
GLT_ATTRIBUTE_TEXTURE0
GLT_ATTRIBUTE_TEXTURE1
3.3.2 Uniform值
單位(Identity)著色器:
平面作色器:
上色(Shaded)著色器:
默認光源著色器:
點光源著色器:
紋理替換矩陣:
紋理調整著色器:
紋理光源著色器:
3.4 將點連接起來
3.4.1 點和線
GL_POINTS
GL_LINES
GL_LINE_STRIP
GL_LINE_LOOP
GL_TRIANGLES
GL_TRIANGLE_STRIP
GL_TRIANGLE_FAN

點:
void glPointSize(GLfloat size); //默認大小為一個像素

GLfloat size[2];
GLfloat step;

//獲支持的點大小範圍和步長
glGetFloatv(GL_POINT_SIZE_RANGE,size);
glGetGloatv(GL_POINT_SIZE_GRANULARITY,&step);

線:
void glLineWidth(GLfloat width); //默認寬度一個像素,改變線段寬度的唯一方式是使用該函數

3.4.2 繪制三角形
在默認情況下。OpenGL認為具有逆時針方向環繞的多邊形是正面的。
glFrontFace(GL_CW);
GL_CW : 告訴openGL順時針環繞多邊形被認為是正面的,GL_CCW 可以恢復為逆時針

3.4.4 一個簡單批次容器
GLTools庫中包含一個簡單的容器類,叫做GBatch.

//首先對批次進行初始化,告訴這個類代表那種圖元,定點數,以及一組或者兩組紋理坐標
void GLBatch::Begin(GLenum primitive, GLuint nVerts, GLuint nTextureUints = 0);
//然後 至少要輔助一個由3分量(x,y,z)定點組成的數組
void GLBatch::CopyVertexData3f(GLfloat *vVerts);
//我們還可以選擇復制表面法線,顏色和紋理坐標

void GLBatch::CopyNormalDataf(GLfloat *vNorms);
void GLBatch::CopyColorData4f(GLfloat *vColors);
void GLBatch::CopyTexCoordData2f(GLfloat *vTexCoords, GLuint uiTextureLayer);

void GLBatch::End(void);

//example
GLBatch triangleBatch;

//Load up a triangle
GLfloat vVerts[] = {-0.5f, 0.0f, 0.0f,
0.5f, 0.0f, 0.0f,
0.0f, 0.5f, 0.0f };
triangleBatch.Begin(GL_TRIANGLES,3);
triangleBatch.CopyVertexData3f(vVerts);
triangleBatch.End();

//Render
GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 1.0f };
shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);
triangleBatch.Draw();

正面和背面剔除
glEnable(GL_CULL_FACE);
glDisable(GL_CULL_FACE);
註意:我們並沒有指明剔除正面還是背面,這個是由glCullFace控制的。
void glCullFace(GLenum mode);
// mode : GL_FRONT GL_BACK 或者 GL_FRONT_AND_BACK

//example 消除不透明物體內部幾何圖形就需要兩行代碼
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE_);

深度測試:
是另外一種高效消除隱藏表面的技術,那麽我們在使用GLUT設置OpenGL窗口的時候,應該請求一個深度緩沖。例如,我們可以按照如下方式申請一個顏色緩沖區和一個深度緩沖。
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
//啟用深度測試
glEnable(GL_DEPTH_TEST);


多邊形模式:
void glPolygonMode(GLenum face, GLenum mode); //允許將多邊形渲染成實體,輪廓或只有點
face: GL_FRONT GL_BACK 或 GL_FRONT_AND_BACK
mode: GL_FILL (default),GL_LINE, GL_POINT

//example 將多邊形正面和背面繪制為線框模式
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

3.4.6 多邊形偏移
void glPolygonOffset(GLfloat factor, GLfloat units);
應用到片段上的總偏移可以通過下面的方程式表示:
Depth Offset = (DZ x factor) + ( r x units);

????????

3.4.7 裁剪
另外一種提高渲染性能的方式是只刷新屏幕上發生變化的部分。

//開啟裁剪測試
glEnable(GL_SCISSOR_TEST);
//close
glDisable(GL_SCISSOR_TEST);

void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
其中 x y 參數指定了裁剪框的左上角。

3.5 混合
glEnable(GL_BLEND);

3.5.1 組合顏色
目標顏色: 已經存儲在顏色緩沖區中的顏色值。
源顏色: 作為當前渲染命令的結果進入顏色緩沖區的顏色值
當混合功能被開啟時,源顏色和目標顏色的組合方式是由混合方程式控制的。在默認情況下,混合方程是如下所示。
Cf = (Cs * S ) + ( Cd * D)
S 源混合因子
D 目標混合因子

glBlendFunc(GLenum S, GLenum D);

3.5.2 改變混合方程式

3.5.3 抗鋸齒

//開啟抗鋸齒功能非常簡單。首先,我們必須啟動混合功能,並且像前一節實現透明一樣設置混合函數
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

//我們還需要確保吧混合方程式設置為GL_ADD,不過由於這是默認的設置。所以我們就不在這裏顯示這個步驟了。在啟用混合功能並且選擇正確的混合函數以及混合方程式之後,我們可以調用
glEnable函數對點,直線或多邊形(任何實心圖元)進行抗鋸齒處理。

glEnable(GL_POINT_SMOOTH);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_POLYGON_SMOOTH);

3.5.4 多重采樣

例如,為了請求一個多重采樣,完全顏色,帶深度的雙緩沖幀緩沖區,我們可以調用
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_MULTISAMPLE);
可以使用glEnable/glDisable組合打開或關閉多重采樣:
glEnable(GL_MULTISAMPLE);

glDisable(GL_MULTISAMPLE);

OpenGL chapter3 基礎渲染