【问题标题】:Vertex Kaleidoscope shader顶点万花筒着色器
【发布时间】:2012-12-06 08:48:13
【问题描述】:

我正在尝试将片段着色器转换为顶点着色器(用于移动优化)

如下图所示,中心和右边缘的顶点有问题。 (这是一个有 11 x 11 个顶点的平面)

UV 当前从右侧映射,并环绕中心(径向旋转)。 我猜中间一半的多个顶点是创建一个洞的相同值? 然后右侧将第一个 UV 值交叉淡化为最终值,从而产生拉伸效果。

问题是如何覆盖或修复这些问题。 (它们可能是 2 个不同的问题?)

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    

【问题讨论】:

    标签: opengl-es opengl-es-2.0 glsl unity3d vertex-shader


    【解决方案1】:

    好的,基本上重写着色器我能够得到预期的结果。 并且给新手的建议:平面中的顶点数量越多,像素失真就越少。

    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 投票。
    • 嗯,依赖纹理坐标是什么意思?抱歉,我对此有点陌生。有没有更好的方法来获得平面上的归一化坐标?感谢 .xy 部分,没听懂。
    • 您不需要将位置发送过来;如果您所做的只是翻译它,您可以直接发送纹理坐标。这算作依赖读取:bit.ly/TWvCBI
    • "position" 包含万花筒计算。如果按像素计算,则需要更多计算。
    • 你认为我说的和我说的相反;我是说你在每个像素上做的太多了,而不是太少了。都在我的链接里。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多