未呈现 Android OpenGL 纹理

标签 android opengl-es textures

这是我的 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)));

这是我的纹理类

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);

}
}

我遇到的问题是,除了纹理应该在的正确形状和位置的白色框外,没有绘制任何东西。

图像大小为 50x50,我认为这是由于 2 东西的力量,但这个问题也发生在模拟器上。

此外,我确实在日志中收到一个错误,它显示:“GL 纹理加载错误:无效值”,但我不知道那是什么意思。

最后,我画了这样的纹理:

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 或 公认的分辨率和格式符号常量之一。
  • 如果宽度或高度小于 0 或,则生成 GL_INVALID_VALUE 大于 2 + GL_MAX_TEXTURE_SIZE。
  • GL_INVALID_VALUE 如果不是非二次幂纹理则生成 支持,宽度或高度不能表示为 2k + 2 k 的某个整数值的边界。
  • 如果 border 不是 0 或 1,则生成 GL_INVALID_VALUE。

我假设内部格式是错误的。尝试为自己指定它怎么样。您可以找到更多关于 GLUtils 的文档 there .

但是我首先看到您在将纹理加载到 GL 之前没有绑定(bind)纹理。

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 纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6799368/

相关文章:

android - 如何隐藏Android中的其他应用程序?

android - 如何在 Android 中制作工具栏(如辅助操作栏)?

android - 将 OpenGL fragment 着色器设置为仅通过漫反射减少 vec4 颜色点的 RGB 值,而不是 alpha

cuda - 动态修改纹理数组的内容

opengl - 四 strip 纹理失真

java - 即使用户切换应用程序,CountDownTimer 也会运行

iphone - 在 iPhone 上渲染为非二次方纹理

java - Android 压缩纹理加载(缺少 GL 扩展)

c++ - 是否可以使用带有立方贴图颜色附件的深度渲染缓冲区?

android - SQLiteReadOnlyDatabaseException : attempt to write a readonly database