android纹理
‘壹’ android 用png图像做opengl纹理时出现黑边怎么解决
诶呀,你这种用法大错特错了呀!texImage2D不能乱用呀,他是把资源导入GL用的,有点像玩游戏时的Loading.你应该在你的程序初始化时先glGentexture生成多个纹理句柄然后BindTexture,再把你需要的图片依次输入这时GL已经拥有了你全部的图片资源,然后在绘制的时候,用到哪张纹理就先Bind这个纹理,然后DrawArray,再Bind再DrawArray/DrawElement..哪有你这样每次draw都要texImage2D的?这不要慢死了推荐你去powervr的网站下载Opengles的pc端SDK,里面好多demo
‘贰’ cocos2dx android切换后台为什么要重建纹理
android系统下,切入后台,则纹理全部失效,从后台切到前台,cocos2d-x会重新加载纹理。这样有两个问题:
1、如果纹理较多的话,加载纹理会卡很长时间,就像死机一样。 变通解决方法是修改引擎代码,增加一个进度条提示。
2、文字描边等用到RenderTexture的地方会出现异常纹理,文字会花掉。 暂时不知道原因,无解。
这里提供一个解决方案,解决掉纹理失效的问题,初步测试没有发现大的问题,但是具体还要看实际运行情况,毕竟android机器太多了。
1、Cocos2dXGLSurfaceView.java代码修改
[cpp]view plain- @Override
- publicvoidonPause(){
- this.queueEvent(newRunnable(){
- @Override
- publicvoidrun(){
- Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleOnPause();
- }
- });
- //super.onPause();
- }
2、main.cpp中修改
[cpp]view plain- voidJava_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv*env,jobjectthiz,jintw,jinth)
- {
- InitCrashReport();
- if(!CCDirector::sharedDirector()->getOpenGLView())
- {
- CCEGLView*view=CCEGLView::sharedOpenGLView();
- view->setFrameSize(w,h);
- AppDelegate*pAppDelegate=newAppDelegate();
- CCApplication::sharedApplication()->run();
- }
- //else
- //{
- //ccDrawInit();
- //ccGLInvalidateStateCache();
- //CCShaderCache::sharedShaderCache()->reloadDefaultShaders();
- //CCTextureCache::reloadAllTextures();
- //CCNotificationCenter::sharedNotificationCenter()->postNotification(EVNET_COME_TO_FOREGROUND,NULL);
- //CCDirector::sharedDirector()->setGLDefaultValues();
- //}
- }
‘叁’ android 中 glCompressedTexImage2D(GL_PALETTE8_RGBA8_OES)生成的压缩纹理在显存中是压缩的吗
是压缩的。由于减少了带宽占用,对性能是有好处的。不过画质是有损的。 你用的这个参数会出错吧
‘肆’ Android音视频之使用OpenGL ES绘制图片
关于 OpenGL ES 的介绍,请先看上篇: Android 音视频之使用 OpenGL ES 绘制三角形 。
使用 OpenGL ES 绘制简单的几何形状还不够,OpenGL 更多地是用来显示而纹理图像,比如本地图片、相机画面。简单说,纹理(texture)就是一个图像或照片,它们可以被加载进 OpenGL 中。
OpenGL 中的纹理可以扰判用来表示图像、照片等,每个二维的纹理都由许多小缓缺改的纹理元素组成,它们是小块的数据,类似片段和像素。要使用纹理,最常用的方式是直接从一个图像文件加载数据。
纹理不会被直接绘制,它们要被绑定到纹理单元,然后把这些纹理单元传递给着色器。纹理映射的基本思想就是:首先为图元中的每个顶点指定恰当的纹理坐标,然后通过纹理坐标在纹理图中可以确定选中的纹理区域,最后将选中纹理区域中的内容根据纹理坐标映射到指定的图元上。
纹理的坐标系和顶点着色器的坐标系是不一样的。纹理坐标用浮点数来表示,范围 [0, 1],左上角坐标为 (0.0, 0.0),右上角坐标为 (1.0, 0.0)。注意:要将纹理坐标对应到正确的顶点上,才能使纹理正确扮银地显示。
定义顶点和纹理坐标,两者的顺序必须一一对应。
定义着色器。
加载图片到 OpenGL 中。
计算变换矩阵,采用 CenterInside 或者 CenterCrop 的方式显示。
显示图片。
源码在 GitHub 上。
参考资料: