Android 渲染时,淡出纹理在同一实体纹理上看起来不好
我正在用OpenGLES2.0为android编写一个手机游戏。目前我正在尝试制作一个带有咒语的卷轴,游戏中应该是这样的: 这将是GUI的一个元素,玩家可以在这里选择他当前想要施放的法术。正如你们所看到的,可以有更多的法术,比滚动的宽度允许,所以玩家应该能够滚动他们左右显示更多。这些靠近边缘的应该淡出 我的游戏有两层:GUI和游戏本身。我在单GUI界面视图中呈现:游戏世界在透视投影中呈现,GUI在正交界面中呈现,在游戏世界前面呈现。事实上,每个GUI元素都有相同的网格:由两个三角形面组成的平面。当我需要矩形时,我只需要修改比例矩阵 我想我可以通过3层GUI实现上述效果: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元素都有相同的网格:由两个三角形面组成的平面
- 我已经确保模型(平面)处于相同的世界坐标(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混合物)代码>。您的透明颜色是什么?绘制背景纹理时,可能不希望使用混合。它看起来可能只是通过背景纹理的透明部分显示的清晰颜色。好吧,问题是,背景纹理是完全不透明的-当然在羊皮纸部分,因为羊皮纸的上面和下面都有透明度。我的清晰颜色是矢车菊蓝,但它没有显示出来,因为在我的卷轴后面是我的游戏世界——在上面的屏幕上,我相信它是石头地板。值得一提的是,当我隐藏第一层的时候,卷轴看起来还不错——没有任何较暗的区域。效果很好!非常感谢你。我一定要读更多关于这两个参数的书。。。