微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

着色器问题

如何解决着色器问题

[在此处输入图片说明][1]

错误对齐 [1]:https://i.stack.imgur.com/LvzS1.png

我在使用着色器时遇到了一些问题。我正在制作一个带有大型六边形图块的游戏。我正在使用着色器来确定每个十六进制的 UV 坐标。

基本上,我创建了一个与我的地图尺寸相同的“计算图像”。如果是 50 x 50 十六进制,则计算图像将为 50 x 50 像素。然后我将每个像素的颜色设置为 (x,y,0),其中 x 和 y 是图集中相应十六进制的中心坐标。

我将网格中的每个顶点颜色设置为 (r,g,b,a),其中 r 和 g 是该顶点所属的六边形坐标,(因此第一个六边形将为 (0,0), etc) 和 (b,a) 是这个顶点到六边形中心的偏移量。

然后我使用以下着色器从计算图像中读取每一帧并相应地设置片段颜色:

shader_type canvas_item;
uniform sampler2D computeTexture; 
uniform float atlasHeight;
void vertex()
{
    vec2 computeTextureCoords = vec2(COLOR.r,COLOR.g);
    vec4 samplePoint4 = texture(computeTexture,computeTextureCoords);
    vec2 samplePoint = vec2(samplePoint4.r,samplePoint4.g);
    
    vec2 offset = vec2(COLOR.b,COLOR.a);
    UV = vec2(samplePoint.x / atlasHeight,samplePoint.y / atlasHeight) + offset;
}
void fragment()
{
    COLOR = texture(TEXTURE,UV);
}

然后可以实时更改计算图像以更新纹理,而无需重建整个网格。

我让整个系统运行良好,除了一个关键方面。只要所有的六边形都设置为相同的纹理,它就会顺利进行,但是当计算图像中有两种不同的颜色彼此相邻时,采样基本上被破坏了。上面着色器中返回的“samplePoint4”是两种不同颜色的插值,而不是我尝试访问的像素的实际颜色。这意味着当不同的地形彼此相邻时,图形叠加就不合适了。我附上了一张图片,希望能更好地说明这意味着什么。

尽管我努力通过向 ​​(r,g) 添加适当的偏移量来采样像素的“中心”而不是边缘,但还是会发生这种情况。我尝试让计算纹理在每个十六进制的正方形中使用 9 个像素,然后对中心像素进行采样,但问题并未由此解决

这是着色器中浮点精度的不可避免的限制,还是有办法在从计算纹理采样时避免这种混合?非常感谢您对此的任何帮助

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。