这对我来说,纹理没有加载,但是我不知道为什么它们不加载.我所有的纹理都是32位PNG,具有alpha通道,在res / raw下,因此它们没有按照sdk docs进行优化.
以下是我加载纹理的方式:
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(); }
以下是渲染纹理的方式:
//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);
这里是我启用的选项:
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);
编辑:我刚刚尝试向BitmapFactory.decodeResource()调用提供一个BitmapOptions,但这似乎并没有解决问题,尽管手动设置了相同的preferredconfig,density和targetdensity.
编辑2:根据要求,这里是模拟器工作的截图.底层三角形显示为呈现在其上的圆形纹理,透明度正在工作,因为您可以看到黑色背景.
这里是一个什么droid做的与完全相同的代码的镜头:
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;
这里是我的顶点,纹理坐标和索引:
/** 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 };
一旦将其加载到OpenGL ES中,是否有权转储纹理的内容?也许我可以将仿真器的加载纹理与实际设备的加载纹理进行比较?
我尝试使用不同的纹理(默认的android图标),并且再次,它适用于模拟器,但无法在实际的手机上呈现.
Edit4:当纹理加载时,尝试切换.没有运气.尝试使用0的恒定偏移量到glGenTextures,没有变化.
有没有我使用的模拟器支持实际的手机没有?
Edit5:Per Ryan下面我将我的纹理从200×200调整到256×256,并且问题没有解决.
编辑:根据要求,将调用添加到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.
我认为它与设备上支持的OpenGL扩展有关.
检查此链接的支持的扩展名单,我相当确定一个代码大师会找到为什么droid正在以这样一个奇怪的方式处理opengl es.
http://www.rbgrn.net/content/345-hands-on-motorola-droid-opengl-es-specs
希望这有帮助..有一点
编辑:
我调整了manifest.xml并注意到使用时
<uses-sdk android:minSdkVersion="6"/>
资源根本没有加载.
使用时
<uses-sdk android:minSdkVersion="3"/>
资源正在加载罚款.
所以我转回去
<uses-sdk android:minSdkVersion="6"/>
并更改了位图的加载方式.
尝试替换:
//Get the texture from the Android resource directory Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),sBitmapOptions);
与:
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) { } }
纹理正在加载我的里程碑与该代码,希望这可以为您工作!