Opengl es 顶点万花筒着色器

Opengl es 顶点万花筒着色器,opengl-es,opengl-es-2.0,glsl,unity3d,vertex-shader,Opengl Es,Opengl Es 2.0,Glsl,Unity3d,Vertex Shader,我正在尝试将片段着色器转换为顶点着色器(用于移动优化) 正如您在下图中所看到的,中心和右边缘的顶点是不规则的。(这是一个具有11 x 11个顶点的平面) UV当前从右侧映射,并围绕中心缠绕(径向旋转)。 我猜中间的多个顶点是同一个值,这会产生一个空洞吗? 然后,右侧将第一个UV值交叉淡入最终值,从而创建拉伸效果 问题是如何覆盖或修复这些问题。(它们可能是两个独立的问题?) 好的,基本上重写着色器,我能够得到预期的结果。 给新手的建议是:平面中的顶点数量越多,发生的像素失真就越小 GLSLPR

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

正如您在下图中所看到的,中心和右边缘的顶点是不规则的。(这是一个具有11 x 11个顶点的平面)

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

问题是如何覆盖或修复这些问题。(它们可能是两个独立的问题?)

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

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部分,我没听清楚。你不需要把位置传过来;如果您所做的只是转换纹理坐标,则可以直接发送纹理坐标。这算作一个独立的读数:“位置”包含万花筒计算。如果是按像素计算的话,那就需要更多的计算;我是说你每像素做的太多了,不是太少。一切都在我的链接上。
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