纹理已经加载,主要展示代码如下:
- (void)draw
{
    glClearColor(0.7, 0.7, 0.7, 1.0);    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_BLEND);
    glEnable(GL_TEXTURE_2D);
    glBlendFunc(GL_ONE, GL_SRC_COLOR);
    
    glEnable(GL_DEPTH_TEST);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    
    CGFloat width = self.bounds.size.width;
    CGFloat height = self.bounds.size.height;
    
    glOrthof(-width / 2,
             width / 2,
             -height / 2,
             height / 2,
             -0.01,
             10);
    //    glFrustumf(-width / 2,
    //               width / 2,
    //               -height / 2,
    //               height / 2,
    //               1,
    //               100);
    glViewport(0, 0, width, height);
    
    
    float POSITION[] = {0, 0, -1, 0};
    glLightfv(GL_LIGHT0, GL_POSITION, POSITION);
    
    float AMBIENT[] = {0, 0, 1, 1}; // 颜色配置无色(宇宙环境为无色)
    glLightfv(GL_LIGHT0, GL_AMBIENT, AMBIENT);
    
    float DIFFUSE[] = {1, 1, 1, 1}; // 漫反射颜色设为白色
    glLightfv(GL_LIGHT0, GL_DIFFUSE, DIFFUSE);
    
    float SPECULAR[] = {1, 1, 1, 1}; //  镜面反射设为白色
    glLightfv(GL_LIGHT0, GL_SPECULAR, SPECULAR);
    
    glEnable(GL_COLOR_MATERIAL);
    glEnableClientState(GL_VERTEX_ARRAY);
//    glEnableClientState(GL_COLOR_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    
    glVector3f A = glVector3fMake(-256, 256, -1);
    glVector3f B = glVector3fMake(256, 256, -1);
    glVector3f C = glVector3fMake(-256, -256, -1);
    glVector3f D = glVector3fMake(256, -256, -1);
    
    glVector3f points[] = {
        A,
        B,
        C,
        D
    };
    
    glVector3f texturePoints[] = {
        glVector2fMake(0, 1),
        glVector2fMake(1, 1),
        glVector2fMake(0, 0),
        glVector2fMake(1, 0)
    };    GLbyte location[] = {
        0, 1, 2, 3
    };
    
//    GLfloat colors[] = {
//        1, 0, 0, 1,
//        0, 1, 0, 1,
//        0, 0, 1, 1,
//        1, 1, 0, 1
//    };
    
    
    // ABC, BCD
    glTriangle3v normals[] = {
        glTriangle3vNormal(glTriangle3vMake(A, B, C)),
        glTriangle3vNormal(glTriangle3vMake(B, C, D)),
    };
    
    glBindTexture(GL_TEXTURE_2D, self.textureId);
    glVertexPointer(3, GL_FLOAT, 0, points);
//    glColorPointer(4, GL_FLOAT, 0, colors);
    
    glNormalPointer(GL_FLOAT, 0, normals);
    glPointSize(10);
    glTexCoordPointer(2, GL_FLOAT, 0, texturePoints);
    
//    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, location);
    
    glDisableClientState(GL_VERTEX_ARRAY);
//    glDisableClientState(GL_COLOR_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    
    [_context presentRenderbuffer:GL_RENDERBUFFER_OES];
}

解决方案 »

  1.   

    一些数据结构如下
    typedef struct _glVector3f
    {
        GLfloat x, y, z;
        
    }glVector3f;typedef struct _glVector2f
    {
        GLfloat x, y;
        
    }glVector2f;
      

  2.   

    兄弟啊,改一下纹理坐标看看,01,11,10,00,我很久没接触openGl了,还是大学时候选修的,现在在做ios开发,记得纹理坐标不是顺时针就是逆时针,没有你这样的,自然可能效果不一样
      

  3.   

    有兴趣可以相互交流,自我感觉对openGl研究还可以,灯光,纹理,混合,lod地形,粒子系统,碰撞检测最基本的还是知道的,本来打算毕业做游戏的,结果被迫做了ios
      

  4.   


    纹理坐标对应顶点坐标,如下是opgl代码,展示是正常的,
    glTexCoord2f(0.0f, 0.0f); glVertex3f(-8.0f, -8.0f, 0.0f);
    glTexCoord2f(0.0f, 5.0f); glVertex3f(-8.0f, 8.0f, 0.0f);
    glTexCoord2f(5.0f, 5.0f); glVertex3f(8.0f, 8.0f, 0.0f);
    glTexCoord2f(5.0f, 0.0f); glVertex3f(8.0f, -8.0f, 0.0f);
      

  5.   

    将api切换到es2.0,目前是正常的。。