顶点万花筒着色器

5
我正在尝试将片段着色器转换为顶点着色器(以进行移动端优化)。
如下图所示,中心和右侧边缘的顶点存在问题。(这是一个具有11 x 11个顶点平面)
UV目前从右侧映射,并绕中心旋转。我猜测中间一半的多个顶点具有相同的值,这可能会创建一个洞?
然后右侧会将第一个UV值淡化到最终值,从而创建拉伸效果。
问题是如何覆盖或修复它们。(它们可能是2个不同的问题?) kaleidoscope vertex shader
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    
1个回答

6

输入图像说明

好的,基本上重写着色器后我成功得到了期望的结果。对于新手的建议是:平面中顶点数量越多,像素失真就越少。

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            

使用vec2()然后.xy是多余的。使用依赖纹理坐标没有意义,对吧?在那里看到一些可读性强的变量名会很酷。为Unity中的GLSL点赞。 - user652038
嗯,你说的“依赖纹理坐标”是什么意思?抱歉,我对这个还不太了解。有没有更好的方法来获取平面上的归一化坐标?谢谢提到.xy部分,我没注意到。 - miketucker
如果您所做的只是将其平移,那么您不需要发送位置信息,可以直接发送纹理坐标。这算作依赖读取:http://bit.ly/TWvCBI - user652038
“position” 包含万花筒计算。如果每个像素都进行这种数学计算,那么需要进行更多的计算。 - miketucker
你认为我说了相反的话,但我是在说你每个像素做得太多了,而不是太少了。这一切都在我的链接里。 - user652038
好的,我已经阅读了链接,并将_Offset和0.5移动到顶点,如果这就是你所指的。 - miketucker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接