织梦CMS - 轻松建站从此开始!

罗索实验室

当前位置: 主页 > 嵌入式开发 > Android >

androidndk-ndk 下 openGL 画图

落鹤生 发布于 2012-06-07 21:15 点击:次 
在ndk下用C++实现,却发现画出来的图片是乱的,感觉是绑定纹理的时候出错的,可比较了很久代码,感觉没问题,大家帮忙找下错。还有,图片的byte数组,我是在java那边读出来传过来的,先把argb转换成rgba,再把图片相素上下颠倒,这个应该没有问题吧?
TAG:

我看了一本书上的源码,用一张图片做为openGL的纹理画图,可以把这张图片画出来。
我又用同样的方法,在ndk下用C++实现,却发现画出来的图片是乱的,感觉是绑定纹理的时候出错的,可比较了很久代码,感觉没问题,大家帮忙找下错。还 有,图片的byte数组,我是在java那边读出来传过来的,先把argb转换成rgba,再把图片相素上下颠倒,这个应该没有问题吧?下面是代码,大家 帮忙看一下。

#define one 1.0f
typedef unsigned char byte;
float rotateQuad;
GLuint  texture[1];
void *bitmapData;

static GLfloat buffer[12] = {
                                one,one,0,
                                -one,one,0,
                                one,-one,0,
                                -one,-one,0,
};
static GLfloat texCoords[8] = {
                                0,0,0,one,one,0,one,one,
};

void Java_com_ldj_hellondk_NdkGLRenderer_onNdkSurfaceCreated (JNIEnv* env, jobject obj)
{
    // 启用阴影平滑
    glShadeModel(GL_SMOOTH);

    // 黑色背景
    glClearColor(0, 0, 0, 0);

    // 设置深度缓存
    glClearDepthf(1.0f);
    // 启用深度测试
    glEnable(GL_DEPTH_TEST);
    // 所作深度测试的类型
    glDepthFunc(GL_LEQUAL);

    // 告诉系统对透视进行修正
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
        
    //允许2D贴图,纹理
    glEnable(GL_TEXTURE_2D);
               
    //IntBuffer intBuffer = IntBuffer.allocate(1);
    // 创建纹理
    glGenTextures(1, &texture[0]);
    //glGenTextures(1, intBuffer);
    //texture = intBuffer.get();
    // 设置要使用的纹理
    //glBindTexture(GL10.GL_TEXTURE_2D, texture);
               
    //纹理绑定
    glBindTexture(GL_TEXTURE_2D, texture[0]);
               
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 179, 176, 0, GL_RGBA, GL_UNSIGNED_BYTE, bitmapData);
    // 线形滤波
    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   
}

void Java_com_ldj_hellondk_NdkGLRenderer_onNdkSurfaceChanged (JNIEnv* env, jobject obj, jint width, jint height)
{
         //图形最终显示到屏幕的区域的位置、长和宽
    glViewport (0,0,width,height);
         //指定矩阵
         glMatrixMode   (GL_PROJECTION);
         //将当前的矩阵设置为glMatrixMode指定的矩阵
    glLoadIdentity ();
    glOrthof       (-2, 2, -2, 2, -2, 2);
}


void Java_com_ldj_hellondk_NdkGLRenderer_onNdkDrawFrame (JNIEnv* env, jobject obj)
{
  
    //启用顶点设置功能,之后必须要关闭功能
    glEnableClientState (GL_VERTEX_ARRAY);
    glEnableClientState (GL_COLOR_ARRAY);
         //清屏
    glClearColor (0,0,1,1);
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode (GL_MODELVIEW);
    glLoadIdentity ();
        
    glBindTexture(GL_TEXTURE_2D, texture[0]);///
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glTexCoordPointer(2, GL_FIXED, 0, texCoords);

    glFrontFace(GL_CW);
    glRotatef(rotateQuad, 1.0f, 0.0f, 0.0f);
    glVertexPointer(3, GL_FLOAT, 0, buffer);
        
    //glColorPointer(4, GL_FLOAT, 0 , colors);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
        
    //glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, indices);
    //关闭顶点设置功能
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState (GL_COLOR_ARRAY);
         
}

void Java_com_ldj_hellondk_NdkGLRenderer_setBitmap (JNIEnv* env, jobject obj, jbyteArray bytes)
{
        jbyte* buffer = env->GetByteArrayElements(bytes,0);
        bitmapData = buffer;
}

(秩名)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www1.rosoo.net/a/201206/16072.html]
本文出处:nmjtzy 作者:秩名 原文
顶一下
(0)
0%
踩一下
(2)
100%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容