我正在使用OpenGL ES 2.0为Android编写手机游戏。目前我正试图用法术制作卷轴,游戏中应该是这样的:
这将是GUI的一个元素,玩家可以选择他当前想要施放的法术。正如你所看到的,可以有更多的法术,而不是滚动的宽度允许,所以玩家应该能够左右滚动它们以显示更多。靠近边缘的这些应该淡出。
我的游戏有两个层次":GUI和游戏本身。我在单个GUISurfaceView中渲染两者:透视投影中的游戏世界和正交中的GUI,在游戏世界的前面。事实上,每个GUI元素都具有相同的网格:由两个三角形面构成的平面。当我需要矩形时,我只需修改比例矩阵。
我认为通过3层GUI可以实现上述效果:
.......................................... .................................................. .....
如您所见,除alpha通道外,背景的边缘和前景的egdes完全相同。所以它们应该完美对齐并允许这种淡出效果。它们是 - 至少在Paint.NET中(我上传了.pdn文件,包含所有3层滚动here)。但不是渲染的OpenGL。相反,它看起来像这样(没有任何拼写图标):
正如您所看到的,有一些较暗的区域,其中前景正在使用alpha进行渐变。好像前景和背景没有完美对齐。我完全不明白为什么。
我检查了我的飞机网格及其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);
}
你有什么想法为什么会这样?也许出于某种原因它不能像我想象的那样完成?如果是这样,你能建议其他任何方式吗?
答案 0 :(得分:1)
可能你的纹理与下面的纹理没有相同的颜色。即颜色位也在褪色,而不仅仅是alpha部分。
然后你应该使用GLES20.glBlendFunc(GLES20.GL_ONE,GLES20.GL_ONE_MINUS_SRC_ALPHA);
作为混合功能。