繁体   English   中英

Android OpenGLES 2.0纹理闪烁

[英]Android OpenGLES 2.0 texture flashing

我的纹理有问题。 我正在用玩家和背景制作游戏。 背景不断变化,用户可以移动播放器。 玩家移动时,背景有时会开始闪烁,或者有时背景纹理是玩家纹理。 我无法截取屏幕截图,因为这是即时的,而且我没有时间解决此问题。 对不起,英语。 这是纹理加载器

public int loadTexture(Context context, int resource,int index){

        BitmapFactory.Options bo = new BitmapFactory.Options();
        Bitmap tex = BitmapFactory.decodeResource(context.getResources(), resource, bo);
        GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,texture[index]);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
        GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, tex, 0);
        tex.recycle();
        return texture[index];
    }

渲染

GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
         GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,texture);

          int mPositionHandle = 
                GLES20.glGetAttribLocation(riGraphicTools.sp_Image, "vPosition");

          GLES20.glEnableVertexAttribArray(mPositionHandle);
          GLES20.glVertexAttribPointer(mPositionHandle, 3,
                                         GLES20.GL_FLOAT, false,
                                         0, vertexBuffer);

          int mTexCoordLoc = GLES20.glGetAttribLocation(riGraphicTools.sp_Image, 
                               "a_texCoord" );

          GLES20.glEnableVertexAttribArray ( mTexCoordLoc );

          GLES20.glVertexAttribPointer ( mTexCoordLoc, 2, GLES20.GL_FLOAT,
                        false,
                        0, uvBuffer);

          int mtrxhandle = GLES20.glGetUniformLocation(riGraphicTools.sp_Image, 
                             "uMVPMatrix");

          GLES20.glUniformMatrix4fv(mtrxhandle, 1, false, m, 0);

          int mSamplerLoc = GLES20.glGetUniformLocation (riGraphicTools.sp_Image, 
                              "s_texture" );

          GLES20.glUniform1i ( mSamplerLoc, 0);

          GLES20.glDrawElements(GLES20.GL_TRIANGLES, indices.length,
                   GLES20.GL_UNSIGNED_SHORT, drawListBuffer);

          GLES20.glDisableVertexAttribArray(mPositionHandle);
          GLES20.glDisableVertexAttribArray(mTexCoordLoc);

程式

public static final String vs_SolidColor =
        "uniform    mat4        uMVPMatrix;" +
        "attribute  vec4        vPosition;" +
        "void main() {" +
        "  gl_Position = uMVPMatrix * vPosition;" +
        "}";

    public static final String fs_SolidColor =
        "precision mediump float;" +
        "void main() {" +
        "  gl_FragColor = vec4(0.5,0,0,1);" +
        "}"; 

    /* SHADER Image
     * 
     * This shader is for rendering 2D images straight from a texture
     * No additional effects.
     * 
     */
    public static final String vs_Image =
        "uniform mat4 uMVPMatrix;" +
        "attribute vec4 vPosition;" +
        "attribute vec2 a_texCoord;" +
        "varying vec2 v_texCoord;" +
        "void main() {" +
        "  gl_Position = uMVPMatrix * vPosition;" +
        "  v_texCoord = a_texCoord;" +
        "}";

    public static final String fs_Image =
        "precision mediump float;" +
        "varying vec2 v_texCoord;" +
        "uniform sampler2D s_texture;" +
        "void main() {" +
        "  gl_FragColor = texture2D( s_texture, v_texCoord );" +
        "}"; 

您正在为背景和播放器“ 0”传递相同的纹理单位。 这可能是获得相同纹理的问题。 关于闪烁,您可能正在将播放器在Z轴上渲染为与背景相同。 将播放器画在背景上,z轴有些不同。 例如。 您可以将背景的z缓冲区设置为0.0f,将播放器的z轴设置为0.002f。

资料来源: http : //en.wikipedia.org/wiki/Z-fighting

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM