Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 渲染时,淡出纹理在同一实体纹理上看起来不好_Android_Opengl Es_Opengl Es 2.0_Alphablending - Fatal编程技术网

Android 渲染时,淡出纹理在同一实体纹理上看起来不好

Android 渲染时,淡出纹理在同一实体纹理上看起来不好,android,opengl-es,opengl-es-2.0,alphablending,Android,Opengl Es,Opengl Es 2.0,Alphablending,我正在用OpenGLES2.0为android编写一个手机游戏。目前我正在尝试制作一个带有咒语的卷轴,游戏中应该是这样的: 这将是GUI的一个元素,玩家可以在这里选择他当前想要施放的法术。正如你们所看到的,可以有更多的法术,比滚动的宽度允许,所以玩家应该能够滚动他们左右显示更多。这些靠近边缘的应该淡出 我的游戏有两层:GUI和游戏本身。我在单GUI界面视图中呈现:游戏世界在透视投影中呈现,GUI在正交界面中呈现,在游戏世界前面呈现。事实上,每个GUI元素都有相同的网格:由两个三角形面组成的平面

我正在用OpenGLES2.0为android编写一个手机游戏。目前我正在尝试制作一个带有咒语的卷轴,游戏中应该是这样的:

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

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

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

  • 前景(随着alpha的减弱):
  • 徖。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

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

    正如你所看到的,有一些较暗的区域,在这些区域,前场是以阿尔法梯度的。好像前景和背景没有完全对齐。我完全不明白为什么

    • 我已经确保模型(平面)处于相同的世界坐标(Z除外)并且具有相同的大小(精确地说,它们是正方形)
    • 我启用了alpha混合,并根据alpha混合纹理与摄影机的距离对模型进行排序
    • 我试图关闭mipmap的自动生成功能,但没有效果
    • 我已经检查了我的飞机的网格和它的UVMap是否有不准确的数字。在波前中,平面网格如下所示:

      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);
        }
    

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

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


    然后应该使用
    GLES20.glBlendFunc(GLES20.GL_ONE,GLES20.GL_ONE_减去SRC_ALPHA)作为你的混合函数。

    你在使用什么混合函数?当我创建渲染器对象时,我调用:
    GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA,GLES20.GL_ONE_减去_SRC_ALPHA)然后
    GLES20.glEnable(GLES20.Glu混合物)。您的透明颜色是什么?绘制背景纹理时,可能不希望使用混合。它看起来可能只是通过背景纹理的透明部分显示的清晰颜色。好吧,问题是,背景纹理是完全不透明的-当然在羊皮纸部分,因为羊皮纸的上面和下面都有透明度。我的清晰颜色是矢车菊蓝,但它没有显示出来,因为在我的卷轴后面是我的游戏世界——在上面的屏幕上,我相信它是石头地板。值得一提的是,当我隐藏第一层的时候,卷轴看起来还不错——没有任何较暗的区域。效果很好!非常感谢你。我一定要读更多关于这两个参数的书。。。