與用固定著色器繪制三角形類似,這里重點講下不同的地方。
1.加載圖片
- (void)setupTexture {
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"triangle.png" ofType:nil];
// GLKTextureLoaderOriginBottomLeft 表示是否需要翻轉(zhuǎn)圖片以適配OpenGL坐標(biāo)系(UIKIt坐標(biāo)原點在左上方,OpenGL原點在左下方)
GLKTextureInfo *textureInfo = [GLKTextureLoader textureWithContentsOfFile:filePath options:@{GLKTextureLoaderOriginBottomLeft : @YES} error:nil];
_effect.texture2d0.name = textureInfo.name;
_effect.texture2d0.target = textureInfo.target;
}
2.設(shè)置頂點數(shù)據(jù)
- (void)setupVertexBuffer {
// 頂點數(shù)據(jù)(頂點坐標(biāo) + 紋理坐標(biāo))
SceneVertex vertices[] = {
// N 形
// { {-0.5, 0.5, 0}, {0, 1} },
// { {-0.5, -0.5, 0}, {0, 0} },
// { {0.5, 0.5, 0}, {1, 1} },
// { {0.5, -0.5, 0}, {1, 0} },
// Z 形
{ {-0.5, 0.5, 0}, {0, 1} },
{ {0.5, 0.5, 0}, {1, 1} },
{ {-0.5, -0.5, 0}, {0, 0} },
{ {0.5, -0.5, 0}, {1, 0} },
// 未重復(fù)利用
// { {-0.5, 0.5, 0}, {0, 1} },
// { {-0.5, -0.5, 0}, {0, 0} },
// { {0.5, 0.5, 0}, {1, 1} },
// { {-0.5, -0.5, 0}, {0, 0} },
// { {0.5, -0.5, 0}, {1.0, 0} },
// { {0.5, 0.5, 0}, {1, 1} },
};
// 操作頂點緩存區(qū) (GPU)
glGenBuffers(1, &_vertextBufferID);
// 1.綁定頂點到緩存區(qū),將attrBuffer綁定到GL_ARRAY_BUFFER標(biāo)識符上
glBindBuffer(GL_ARRAY_BUFFER, _vertextBufferID);
// 2.拷貝數(shù)據(jù)到頂點緩存區(qū)上 cpu內(nèi)存 -> gpu顯存
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// 在iOS中,系統(tǒng)處于性能考慮,默認(rèn)所有的頂點著色器的屬性(Attribute)通道都是關(guān)閉的,需要開啟后才能操作數(shù)據(jù)
// 1.打開頂點坐標(biāo)通道
glEnableVertexAttribArray(GLKVertexAttribPosition);
/**
glVertexAttribPointer (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
上傳頂點數(shù)據(jù)到顯存的方法
@param indx GLKVertexAttrib枚舉值
@param size 每次讀取的數(shù)量,比如position是由3個坐標(biāo)組成(x,y,z),顏色是由4個組成(r,g,b,a) 紋理則兩個(s,t)
@param type 數(shù)組中每個頂點的數(shù)據(jù)類型(GL_FLOAT、GL_SHORT、GL_BYTE、GL__UNSIGNED_BYTE等)
@param normalized 頂點數(shù)據(jù)是否需要被歸一化
@param stride 指定連續(xù)頂點屬性之間的偏移量(讀取步長)。如果為0,那么頂點屬性會被理解為:他們是緊密排在一起的。初始值為0
@param ptr 指定一個指針,指向數(shù)組中第一個頂點屬性的第一個組件。初始值為0
*/
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(SceneVertex) , NULL + offsetof(SceneVertex, positionCoords));
glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(SceneVertex), NULL + offsetof(SceneVertex, textureCoord));
}
3.繪制結(jié)果

加載圖片.png