当前位置: 首页 > 知识库问答 >
问题:

为什么我得到“glDrawElements:没有绑定到命令的数据-忽略”?

楮景明
2023-03-14

我一直在尝试使用OpenGL2绘制一个带有纹理的平面。在Android上安装了0个ES。然而,我不断收到一个logcat错误,上面写着“GLDrawerements:没有绑定到命令的数据-忽略”(tag:emuglesv2_enc),飞机不再显示。

我的飞机:

public class Wall {
private FloatBuffer data;
private ShortBuffer indices;
private final int program;
private final int positionHandle;
private final int textureHandle;
private final int samplerHandle;
private final int mvpHandle;
private final int[] buffers = new int[2];
private final int[] textures = new int[1]; 
private final float[] mvpMatrix = new float[16];

public Wall(String v, String f, Bitmap b) { //vertex shader, fragment shader and texture
    data = ByteBuffer.allocateDirect(80).order(ByteOrder.nativeOrder()).asFloatBuffer();
    data.put(new float[]{-20.0f, .0f, -20.0f, .0f, .0f, //x, y, z, texCoord x, texCoord y
                        -20.0f, .0f, 20.0f, .0f, 1.0f,
                        20.0f, .0f, -20.0f, 1.0f, .0f,
                        20.0f, .0f, 20.0f, 1.0f, 1.0f});
    data.position(0);

    indices = ByteBuffer.allocateDirect(8).order(ByteOrder.nativeOrder()).asShortBuffer();
    indices.put(new short[]{0, 1, 2, 3});
    indices.position(0);

    program = GLES20.glCreateProgram();
    GLES20.glAttachShader(program, OwnRenderer.getShader(GLES20.GL_VERTEX_SHADER, v)); //compile the shader
    GLES20.glAttachShader(program, OwnRenderer.getShader(GLES20.GL_FRAGMENT_SHADER, f));
    GLES20.glLinkProgram(program);

    positionHandle = GLES20.glGetAttribLocation(program, "inPosition");
    textureHandle = GLES20.glGetAttribLocation(program, "inTexture");
    samplerHandle = GLES20.glGetUniformLocation(program, "tex");
    mvpHandle = GLES20.glGetUniformLocation(program, "mvpMatrix");

    GLES20.glGenBuffers(2, buffers, 0);
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[0]);
    GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, 80, data, GLES20.GL_STATIC_DRAW);
    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, buffers[1]);
    GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER, 8, indices, GLES20.GL_STATIC_DRAW);

    GLES20.glGenTextures(1, textures, 0);
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, b, 0);
    b.recycle();

    setMVP();
}

public void draw() {
    GLES20.glUseProgram(program);

    GLES20.glUniform1i(samplerHandle, 0);
    GLES20.glUniformMatrix4fv(mvpHandle, 1, false, mvpMatrix, 0);
    GLES20.glEnableVertexAttribArray(positionHandle);
    GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 20, 0);
    GLES20.glEnableVertexAttribArray(textureHandle);
    GLES20.glVertexAttribPointer(textureHandle, 2, GLES20.GL_FLOAT, false, 20, 12);


    GLES20.glDrawElements(GLES20.GL_TRIANGLE_STRIP, 4, GLES20.GL_UNSIGNED_SHORT, 0);
    GLES20.glDisableVertexAttribArray(positionHandle);
    GLES20.glDisableVertexAttribArray(textureHandle);
}

private void setMVP() {
    //First scaling, then rotation, then translation.
    Matrix.setIdentityM(mvpMatrix, 0);
    Matrix.multiplyMM(mvpMatrix, 0, MainActivity.viewMatrix, 0, mvpMatrix, 0);
    Matrix.multiplyMM(mvpMatrix, 0, MainActivity.projectionMatrix, 0, mvpMatrix, 0);
}

}

顶点着色器:

uniform mat4 mvpMatrix;
attribute vec4 inPosition;
attribute vec2 inTexture;
varying vec2 outTexture;

void main() {
    gl_Position = mvpMatrix * inPosition;
    outTexture = inTexture;
}

片段着色器:

precision mediump float;
uniform Sampler2D tex;
varying vec2 outTexture;

void main() {
    gl_FragColor = texture(tex, outTexture);
}

Emulator在android 5.1.1上运行。

共有1个答案

凤经国
2023-03-14

尝试将所有与Shader相关的调用移动到GL Thread中,即onSurfaceCreated()onSurfaceChanged()onDrawFrame()。更多信息:glCreateShader和glCreateProgram在android上失败

 类似资料:
  • 问题内容: 我知道静态方法在类级别。因此,我知道我不需要创建实例来调用静态方法。但我也知道我可以将静态方法(如LIKE)称为实例方法。这是我感到困惑的地方,因为我期望从null对象调用静态方法(就像在调用实例方法中一样)。我真的很感谢一些解释,为什么我错了一个期望。 这是示例代码: 问题答案: 通过实例调用静态方法不需要实例存在。只要编译器能够确定变量的类型,它就可以在评估表达式并丢弃结果后静态进

  • 我有一个arraylist,其中添加了以下数字。 然后我使用下面的代码遍历列表并在打印前求和。 它正在打印出一个值6。有人知道发生了什么吗?或者有人能解释我在这里做错了什么吗?感谢您的时间,如果有什么我可以补充澄清的,请不要犹豫。

  • 问题内容: 我正在编写一个简单的项目,一个使用Swing编写的业务应用程序,它使用Hibernate作为后端。我来自Spring,这为我提供了使用hibernate和事务的简便方法。无论如何,我设法让Hibernate工作。昨天,在编写一些代码从数据库中删除bean的同时,我得到了以下信息: 删除代码很简单: 我的是: 其他详细信息:仅在关闭应用程序时,我才会在代码中关闭hibernate会话。这

  • 我正在尝试获取href的值,因为我需要在查询字符串中传递一个变量 我必须打开一个弹出窗口,其中“MySecondPage”应该以查询字符串中的值打开,但这个.href返回空值,我不知道为什么它不能工作,就像它在itemtemplate(gridview)中工作一样,我使用了table并用angularJS Repeat。 这是我的弹出功能:

  • 命令替换得到$((2+3))为什么没有继续扩展? 在展开的顺序中arithmetic expand在command substitution之后进行的,为什么arithmetic expand没有执行呢? 如果这里的命令替换得到的是*,它是会继续进行filename expand的。

  • 问题内容: public class Category { 在正在生成。 问题答案: 当您执行时,您称呼孩子们的。这里没有问题,只不过您在这里调用了父对象。这将称呼孩子,等等。 不错的无限循环。 摆脱它的最好方法是将您的方法更改为: 这样,您将不打印parentCategory,而仅显示其名称,不显示无限循环,不显示StackOverflowError。 编辑: 正如博洛在下面说的那样,您将需要检