我正在为安卓系统编写一个移动游戏,使用OpenGL ES 2.0。目前我正试图制作一个带有咒语的卷轴,游戏中应该是这样的:

这将是GUI的一个元素,玩家可以选择他目前想要施放的法术。如你所见,可以有更多的法术,比滚动的宽度允许,所以玩家应该能够滚动他们左-右显示更多。这些靠近边缘的东西应该会褪色。
我的游戏有两个“层次”:GUI和游戏本身。我呈现了两个单一的GUISurfaceView:游戏世界的透视投影和图形用户界面的正交,在游戏世界前面。事实上,每个GUI元素都有相同的网格:由两个三角形面组成的平面。当我需要矩形时,我只需要修改缩放矩阵。
我想我可以通过拥有3层GUI来达到上述效果:

.................................................................................................












正如你所看到的,除了alpha通道之外,背景和前景的边缘是完全相同的。因此,它们应该完美地对齐,并考虑到这种淡出效应。至少在Paint.NET中是这样的(我上传了所有3层滚动这里的.pdn文件)。但在渲染的OpenGL中没有。相反,它看起来像这样(没有任何拼写图标):

正如你所看到的,有一些较暗的区域,前场正在与阿尔法渐变。就好像前景和背景没有完全对齐一样。我完全不明白为什么。
顶点着色器:
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);
}你知道为什么会发生这种事吗?也许是因为某种原因不能按我想的那样做?如果是的话,你能提出其他办法吗?
发布于 2014-10-22 12:16:17
可能您的纹理不具有与下面的纹理相同的颜色。也就是说,颜色比特也在衰落,而不仅仅是alpha部分。
然后您应该使用GLES20.glBlendFunc(GLES20.GL_ONE,GLES20.GL_ONE_MINUS_SRC_ALPHA);作为您的混合函数。
https://stackoverflow.com/questions/26467017
复制相似问题