2

我在 XCode 上运行并使用 OpenGL ES 1.1,我有两个类,一个是带纹理的,另一个是带有颜色数据的三角形,它们渲染得很好,直到我渲染我的带纹理的三角形,但其他的也变得纹理化我的精灵图集的奇怪部分,它们根本没有任何纹理坐标

-(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)吗?

4

1 回答 1

0

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

...
glDrawArrays( renderStyle, 0, self.vertexCount);

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

永远记住,OpenGL 是一个状态机,你改变的每一个状态(比如启用纹理)都会保持它的值,直到再次改变它。因此,您应该始终了解应用程序的哪些部分会更改 OpenGL 的哪些状态(如bindMaterial方法),并在渲染前立即设置您需要的每个状态。

于 2011-10-13T23:17:33.067 回答