android 绑定纹理失败,android – 尝试在设备上绘制纹理三角形失败,但仿真器工作.为什么?...

作者遇到一个在Android设备上使用OpenGL-ES渲染纹理时遇到的问题,纹理在模拟器上能正常显示,但在Droid2.0.1设备上只显示为白色方块。已尝试设置BitmapOptions并调整纹理尺寸,但问题依然存在。代码中展示了纹理加载和渲染的过程,包括启用的各种OpenGL选项。开发者寻求解决方案来排查为何纹理在实际设备上无法正确加载。
摘要由CSDN通过智能技术生成

我有一系列OpenGL-ES调用,正确地渲染三角形,并在模拟器(2.0.1)上使用alpha混合进行纹理化.当我在实际的设备(Droid 2.0.1)上启动相同的代码时,我得到的都是白色方块.

这对我来说,纹理没有加载,但是我不知道为什么它们不加载.我所有的纹理都是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, 0, 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, 0, vertexBuffer);

gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, 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,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:根据要求,这里是模拟器工作的截图.底层三角形显示为呈现在其上的圆形纹理,透明度正在工作,因为您可以看到黑色背景.

删除死亡的ImageShack链接

这里是一个什么droid做的与完全相同的代码的镜头:

删除死亡的ImageShack链接

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,

1.0f, -1.0f, 0.0f,

-1.0f, 1.0f, 0.0f,

1.0f, 1.0f, 0.0f

};

/** The initial texture coordinates (u, v) */

private static final float texture[] = {

//Mapping coordinates for the vertices

0.0f, 1.0f,

1.0f, 1.0f,

0.0f, 0.0f,

1.0f, 0.0f

};

/** The initial indices definition */

private static final byte indices[] = {

//Faces definition

0,1,3, 0,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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值