【问题标题】:Texture coordinates inconsistent纹理坐标不一致
【发布时间】:2018-03-13 18:40:36
【问题描述】:

我尝试在一个四边形上统一平铺纹理坐标以进行一些调试。

在桌面上没有问题,但在 android(旧平板电脑)上,我发现纹理坐标不一致(下面的图片链接显示了结果)。
当我们从 0.0,0.0 到 1.0,1.0 时,纹理坐标不断变得不一致。 不一致性随着平铺值的增加而增加,图像中的结果为 60,160。

我的设备的安卓版本是 5.0,GPU 支持 opengl es 2.0 而不是 3.0。

所以我想知道为什么在我的平板电脑上而不是在我的台式机上发生这种情况,希望了解有关导致它的 gpu 中发生的事情的信息。

我使用的着色器-

Shader "Unlit/uvdisplay"
{
    Properties
    {
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = fixed4(frac(i.uv*fixed2(60.0,160.0)),0.0,1.0);
                return col;
            }
            ENDCG
        }
    }
}

texcoord at origin
texcoord at the opposit end

【问题讨论】:

    标签: android unity3d graphics opengl-es


    【解决方案1】:

    并非所有 Android 设备都支持片段着色器中的 highp,一些较旧的设备仅限于 mediump。

    在 Unity 术语中,基于 these 定义,就好像您在片段着色器中要求 float 精度,但您得到 half 精度。

    除了尝试将值保持在原点附近以最大程度地减少错误外,您无能为力。

    另外,在一些仅支持半精度的设备上,只要您除了对纹理进行采样之外什么都不做(即在使用之前不要修改或调动纹理坐标),驱动程序/GPU 就可以使用纹理采样的完整精度。

    【讨论】:

    • 好的,这是硬件限制。感谢您的回答,我将使用合理的 20*20 瓷砖的多个四边形并将它们放置在适当的位置以形成大网格。应该这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多