Unity 万花筒顶点着色器

我正试图编译片段着色器到顶点着色器(为了移动优化)。
如下图所示,中心点右边缘不太好。(这是11*11顶点的平面)
UV目前是从右边映射的,径向旋转着围绕中心。
我猜想出现小孔的原因是不是因为多个顶点被赋予了相同的值。
然后右边从第一个UV值到最后的值交叉衰落,形成一个拉伸的效果。
怎样覆盖或者修复上述问题呢(好像是两个单独的问题)?
请输入图片描述

uniform vec2 _Offset;
uniform float _Multiply;
varying vec4 position;
varying vec4 vert;
varying vec2 tex;
varying vec2 uv;
varying float ar;
#ifdef VERTEX  
void main()
{          
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    vec2 p = -1.0 + 2.0 * tex.xy;
    float a = atan(p.y,p.x) ;
    float r = sqrt(dot(p,p));

    uv.x = _Multiply*a/3.1416 * 2.0 + 0.1;

    float sx = sin(_Multiply*r+_Offset.x);
    float sy = _Multiply*.1*cos(_Offset.y+_Multiply*a);
    uv.y = -_Offset.x + sx + sy;

}
#endif  

#ifdef FRAGMENT

uniform sampler2D _MainTex;
void main(void)
{

    gl_FragColor = texture2D(_MainTex,uv*.5);
}
#endif                          
ENDGLSL 

原问题:ertex Kaleidoscope shader

阅读 5.3k
1 个回答

答案:
miketucker
请输入图片描述
基本上重写了着色器后,我获得了所期望的结果。给新手的建议:在平面上顶点越多,像素失真的情况就越少发生。

GLSLPROGRAM                         
#ifdef VERTEX  
varying vec2 position;
uniform float _Multiply;
uniform vec2 _Offset;
void main()
{          
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    vec2 tex = vec2(gl_MultiTexCoord0);

    vec2 p = tex.xy - 0.5;
    float r = length(p);
    float a = atan(p.y, p.x);
    float sides = _Multiply;
    float tau = 2.0 * 3.1416;
    a = mod(a, tau/sides);
    a = abs(a - tau/sides/2.0);
    position = r * vec2(cos(a), sin(a)) + 0.5  + _Offset;
}
#endif  
#ifdef FRAGMENT
varying vec2 position;
uniform sampler2D _MainTex;
void main(void)
{
    gl_FragColor = texture2D(_MainTex, position);
}
#endif                          
ENDGLSL  
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
Stack Overflow 翻译
子站问答
访问
宣传栏