代码之家  ›  专栏  ›  技术社区  ›  Yaroslav Mytkalyk

OpenGL ES 1.0仅显示上次绘制的二维纹理

  •  0
  • Yaroslav Mytkalyk  · 技术社区  · 8 年前

    安装:OpenGL ES 1.0,Android

    术语 背景图像 这里是指在两个三角形上绘制的全屏纹理,这两个三角形构成全屏矩形。

    如果我画完整的场景,包括背景图像,我会得到黑色的背景色而不是清晰的背景色,而且我看不到背景显示的纹理

    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    drawBackground();
    drawParticles(scene.getNumDots());
    

    附加渲染图像:

    Particles

    但是,如果我画 只有 背景图像,我看到了。

    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    drawBackground();
    // drawParticles(scene.getNumDots()); commented out
    

    附加渲染图像:

    Render background only

    实施:

    // how it was setup
    public void setupGl(@NonNull final GL10 gl) {
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
    
        gl.glEnable(GL10.GL_BLEND);
        gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
    
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    }
    
    // This was called
    public void setDimensions(@NonNull final GL10 gl, final int width, final int height) {
    
        gl.glViewport(0, 0, width, height);
        gl.glOrthof(0, width, 0, height, 1, -1);
    }
    
    // textures were loaded like this
    private void loadTexture(
            @NonNull final GL10 gl,
            @NonNull final Bitmap texture,
            final int handleOffset) {
    
        gl.glGenTextures(1, textureHandle, handleOffset);
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textureHandle[handleOffset]);
    
        gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE);
    
        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_CLAMP_TO_EDGE);
    
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, texture, 0);
    }
    
    private void drawBackground() {
        backgroundTextureCoordinates.position(0);
        backgroundCoordinates.position(0);
    
        gl.glEnable(GL10.GL_TEXTURE_2D);
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textureHandle[TEXTURE_BACKGROUND]);
    
        gl.glTexCoordPointer(2, GL10.GL_BYTE, 0, backgroundTextureCoordinates);
        gl.glVertexPointer(2, GL10.GL_SHORT, 0, backgroundCoordinates);
        gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 2);
    
        gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        gl.glDisable(GL10.GL_TEXTURE_2D);
    }
    
    private void drawParticles(final int count) {
        gl.glEnable(GL10.GL_TEXTURE_2D);
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    
        particlesTexturesCoordinates.position(0);
        particlesTrianglesCoordinates.position(0);
    
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textureHandle[TEXTURE_PARTICLE]);
    
        gl.glTexCoordPointer(2, GL10.GL_BYTE, 0, particlesTexturesCoordinates);
        gl.glVertexPointer(2, GL10.GL_SHORT, 0, particlesTrianglesCoordinates);
        gl.glDrawArrays(GL10.GL_TRIANGLES, 0, count * VERTICES_PER_PARTICLE);
    
        gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        gl.glDisable(GL10.GL_TEXTURE_2D);
    }
    
    public void setClearColor(
            @NonNull final GL10 gl,
            @ColorInt int color) {
        gl.glClearColor(
                Color.red(color) / 255f,
                Color.green(color) / 255f,
                Color.blue(color) / 255f, 0f);
    }
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Yaroslav Mytkalyk    8 年前

    问题是我以前画背景的方式

    gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 2);
    

    在这里,我指定了三角形的数量: 2 .

    但我必须说明 顶点数 对于这两个三角形: 6 .

    gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 6);