渲染时淡出纹理在相同的实体纹理上看起来很糟糕

时间:2014-10-20 13:37:37

标签: android opengl-es opengl-es-2.0 alphablending

我正在使用OpenGL ES 2.0为Android编写手机游戏。目前我正试图用法术制作卷轴,游戏中应该是这样的:

Scroll design

这将是GUI的一个元素,玩家可以选择他当前想要施放的法术。正如你所看到的,可以有更多的法术,而不是滚动的宽度允许,所以玩家应该能够左右滚动它们以显示更多。靠近边缘的这些应该淡出。

我的游戏有两个层次":GUI和游戏本身。我在单个GUISurfaceView中渲染两者:透视投影中的游戏世界和正交中的GUI,在游戏世界的前面。事实上,每个GUI元素都具有相同的网格:由两个三角形面构成的平面。当我需要矩形时,我只需修改比例矩阵。

我认为通过3层GUI可以实现上述效果:

  1. 前景(它以alpha消失):
  2. Left edge of the foreground .......................................... .................................................. ..... Right edge of the foreground

    1. 在前景下面拼写:
    2. Fireball Fireball Fireball Fireball Fireball Fireball Fireball Fireball

      1. 背景下面的法术:
      2. Left edge of the background Middle background Right edge of the background

        如您所见,除alpha通道外,背景的边缘和前景的egdes完全相同。所以它们应该完美对齐并允许这种淡出效果。它们是 - 至少在Paint.NET中(我上传了.pdn文件,包含所有3层滚动here)。但不是渲染的OpenGL。相反,它看起来像这样(没有任何拼写图标):

        Rendered scroll

        正如您所看到的,有一些较暗的区域,其中前景正在使用alpha进行渐变。好像前景和背景没有完美对齐。我完全不明白为什么。

        • 我确保模型(平面)处于相同的世界坐标(Z除外)并且具有相同的尺寸(确切地说它们是正方形),
        • 我启用了Alpha混合,我根据与相机的距离对alpha混合纹理进行排序,
        • 我试图关闭自动生成的mipmap,但它没有帮助,
        • 我检查了我的飞机网格及其UVMap是否有不准确的数字。在Wavefront中,平面网格看起来像:

          o Plane
          v 1.000000 0.000000 0.000000
          v 0.000000 0.000000 0.000000
          v 1.000000 1.000000 -0.000000
          v 0.000000 1.000000 -0.000000
          vt 0.000000 1.000000
          vt 1.000000 1.000000
          vt 0.000000 0.000000
          vt 1.000000 0.000000
          vn 0.000000 0.000000 1.000000
          f 2/1/1 1/2/1 4/3/1
          f 1/2/1 3/4/1 4/3/1
          
        • 我的着色器看起来像这样:

        顶点着色器:

            uniform mat4 uMVPMatrix;
            uniform mat4 uMVMatrix;
            uniform mat4 uNormalMatrix;
        
            attribute vec4 aPosition;
            attribute vec3 aNormal;
            attribute vec4 aColor;
            attribute vec2 aTexCoord;
        
            varying vec4 vColor;
            varying vec3 vNormal;
            varying vec3 vPosition;
            varying vec2 vTexCoord;
        
            void main() 
            {
                vColor = aColor;
                vNormal = aNormal;
                vTexCoord = aTexCoord;
        
                vPosition = vec3(uMVMatrix * aPosition);
                gl_Position = uMVPMatrix * aPosition;
            }
        

        片段着色器:

            precision mediump float;
        
            uniform sampler2D uTexture;
            uniform bool uHasTexture;
            uniform vec4 uDiffuse;
        
            varying vec4 vColor;
            varying vec3 vNormal;
            varying vec3 vPosition;
            varying vec2 vTexCoord;
        
            void main()
            {
                vec4 texColor;
                if (uHasTexture)
                    texColor = texture2D(uTexture, vTexCoord);
                else texColor = vec4(0, 0, 0, 0);
        
                vec4 color = vColor * texColor;
                gl_FragColor = vec4(color.rgb * uDiffuse.rgb, texColor.a * uDiffuse.a);
            }
        

        你有什么想法为什么会这样?也许出于某种原因它不能像我想象的那样完成?如果是这样,你能建议其他任何方式吗?

1 个答案:

答案 0 :(得分:1)

可能你的纹理与下面的纹理没有相同的颜色。即颜色位也在褪色,而不仅仅是alpha部分。

然后你应该使用GLES20.glBlendFunc(GLES20.GL_ONE,GLES20.GL_ONE_MINUS_SRC_ALPHA);作为混合功能。