5

フラグメント シェーダーを頂点シェーダーに変換しようとしています (モバイル最適化のため)。

下の画像でわかるように、中央と右端の頂点がバグっています。(これは 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    
4

1 に答える 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            
于 2012-12-06T11:39:09.917 に答える