首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我需要OpenGL ES 1.1来渲染带有纹理的对象和其他只使用顶点颜料和颜色的简单对象

我需要OpenGL ES 1.1来渲染带有纹理的对象和其他只使用顶点颜料和颜色的简单对象
EN

Stack Overflow用户
提问于 2011-10-14 06:32:30
回答 1查看 341关注 0票数 2

我在XCode上运行,使用的是OpenGL ES 1.1,我有两个类,一个是带纹理的,另一个是带有颜色数据的三角形,它们渲染得很好,直到我渲染了带纹理的三角形才能正常工作,然后其他的也会用我的精灵地图集的奇怪部分生成纹理,它们根本没有任何纹理坐标

代码语言:javascript
复制
-(void) renderWithUpdate {

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

//Translate
glTranslatef(tranlation.x, tranlation.y, tranlation.z);

//Scale
glScalef(scale.x, scale.y, scale.z);

//Rotate
glRotatef( angleGeo, 1.0, 1.0, 0.0);


angleGeo = angleGeo + 0.5;
//NSLog(@"Rotation Angle:%F", (float)angleGeo );

glVertexPointer(vertexSize, GL_FLOAT, 0, self.vertexes );
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(4, GL_FLOAT, 0, self.colors);
glEnableClientState(GL_COLOR_ARRAY);                


//Render with Texturing 
if (materialKey != nil) {

    [[MaterialController  sharedMaterialController] bindMaterial:materialKey];

    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    glTexCoordPointer(2, GL_FLOAT, 0, uvCoordinates);

}


//Render
glDrawArrays( renderStyle, 0, self.vertexCount);
}

如果我在它们的渲染方法中禁用纹理线缆数组,它们将完全消失,而我的纹理对象可以正常工作

是不是跟glEnable(GL_TEXTURE_2D)有关

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-14 07:17:33

渲染纹理对象后,你必须通过调用glDisable(GL_TEXTURE_2D)来禁用纹理(我猜你的MaterialControllerbindMaterial方法调用glEnable(GL_TEXTURE_2D))。仅仅禁用纹理坐标数组(使用glDisableClientState(GL_TEXTURE_COORD_ARRAY))是不够的(尽管你也应该在渲染纹理几何体之后这样做):

代码语言:javascript
复制
...
glDrawArrays( renderStyle, 0, self.vertexCount);

if(materialKey != nil)
{
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisable(GL_TEXTURE_2D);
}

请始终记住,OpenGL是一个状态机,您更改的每个状态(如启用纹理)都会保持其值,直到再次更改它。因此,您应该始终了解应用程序的哪些部分会更改OpenGL状态(如bindMaterial方法),并在呈现之前立即设置所需的每种状态。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7761207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档