Android OpenGL纹理未呈现

Android OpenGL纹理未呈现,第1张

概述这是我的GL初始化代码:gl.glEnable(GL10.GL_TEXTURE_2D);gl.glShadeModel(GL10.GL_SMOOTH);gl.glEnable(GL10.GL_BLEND);gl.glBlendFunc(GL10.GL_SRC_ALPHA,GL10.GL_ONE_MINUS_SRC_ALPHA);gl.glDisable(GL10.GL_DEPTH_TEST);gl.glMatrixMode(GL10

这是我的GL初始化代码:

    gl.glEnable(GL10.GL_TEXTURE_2D);    gl.glShadeModel(GL10.GL_SMOOTH);    gl.glEnable(GL10.GL_BLEND);    gl.glBlendFunc(GL10.GL_SRC_Alpha, GL10.GL_ONE_MINUS_SRC_Alpha);    gl.gldisable(GL10.GL_DEPTH_TEST);    gl.glMatrixMode(GL10.GL_PROJECTION);    gl.glLoadIDentity();    gl.glVIEwport(0, 0, wIDth, height);    float left = 0;    float right = wIDth;    float top = height;    float bottom = 0;    gl.glOrthof(left, right, top, bottom, -1, 1);    gl.glMatrixMode(GL10.GL_MODELVIEW);    gl.glLoadIDentity();    textures.put("ball", new Texture(gl, BitmapFactory.decodeResource(context.getResources(), R.drawable.ball)));

这是我的Texture类

public class Texture{int[] texture = new int[1];static int real_wIDth = 0;static int real_height = 0;Texture(GL10 gl, Bitmap bmp){    real_wIDth = bmp.getWIDth();    real_height = bmp.getHeight();    gl.glGenTextures(1, texture, 0);    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);    glutils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0);    bmp.recycle();    int error = gl.glGetError();    if (error != GL10.GL_NO_ERROR)    {         Log.e("RolL", "GL Texture Load Error: " + glu.gluErrorString(error));    }}public voID draw(GL10 gl, float x, float y){    draw(gl, x, y, real_wIDth, real_height);}public voID draw(GL10 gl, float x, float y, float w, float h){    gl.glEnableClIEntState(GL10.GL_TEXTURE_COORD_ARRAY);    gl.glEnableClIEntState(GL10.GL_VERTEX_ARRAY);    float[] vertices = { x + w, y + h, x, y + h, x, y, x + w, y };    float[] textureCoords = { 1, 1, 0, 1, 0, 0, 1, 0 };    ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length * 4);    byteBuf.order(ByteOrder.nativeOrder());    floatBuffer vertexBuffer = byteBuf.asfloatBuffer();    vertexBuffer.put(vertices);    vertexBuffer.position(0);    byteBuf = ByteBuffer.allocateDirect(textureCoords.length * 4);    byteBuf.order(ByteOrder.nativeOrder());    floatBuffer textureBuffer = byteBuf.asfloatBuffer();    textureBuffer.put(textureCoords);    textureBuffer.position(0);    gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[0]);    gl.glVertexPointer(2, GL10.GL_float, 0, vertexBuffer);    gl.glTexCoordPointer(2, GL10.GL_float, 0, textureBuffer);    gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 4);    gl.gldisableClIEntState(GL10.GL_VERTEX_ARRAY);    gl.gldisableClIEntState(GL10.GL_TEXTURE_COORD_ARRAY);}}

我得到的问题是,除了正确形状和位置的白色框外,什么都没画.

图像的大小为50×50,我认为这是由于2的功能所致,但是在模拟器上也会出现此问题.

另外,我的确在日志中得到一个错误,它说:“ GL Texture Load Error:无效值”,但是我不知道那是什么意思.

最后,我像这样绘制纹理

gl.glClearcolor(0.0f, 0.0f, 0.0f, 1.0f);gl.glClear(GL10.GL_color_BUFFER_BIT);textures.get("ball").draw(gl, 10, 10);

解决方法:

从glTexImage2D开始:

>如果internalFormat不是1、2、3、4或3,则生成GL_INVALID_VALUE
公认的分辨率和格式符号常量之一.
>如果宽度或高度小于0或则生成GL_INVALID_VALUE
大于2 GL_MAX_TEXTURE_SIZE.
>如果非二次幂纹理不是生成的,则生成GL_INVALID_VALUE
支持,宽度或高度不能表示为2k 2
k的某个整数值的边界.
>如果border不为0或1,则生成GL_INVALID_VALUE.

我认为内部格式是错误的.尝试自己指定该怎么办.有关glutils的更多文档,您可以找到there.

但首先,我看到在将纹理加载到GL之前尚未绑定纹理.

gl.glGenTextures(1, texture, 0);gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[0]); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);glutils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0);bmp.recycle();
总结

以上是内存溢出为你收集整理的Android OpenGL纹理未呈现全部内容,希望文章能够帮你解决Android OpenGL纹理未呈现所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1070670.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-26
下一篇2022-05-26

发表评论

登录后才能评论

评论列表(0条)

    保存