GLKBaseEffect旨在簡化當今許多OpenGL應用程序常見的視覺效果哎媚。 對于iOS喇伯,GLKBaseEffect至少需要OpenGL ES 2.0,對于OS X拨与,GLKBaseEffect至少需要一個OpenGL Core Profile稻据。 在實例化和初始化GLKBaseEffect對象之前,必須創(chuàng)建一個合適的上下文并使其成為最新的上下文买喧。
GLKBaseEffect旨在與自定義的OpenGL代碼自由地互操作捻悯。 它還旨在最小程度上影響OpenGL狀態(tài)設置。 在初始化GLKBaseEffect對象及其屬性時淤毛,會保留OpenGL狀態(tài)設置今缚。
GLKBaseEffect是基于程序的,通過其底層GLSL程序的綁定低淡,當 - [GLKBaseEffect prepareToDraw]被調(diào)用時姓言,它會隱式地修改GL_CURRENT_PROGRAM狀態(tài)設置。 出于性能原因蔗蹋,GL_CURRENT_PROGRAM不會被GLKBaseEffect保存和恢復何荚,
出于性能原因,GL_CURRENT_PROGRAM不會被GLKBaseEffect保存和恢復猪杭,因此該類的客戶端必須在調(diào)用[GLKBaseEffect prepareToDraw]之前或之后設置/保存/恢復GL_CURRENT_PROGRAM餐塘,因為它們適用于其應用程序。
如果已經(jīng)指定了紋理屬性并被啟用胁孙,GLKBaseEffect也將修改OpenGL狀態(tài)元素GL_TEXTURE_BINDING_2D唠倦。 此狀態(tài)也必須以上述GL_CURRENT_PROGRAM描述的方式進行處理称鳞。
GLKBaseEffect使用命名頂點屬性,因此當配置/啟用/綁定要與GLKBaseEffect一起使用的頂點屬性數(shù)據(jù)時稠鼻,客戶端應用程序可以引用以下頂點屬性名稱:
GLKVertexAttribPosition 0
GLKVertexAttribNormal 1
GLKVertexAttribColor 2
GLKVertexAttribTexCoord0 3
GLKVertexAttribTexCoord1 4
請注意冈止,GLKVertexAttribNormal的法線總是標準化。
使用GLKBaseEffect的4個規(guī)范步驟是:
(1) 分配并初始化GLKBaseEffect的一個實例
directionalLightEffect = [[GLKBaseEffect alloc] init];
(2) 在效果上設置所需的屬性
// 配置燈效果
directionalLightEffect.light0.position = lightPosition;
directionalLightEffect.light0.diffuseColor = diffuseColor;
directionalLightEffect.light0.ambientColor = ambientColor;
// 配置材料
directionalLightEffect.material.diffuseColor = materialDiffuseColor;
directionalLightEffect.material.ambientColor = materialAmbientColor;
directionalLightEffect.material.specularColor = materialSpecularColor;
directionalLightEffect.material.shininess = 10.0;
(3) 使用要繪制的模型或場景的頂點數(shù)組對象初始化頂點屬性/頂點數(shù)組狀態(tài).
glGenVertexArraysOES(1, &vaoName);
glBindVertexArrayOES(vaoName);
// 為每個頂點屬性創(chuàng)建和初始化VBO
// 下面的例子顯示了一個建立position vertex屬性的例子候齿。
// 對每個附加的所需屬性重復以下步驟:normal熙暴,color,texCoord0慌盯,texCoord1周霉。
glGenBuffers(1, &positionVBO);
glBindBuffer(GL_ARRAY_BUFFER, positionVBO);
glBufferData(GL_ARRAY_BUFFER, vboSize, dataBufPtr, GL_STATIC_DRAW);
glVertexAttribPointer(GLKVertexAttribPosition, size, type, normalize, stride, NULL);
glEnableVertexAttribArray(GLKVertexAttribPosition);
... 對其他所需的頂點屬性重復上述步驟
glBindVertexArrayOES(0); // unbind the VAO we created above
(4) 對于繪制的每個框架:更新每幀更改的屬性。 通過調(diào)用 - [GLKBaseEffect prepareToDraw]同步更改的效果狀態(tài)亚皂。 用效果繪制模型
directionalLightEffect.transform.modelviewMatrix = modelviewMatrix;
[directionalLightEffect prepareToDraw];
glBindVertexArrayOES(vaoName);
glDrawArrays(GL_TRIANGLE_STRIP, 0, vertCt);