小弟用native c来绘制位图,模拟器上没有问题,但在真机上无论如何也显示不了,等待高人解答,万分感激,显示部分代码如下:void appInit()
{
    glEnable(GL_NORMALIZE);
    glEnable(GL_DEPTH_TEST);
    glDisable(GL_CULL_FACE);
    glShadeModel(GL_FLAT);    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHT1);
    glEnable(GL_LIGHT2);    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    
    //打开位图
    memset(&g_bmpInfo, 0, sizeof(BITMAPFILE));    FILE* pFile = NULL;
    
    pFile = fopen("/sdcard/download/test.bmp", "r");
    if (NULL != pFile)
    {
        fread(&g_bmpInfo, 1, sizeof(g_bmpInfo),  pFile);
        
        int iPicSize = g_bmpInfo.bmiHeader.biWidth * g_bmpInfo.bmiHeader.biHeight * g_bmpInfo.bmiHeader.biBitCount / 8;
        g_pBmpData = malloc(iPicSize);
        fread(g_pBmpData, 1, iPicSize, pFile);
        fclose(pFile);
        pFile = NULL;
    }
    else
    {
    }}
// Called from the app framework.
void appDeinit()
{
}
static void PrepareFrame(int width, int height)
{
    glViewport(0, 0, width, height);
    
    //glClearColorx((GLfixed)(0.1f * 65536),
    //(GLfixed)(0.2f * 65536),
    //(GLfixed)(0.3f * 65536), 0x10000);
    
    glClearColorx(0,
        0,
        0, 0x10000);
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();    glMatrixMode(GL_MODELVIEW);    glLoadIdentity();
}static void DrawWithOpenGL(GLint textureName)
{
    static GLfloat rot = 0.0;    glColor4f(0.0, 0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    
float vertices1[] = {0.0f, 0.0f,128.0f, 0.0f, 0.0f, 128.0f, 128.0f, 128.0f }; 
unsigned char indices[] =      {0, 1, 3, 0, 3, 2};     static const Vertex3D vertices[] = {
        {-1.0,  1.0, -0.0},
        { 1.0,  1.0, -0.0},
        {-1.0, -1.0, -0.0},
        { 1.0, -1.0, -0.0}
    };
    static const Vertex3D normals[] = {
        {0.0, 0.0, 1.0},
        {0.0, 0.0, 1.0},
        {0.0, 0.0, 1.0},
        {0.0, 0.0, 1.0}
    };
    static const GLfloat texCoords[] = {
        0.0, 1.0,
        1.0, 1.0,
        0.0, 0.0,
        1.0, 0.0
    };    glLoadIdentity();
    glTranslatef(0.0, 0.0, -3.0);
    glRotatef(rot, 1.0, 1.0, 1.0);    glBindTexture(GL_TEXTURE_2D, textureName);
    glVertexPointer(2, GL_FLOAT, 0, vertices1);
    //glNormalPointer(GL_FLOAT, 0, normals);
    glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
    //glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices);     glDisableClientState(GL_VERTEX_ARRAY);
    //glDisableClientState(GL_NORMAL_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);}
static void Render(int width, int height)
{
    BOOL bOK = FALSE;
    BYTE* pbPacket = NULL;    // Prepare OpenGL ES for rendering of the frame.
    PrepareFrame(width, height);glMatrixMode(GL_PROJECTION);     glLoadIdentity();     GLuint textureName;
    glEnable(GL_TEXTURE_2D);
    glGenTextures(1, &textureName);
    glBindTexture(GL_TEXTURE_2D, textureName);    //将数据加载到纹理
    int widImg = 128;//g_bmpInfo.bmiHeader.biWidth;
    int heiImg = 128;//g_bmpInfo.bmiHeader.biHeight;
    glTexImage2D(GL_TEXTURE_2D, 0,
        GL_RGB, widImg, heiImg, 0,
        GL_RGB, GL_UNSIGNED_BYTE, g_pBmpData);    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);//线型滤波
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//线型滤波
    //glTexParameterx(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    //glTexParameterx(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);    //映射纹理
    DrawWithOpenGL(textureName);}void appRender(long tick, int width, int height)
{
    if (!gAppAlive)
    {
        return;
    }        Render(width, height);
}

解决方案 »

  1.   

    打下log吧,看看图片加载是否正确,可能是图片没从sd卡中读取出来吧
      

  2.   

    有log,图片打开成功了,分辨率都打印出来了。
    之前看过资料说图片尺寸要变成2的n次幂,我这个图片是176×144的,我把widImg和heiImg强行赋为128也不行
      

  3.   

    我的可以了,不需要什么2的N次方的图片,你肯定建模没建好。找个OPENGL的DEMO程序参考一下就好了。
      

  4.   

    能否说的详细些呢?在哪“建模”? 
    界面层的就是实现Render接口,还有那块呢,我的ImageRenderer如下class ImageRenderer implements Renderer {

    private Context mContext; public VideoRenderer(Context context)
    {
    mContext = context;
    }

        @Override
        public void onDrawFrame(GL10 gl) 
        {
         nativeRender();
        }
        public void onSurfaceChanged(GL10 gl, int width, int height)
        {
         nativeResize(width, height);
        }
        public void onSurfaceCreated(GL10 gl, EGLConfig config)
        {
            
            nativeInit();
        }
        
        private static native void nativeInit();
        private static native void nativeResize(int w, int h);
        private static native void nativeRender();
        private static native void nativeDone();
    }
      

  5.   

    static const Vertex3D vertices[] = {
            {-1.0,  1.0, -0.0},
            { 1.0,  1.0, -0.0},
            {-1.0, -1.0, -0.0},
            { 1.0, -1.0, -0.0}
        };
        static const GLfloat texCoords[] = {
            0.0, 1.0,
            1.0, 1.0,
            0.0, 0.0,
            1.0, 0.0
        };
    这个映射有问题吗,还请指教
      

  6.   

    自己解决了,在appInit中将下面两行去掉:
    glEnableClientState(GL_VERTEX_ARRAY);
      glEnableClientState(GL_COLOR_ARRAY);仅在render的时候用,还是要谢谢 xqhrs232。
      

  7.   

    pFile = fopen("/sdcard/download/test.bmp", "r");这个路径看看,是不是有问题