android - 绘制带有纹理的正方形后未绘制 TRIANGLE_FAN 圆

标签 android opengl-es

更新:摘要: 我可以使用 TRIANGLE_FAN 绘制一个圆,另外,我还可以使用位图作为纹理绘制两个正方形。但问题是当我绘制纹理然后绘制圆圈时。未绘制圆圈。

我正在绘制两个纹理正方形(每个有 4 个顶点)。然后我使用 GL_TRIANGLE_FAN 绘制了一个圆圈,但它没有被正确绘制(见图片)。

当我绘制没有正方形的圆圈时,它绘制正确。

有什么想法可能是问题所在吗?

请询问更多信息。谢谢

添加一些我认为重要的代码:

public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    gl.glShadeModel(GL10.GL_SMOOTH);
    gl.glFrontFace(GL10.GL_CCW);
    gl.glEnable(GL10.GL_CULL_FACE);
    gl.glEnable(GL10.GL_BLEND);
    gl.glCullFace(GL10.GL_BACK);
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnable(GL10.GL_TEXTURE_2D);
}
public void onSurfaceChanged(GL10 gl, int w, int h) {
    gl.glViewport(0, 0, width, height);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glOrthof(0, w, -0, h, -1, 1);
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();
}

public void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
    circle.draw(gl);
    needle.draw(gl);
    synchronized (tokens) {
        for (Token d : tokens) {
            d.draw(gl);
        }
    }
}

更新: 一些截图。 不画圆和针对象: Without bitmaps

画圆和针: With bitmaps (看看那些应该是圆圈的红线)

这些图像之间代码的唯一变化是注释行

circle.draw(gl);
needle.draw(gl);

token :

public void draw(GL10 gl) {
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);

    gl.glPushMatrix();
    gl.glTranslatef(x, y, 0f);
    gl.glScalef(radius, radius, 0f);
    gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
    gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, nVertices+2);
    gl.glPopMatrix();
}

圆和针:

    public void draw(GL10 gl) {
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);

    if (shouldLoadTexture) {
        loadGLTexture(gl);
        shouldLoadTexture = false;
    }


    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);

    gl.glPushMatrix();
    gl.glTranslatef(x, y, 0f);
    gl.glRotatef((float) angle, 0f, 0f, 1f);
    angle += rotAngle;
    if(angle+rotAngle > 360.0)
        angle -= 360.0;
    gl.glScalef(width, height, 0f);
    gl.glDrawElements(GL10.GL_TRIANGLES, indices.length,
            GL10.GL_UNSIGNED_SHORT, indexBuffer);
    gl.glPopMatrix();

}

private void loadGLTexture(GL10 gl) {

    int[] textures = new int[1];
    gl.glGenTextures(1, textures, 0);
    textureId = textures[0];

    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
            GL10.GL_LINEAR);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
            GL10.GL_LINEAR);


    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,
            GL10.GL_CLAMP_TO_EDGE);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,
            GL10.GL_REPEAT);

    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
}

更新:

按照 Arne 在第一个答案中所说的内容,我进行了更改:

public void draw(GL10 gl) {
            //New line
            gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);

    if (shouldLoadTexture) {
        loadGLTexture(gl);
        shouldLoadTexture = false;
    }


    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);

    gl.glPushMatrix();
    gl.glTranslatef(x, y, 0f);
    gl.glRotatef((float) angle, 0f, 0f, 1f);
    angle += rotAngle;
    if(angle+rotAngle > 360.0)
        angle -= 360.0;
    gl.glScalef(width, height, 0f);
    gl.glDrawElements(GL10.GL_TRIANGLES, indices.length,
            GL10.GL_UNSIGNED_SHORT, indexBuffer);
    gl.glPopMatrix();
            //New line
            gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}

现在我完全没有圈子了。没有第二张图片中的红线。

更新:

当我不加载圆和针的纹理时(只是评论对 loadTexture() 的调用),我得到这个:

Commenting loadTexture()

所以问题应该出在纹理上。

最佳答案

您在开始时启用纹理(通过调用 glEnable(GL_TEXTURE_2D)),但您不提供您的圆圈(标记)任何纹理坐标。正如我认为这些不应该被纹理化,你应该只为真正有纹理的对象启用纹理并在绘制它们之后再次禁用纹理,就像你在更新的代码中启用和禁用 texCoord 数组一样。

关于android - 绘制带有纹理的正方形后未绘制 TRIANGLE_FAN 圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7274556/

相关文章:

android - 使用字符串数组动态创建 RadioButton

opengl-es - 如何使用opengl将图像叠加到像素数组中?

OpenGL 雾与 OpenGL ES 雾

java - 当我旋转 Android 设备时,XML 变回 main.xml

java - 我如何更改另一个 Activity 的共享偏好值?

android - 无法在模拟器中启动 AVD。 sh : grep: command not found

opengl-es - 没有属性的顶点着色器

android - OpenGL ES2 : Vertex Indices and Texture coordinates?

android - android.opengl.matrix 中 setRotateM 函数背后的数学原理是什么?

android - 在 Android 上加载具有依赖项的共享库