我有一系列OpenGL-ES调用,正确地渲染三角形,并在模拟器(2.0.1)上使用alpha混合进行纹理化.当我在实际的设备(Droid 2.0.1)上启动相同的代码时,我得到的都是白色方块.
@H_403_2@这对我来说,纹理没有加载,但是我不知道为什么它们不加载.我所有的纹理都是32位PNG,具有alpha通道,在res / raw下,因此它们没有按照sdk docs进行优化.
@H_403_2@以下是我加载纹理的方式:
这是我的BitmapOptions,更新了上面的调用,我现在正在调用BitmapFactory,结果仍然如下所示:
sBitmapOptions.inPreferredConfig = Bitmap.Config.RGB_565;
private void loadGLTexture(GL10 gl,Context context,int reasource_id,int texture_id) { //Get the texture from the Android resource directory Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),reasource_id,sBitmapOptions); //Generate one texture pointer... gl.glGenTextures(1,textures,texture_id); //...and bind it to our array gl.glBindTexture(GL10.GL_TEXTURE_2D,textures[texture_id]); //Create Nearest Filtered Texture gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_NEAREST); gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_LINEAR); //Different possible texture parameters,e.g. GL10.GL_CLAMP_TO_EDGE gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S,GL10.GL_REPEAT); gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_T,GL10.GL_REPEAT); //Use the Android GLUtils to specify a two-dimensional texture image from our bitmap GLUtils.texImage2D(GL10.GL_TEXTURE_2D,bitmap,0); //Clean up bitmap.recycle(); }@H_403_2@以下是渲染纹理的方式:
//Clear gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); //Enable vertex buffer gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); gl.glVertexPointer(3,GL10.GL_FLOAT,vertexBuffer); gl.glTexCoordPointer(2,textureBuffer); //Push transformation matrix gl.glPushMatrix(); //Transformation matrices gl.glTranslatef(x,y,0.0f); gl.glScalef(scalefactor,scalefactor,0.0f); gl.glColor4f(1.0f,1.0f,1.0f); //Bind the texture gl.glBindTexture(GL10.GL_TEXTURE_2D,textures[textureid]); //Draw the vertices as triangles gl.glDrawElements(GL10.GL_TRIANGLES,indices.length,GL10.GL_UNSIGNED_BYTE,indexBuffer); //Pop the matrix back to where we left it gl.glPopMatrix(); //Disable the client state before leaving gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);@H_403_2@这里是我启用的选项:
gl.glShadeModel(GL10.GL_SMOOTH); //Enable Smooth Shading gl.glEnable(GL10.GL_DEPTH_TEST); //Enables Depth Testing gl.glDepthFunc(GL10.GL_LEQUAL); //The Type Of Depth Testing To Do gl.glEnable(GL10.GL_TEXTURE_2D); gl.glEnable(GL10.GL_BLEND); gl.glBlendFunc(GL10.GL_SRC_ALPHA,GL10.GL_ONE_MINUS_SRC_ALPHA);@H_403_2@编辑:我刚刚尝试向BitmapFactory.decodeResource()调用提供一个BitmapOptions,但这似乎并没有解决问题,尽管手动设置了相同的preferredconfig,density和targetdensity. @H_403_2@编辑2:根据要求,这里是模拟器工作的截图.底层三角形显示为呈现在其上的圆形纹理,透明度正在工作,因为您可以看到黑色背景. @H_403_2@删除死亡的ImageShack链接 @H_403_2@这里是一个什么droid做的与完全相同的代码的镜头: @H_403_2@删除死亡的ImageShack链接 @H_403_2@EDIT3:
这是我的BitmapOptions,更新了上面的调用,我现在正在调用BitmapFactory,结果仍然如下所示:
sBitmapOptions.inPreferredConfig = Bitmap.Config.RGB_565;
sBitmapOptions.inDensity = 160; sBitmapOptions.inTargetDensity = 160; sBitmapOptions.inScreenDensity = 160; sBitmapOptions.inDither = false; sBitmapOptions.inSampleSize = 1; sBitmapOptions.inScaled = false;@H_403_2@这里是我的顶点,纹理坐标和索引:
/** The initial vertex definition */ private static final float vertices[] = { -1.0f,-1.0f,0.0f,0.0f }; /** The initial texture coordinates (u,v) */ private static final float texture[] = { //Mapping coordinates for the vertices 0.0f,0.0f }; /** The initial indices definition */ private static final byte indices[] = { //Faces definition 0,1,3,2 };@H_403_2@一旦将其加载到OpenGL ES中,是否有权转储纹理的内容?也许我可以将仿真器的加载纹理与实际设备的加载纹理进行比较? @H_403_2@我尝试使用不同的纹理(默认的android图标),并且再次,它适用于模拟器,但无法在实际的手机上呈现. @H_403_2@Edit4:当纹理加载时,尝试切换.没有运气.尝试使用0的恒定偏移量到glGenTextures,没有变化. @H_403_2@有没有我使用的模拟器支持实际的手机没有? @H_403_2@Edit5:Per Ryan下面我将我的纹理从200×200调整到256×256,并且问题没有解决. @H_403_2@编辑:根据要求,将调用添加到glVertexPointer和glTexCoordPointer上面.另外,这里是vertexBuffer,textureBuffer和indexBuffer的初始化:
ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length * 4); byteBuf.order(ByteOrder.nativeOrder()); vertexBuffer = byteBuf.asFloatBuffer(); vertexBuffer.put(vertices); vertexBuffer.position(0); byteBuf = ByteBuffer.allocateDirect(texture.length * 4); byteBuf.order(ByteOrder.nativeOrder()); textureBuffer = byteBuf.asFloatBuffer(); textureBuffer.put(texture); textureBuffer.position(0); indexBuffer = ByteBuffer.allocateDirect(indices.length); indexBuffer.put(indices); indexBuffer.position(0); loadGLTextures(gl,this.context);
解决方法
我也是Android OpenGL ES开发人员的新手.我拥有一个里程碑(欧元版为Droid).
@H_403_2@从目前为止我可以看到的是,在我的里程碑上,从不同的书籍/网站发射了几个教程应用程序,似乎这款手机以与迄今为止发布的所有其他Android手机不同的方式处理OpenGL ES.
@H_403_2@我认为它与设备上支持的OpenGL扩展有关.
@H_403_2@检查此链接的支持的扩展名单,我相当确定一个代码大师会找到为什么droid正在以这样一个奇怪的方式处理opengl es.
@H_403_2@http://www.rbgrn.net/content/345-hands-on-motorola-droid-opengl-es-specs
@H_403_2@希望这有帮助..有一点
@H_403_2@编辑:
@H_403_2@我调整了manifest.xml并注意到使用时
<uses-sdk android:minSdkVersion="6"/>@H_403_2@资源根本没有加载. @H_403_2@使用时
<uses-sdk android:minSdkVersion="3"/>@H_403_2@资源正在加载罚款. @H_403_2@所以我转回去
<uses-sdk android:minSdkVersion="6"/>@H_403_2@并更改了位图的加载方式. @H_403_2@尝试替换:
//Get the texture from the Android resource directory Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),sBitmapOptions);@H_403_2@与:
InputStream is = context.getResources().openRawResource(your.resource.there); Bitmap bitmap = null; try { bitmap = BitmapFactory.decodeStream(is); } finally { //Always clear and close try { is.close(); is = null; } catch (IOException e) { } }@H_403_2@纹理正在加载我的里程碑与该代码,希望这可以为您工作!