【发布时间】:2023-03-18 18:33:01
【问题描述】:
我正在使用 OpenGL ES 2.0 为 android 编写手机游戏。目前我正在尝试制作一个带有咒语的卷轴,游戏中应该是这样的:
这将是 GUI 的一个元素,玩家可以在其中选择他当前想要施放的咒语。正如你所看到的,可能有比滚动宽度允许的更多的法术,所以玩家应该能够左右滚动它们以显示更多。靠近边缘的这些应该淡出。
我的游戏有两个“层”:GUI 和游戏本身。我在单个 GUISurfaceView 中渲染两者:透视投影的游戏世界和正交的 GUI,在游戏世界的前面。事实上,每个 GUI 元素都有相同的网格:由两个三角形面组成的平面。当我需要矩形时,我只需修改比例矩阵。
我认为我可以通过 3 层 GUI 来实现上述效果:
- 前景(随着 alpha 逐渐消失):
................................................. ..................................................... ...
- 前景下方的法术:
- 咒语的背景:
如您所见,除了 Alpha 通道外,背景的边缘和前景的边缘完全相同。所以它们应该完美对齐并允许这种淡出效果。它们是 - 至少在 Paint.NET 中(我上传了所有 3 层滚动的 .pdn 文件here)。但不是在渲染的 OpenGL 中。相反,它看起来像这样(没有任何拼写图标):
如您所见,有一些较暗的区域前景随着 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);
}
您知道为什么会发生这种情况吗?也许由于某种原因,它不能按照我想象的方式完成?如果是这样,您能建议任何其他方法吗?
【问题讨论】:
-
你用的是什么混合功能?
-
当我创建我的渲染器对象时,我调用:
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);,然后是GLES20.glEnable(GLES20.GL_BLEND);。 -
你的透明色是什么?您可能不想在绘制背景纹理时使用混合。看起来它可能只是通过背景纹理的透明部分显示的清晰颜色。
-
嗯,问题是,背景纹理是完全不透明的——当然在羊皮纸部分,因为羊皮纸的上下都是透明的。我的清晰颜色是矢车菊蓝,但它没有显示,因为在我的卷轴后面呈现了我的游戏世界 - 在上面的屏幕中,我相信它是石头地板。值得补充的是,当我隐藏第一层时,滚动看起来不错 - 没有任何较暗的区域。
标签: android opengl-es opengl-es-2.0 alphablending