C# 统一着色器错误

C# 统一着色器错误,c#,unity3d,shader,C#,Unity3d,Shader,我正在开发一个Unity着色器,它可以在一个平面上显示多个不同的平铺。Unity将一个浮点数组传递给着色器,该着色器包含一个平铺ID列表和一个4x4平铺贴图,对于大多数部分来说,它工作得非常完美,但是有一个小问题 我附上了一张这种现象的图片,在瓷砖的接缝处你可以看到灰线。我打开了瓷砖遮罩来减轻问题,这样更容易看到 以下是着色器代码: Shader "Unlit/TileMap" { Properties { // Texture configuration

我正在开发一个Unity着色器,它可以在一个平面上显示多个不同的平铺。Unity将一个浮点数组传递给着色器,该着色器包含一个平铺ID列表和一个4x4平铺贴图,对于大多数部分来说,它工作得非常完美,但是有一个小问题

我附上了一张这种现象的图片,在瓷砖的接缝处你可以看到灰线。我打开了瓷砖遮罩来减轻问题,这样更容易看到

以下是着色器代码:

Shader "Unlit/TileMap" { Properties { // Texture configuration _DiffuseTex("Diffuse", 2D) = "white" {} _MaskTex("Mask", 2D) = "black" {} _MapWidth("Map Width", int) = 0 _MaskMapWidth("Mask Mask Width", int) = 0 _WorldWidth("World Width", int) = 0 // Global illumination modifiers _GlobalLumosity("Global Lumosity", Range(0, 1)) = 1 _GlobalHue("Global Hue", Color) = (1, 1, 1, 1) } SubShader { Tags { "Queue"="Transparent" "RenderType"="Transparent" } LOD 200 ZWrite On Blend SrcAlpha OneMinusSrcAlpha Pass { CGPROGRAM #pragma target 4.0 #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; }; sampler2D _DiffuseTex; float4 _DiffuseTex_ST; sampler2D _MaskTex; float4 _MaskText_ST; uint _ID; uint _MapWidth; uint _MaskMapWidth; uint _WorldWidth; half _GlobalLumosity; float4 _GlobalHue; float _allIDs[16]; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _DiffuseTex); return o; } fixed4 frag (v2f i) : SV_Target { float mapSizeModif = 1.0f / _MapWidth; float maskMapSizeModif = 1.0f / _MaskMapWidth; float worldSizeModif = 1.0f / _WorldWidth; // float lightness = tex2D (_MaskTex, i.uv * _MapWidth); float lightness = 1.0f; uint index = (int) (floor(i.uv.x * _WorldWidth) + (floor(i.uv.y * _WorldWidth) * _WorldWidth)); i.uv.x = i.uv.x % worldSizeModif; i.uv.y = i.uv.y % worldSizeModif; uint id = (uint) _allIDs[index]; i.uv.x += mapSizeModif * (id % _MapWidth); i.uv.y += mapSizeModif * floor (((float)id) / _MapWidth); fixed4 col = tex2D (_DiffuseTex, i.uv); col *= _GlobalLumosity; col *= _GlobalHue; col.a = lightness; return col; } ENDCG } } } 这是设置磁贴信息的MonoBehavior控制器:

void Update()  {
    propBlock.SetFloatArray("_allIDs", new float[16] { 1, 1, 3, 2, 1, 1, 2, 2, 1, 3, 2, 1, 1, 2, 1, 1 });
    renderer.SetPropertyBlock(propBlock);
}
我认为这可能是简单的纹理出血之间的瓷砖,然而,即使当强迫它,使没有瓷砖出血是可能的(通过把偏移紫外线),它仍然发生

任何帮助都将不胜感激


如果您还想了解更多信息,请告诉我。

这里的问题是在某些像素上提取纹理的最低mip,显示为图片的平均值(灰色)。这是因为mip级别是基于纹理坐标的导数计算的,当纹理坐标是连续的(在屏幕空间中)时,纹理坐标起作用,这不是您的情况,因为您对每个像素进行模运算


您可以通过使用tex2Dgrad()并传递连续uv的导数,使用ddx()和ddy()

来解决这个问题。您是否尝试过在纹理导入设置中将包裹模式更改为“钳制”模式?是的,我尝试过,不幸的是,它仍然有相同的结果。尝试
I.uv.x=I.uv.x%(worldSizeModif-1)(与
uv.y
)相同。我甚至没有想到mipmap!谢谢你!!我没有使用你的解决方案,恕我冒犯,但坦率地说,我不认为我需要mip地图,因为这是一个自上而下的正交2d游戏。我刚刚在纹理设置中禁用了它们,瞧!固定的。请接受我的投票并接受答案,先生!
void Update()  {
    propBlock.SetFloatArray("_allIDs", new float[16] { 1, 1, 3, 2, 1, 1, 2, 2, 1, 3, 2, 1, 1, 2, 1, 1 });
    renderer.SetPropertyBlock(propBlock);
}