獲取示例代碼
經(jīng)過前面7篇文章的鋪墊啦逆,繪制正方體已經(jīng)不是什么難事了百姓。正方體其實(shí)就是由6個(gè)矩形組成的幾何體臀玄,X瓢阴,Y,Z軸上各兩個(gè)矩形健无。下面是Z軸上兩個(gè)矩形的示意圖荣恐。
繪制Z軸兩個(gè)矩形的代碼如下。
- (void)drawZPlanes {
static GLfloat triangleData[] = {
-0.5, 0.5f, 0.5, 0, 0, 1,
-0.5f, -0.5f, 0.5, 0, 0, 1,
0.5f, -0.5f, 0.5, 0, 0, 1,
0.5, -0.5f, 0.5, 0, 0, 1,
0.5f, 0.5f, 0.5, 0, 0, 1,
-0.5f, 0.5f, 0.5, 0, 0, 1,
-0.5, 0.5f, -0.5, 0, 0, 1,
-0.5f, -0.5f, -0.5, 0, 0, 1,
0.5f, -0.5f, -0.5, 0, 0, 1,
0.5, -0.5f, -0.5, 0, 0, 1,
0.5f, 0.5f, -0.5, 0, 0, 1,
-0.5f, 0.5f, -0.5, 0, 0, 1,
};
[self bindAttribs:triangleData];
glDrawArrays(GL_TRIANGLES, 0, 12);
}
其他軸的平面繪制規(guī)則一樣累贤,將Z軸數(shù)據(jù)第三列移到第一列和第二列即可生成X叠穆,Y軸上的矩形數(shù)據(jù)。
- (void)drawXPlanes {
static GLfloat triangleData[] = {
// X軸0.5處的平面
0.5, -0.5, 0.5f, 1, 0, 0,
0.5, -0.5f, -0.5f, 1, 0, 0,
0.5, 0.5f, -0.5f, 1, 0, 0,
0.5, 0.5, -0.5f, 1, 0, 0,
0.5, 0.5f, 0.5f, 1, 0, 0,
0.5, -0.5f, 0.5f, 1, 0, 0,
// X軸-0.5處的平面
-0.5, -0.5, 0.5f, 1, 0, 0,
-0.5, -0.5f, -0.5f, 1, 0, 0,
-0.5, 0.5f, -0.5f, 1, 0, 0,
-0.5, 0.5, -0.5f, 1, 0, 0,
-0.5, 0.5f, 0.5f, 1, 0, 0,
-0.5, -0.5f, 0.5f, 1, 0, 0,
};
[self bindAttribs:triangleData];
glDrawArrays(GL_TRIANGLES, 0, 12);
}
- (void)drawYPlanes {
static GLfloat triangleData[] = {
-0.5, 0.5, 0.5f, 0, 1, 0,
-0.5f, 0.5, -0.5f, 0, 1, 0,
0.5f, 0.5, -0.5f, 0, 1, 0,
0.5, 0.5, -0.5f, 0, 1, 0,
0.5f, 0.5, 0.5f, 0, 1, 0,
-0.5f, 0.5, 0.5f, 0, 1, 0,
-0.5, -0.5, 0.5f, 0, 1, 0,
-0.5f, -0.5, -0.5f, 0, 1, 0,
0.5f, -0.5, -0.5f, 0, 1, 0,
0.5, -0.5, -0.5f, 0, 1, 0,
0.5f, -0.5, 0.5f, 0, 1, 0,
-0.5f, -0.5, 0.5f, 0, 1, 0,
};
[self bindAttribs:triangleData];
glDrawArrays(GL_TRIANGLES, 0, 12);
}
我將每個(gè)軸上的平面賦予不同的顏色便于區(qū)分臼膏。
我移除了modelMatrix2硼被,將modelMatrix1改為modelMatrix。每一次update的時(shí)候我將modelMatrix的賦值修改為圍繞1渗磅,1嚷硫,1軸旋轉(zhuǎn)检访。
- (void)update {
[super update];
float varyingFactor = (sin(self.elapsedTime) + 1) / 2.0; // 0 ~ 1
self.cameraMatrix = GLKMatrix4MakeLookAt(0, 0, 2 * (varyingFactor + 1), 0, 0, 0, 0, 1, 0);
GLKMatrix4 rotateMatrix = GLKMatrix4MakeRotation(varyingFactor * M_PI * 2, 1, 1, 1);
self.modelMatrix = rotateMatrix;
}
增加一個(gè)drawCube
方法,繪制各個(gè)矩形仔掸。
- (void)drawCube {
[self drawXPlanes];
[self drawYPlanes];
[self drawZPlanes];
}
最后調(diào)用drawCube
繪制正方體脆贵。
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
[super glkView:view drawInRect:rect];
GLuint projectionMatrixUniformLocation = glGetUniformLocation(self.shaderProgram, "projectionMatrix");
glUniformMatrix4fv(projectionMatrixUniformLocation, 1, 0, self.projectionMatrix.m);
GLuint cameraMatrixUniformLocation = glGetUniformLocation(self.shaderProgram, "cameraMatrix");
glUniformMatrix4fv(cameraMatrixUniformLocation, 1, 0, self.cameraMatrix.m);
GLuint modelMatrixUniformLocation = glGetUniformLocation(self.shaderProgram, "modelMatrix");
glUniformMatrix4fv(modelMatrixUniformLocation, 1, 0, self.modelMatrix.m);
[self drawCube];
}
效果如下。
效果很奇怪是不是起暮?因?yàn)槲覀內(nèi)鄙僖粋€(gè)很重要的配置glEnable(GL_DEPTH_TEST);
卖氨。他有什么用呢?默認(rèn)情況下负懦,誰后繪制誰在最上面双泪,而glEnable(GL_DEPTH_TEST);
之后;繪制順序則按照Z軸的坐標(biāo)為準(zhǔn)密似。為了配合glEnable(GL_DEPTH_TEST);
焙矛,還要將glClear(GL_COLOR_BUFFER_BIT)
改成glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
,因?yàn)榘凑語軸排序是要激活一個(gè)新的深度緩存區(qū)的残腌,所以每次清除緩存區(qū)的時(shí)候不僅要清除顏色緩存數(shù)據(jù)還要清除深度緩存數(shù)據(jù)村斟,否則會(huì)影響新的深度數(shù)據(jù)的寫入。修改了兩處之后抛猫,效果如下蟆盹。
這次就正常了。本文主要介紹了繪制正方體的思路和方法闺金,讀者可以拓展一下逾滥,比如繪制由4個(gè)三角形構(gòu)成的三角錐。立體幾何體基本都可以分解成很多三角形败匹,只要找到規(guī)律寨昙,繪制起來就很簡單。
下一篇開始講解基本的光照模型掀亩,讓立方體看起來更真實(shí)舔哪。