首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当呈现时,褪色纹理在相同的实体纹理上看起来很糟糕。

当呈现时,褪色纹理在相同的实体纹理上看起来很糟糕。
EN

Stack Overflow用户
提问于 2014-10-20 13:37:36
回答 1查看 179关注 0票数 1

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

这将是GUI的一个元素,玩家可以选择他目前想要施放的法术。如你所见,可以有更多的法术,比滚动的宽度允许,所以玩家应该能够滚动他们左-右显示更多。这些靠近边缘的东西应该会褪色。

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

我想我可以通过拥有3层GUI来达到上述效果:

  1. 前景(随着alpha逐渐褪色):

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

  1. 前景下方的咒语:

  1. 以下咒语的背景:

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

正如你所看到的,有一些较暗的区域,前场正在与阿尔法渐变。就好像前景和背景没有完全对齐一样。我完全不明白为什么。

  • 我已经确保模型(飞机)在相同的世界坐标(Z除外),有相同的大小(确切地说,它们是正方形),
  • 我打开了阿尔法混合开关,我根据模型与摄像机的距离对模型进行排序,
  • 我试过关掉地图的自动生成,但没什么用,
  • 我已经检查了我的飞机的网格和它的UVMap不准确的数字。在波前,平面网格看起来是这样的: O型飞机v 1.000000 0.000000 0.000000 v 0.000000 0.000000 v 1.000000 -0.000000 v 0.000000 1.000000 vt 0.000000 vt 0.000000 1.000000 vt 0.000000 0.000000 vt 0.000000 0.000000 vn 0.000000 0.000000 1.000000 f 2/1/ 1 /2/1 /3/ 1/2/1 3/4/1 4/3/1
  • 我的着色器是这样的:

顶点着色器:

代码语言:javascript
运行
复制
    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;
    }

碎片着色器:

代码语言:javascript
运行
复制
    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);
    }

你知道为什么会发生这种事吗?也许是因为某种原因不能按我想的那样做?如果是的话,你能提出其他办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-22 12:16:17

可能您的纹理不具有与下面的纹理相同的颜色。也就是说,颜色比特也在衰落,而不仅仅是alpha部分。

然后您应该使用GLES20.glBlendFunc(GLES20.GL_ONE,GLES20.GL_ONE_MINUS_SRC_ALPHA);作为您的混合函数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26467017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档