CAM*_*BAP 4 glsl android-ndk opengl-es-2.0
我试图编译程序(我以前从Cg语言中移植它).片段着色器是
precision mediump float;
precision mediump int;
uniform float time;
uniform float aspect;
uniform sampler2D sampler_main;
varying vec4 v_texCoord;
void main()
{
vec3 ret;
vec2 uv = v_texCoord.xy;
float rad=sqrt((uv.x-0.5)*(uv.x-0.5)*4.0+(uv.y-0.5)*(uv.y-0.5)*4.0)*.7071067;
float ang=atan(((uv.y-0.5)*2.0),((uv.x-0.5)*2.0));
vec2 uv1 = (uv-0.5)*aspect.xy;
float rad1 = .1/(length(uv1) + .1)) ;
vec2 uv2 = vec2 (ang/3.14, rad1);
uv2.y = uv2.y +0.1*time;
uv2.x = uv2.x +.0*time;
vec2 uv3 = vec2 (ang/3.14, rad1*1.5);
uv3.y = uv3.y + 0.08*time ;
uv3.x = uv3.x + time/32;
vec3 crisp = 2*texture2D(sampler_main, uv2).xyz;
vec3 lay1 = vec3 (0,0,1)*uv.y*pow(1-rad,8);
crisp = 3*crisp * pow(rad,1);
float mask = saturate(1-4*rad);
ret = crisp + lay1*mask + mask * texture2D(sampler_main, uv).xyz;
gl_FragColor.xyz = ret;
gl_FragColor.w = 1.0;
}
Run Code Online (Sandbox Code Playgroud)
我在网上得到了错误
uv3.x = uv3.x + time/32;
Run Code Online (Sandbox Code Playgroud)
当我改为
uv3.x = uv3.x + time/32.0;
Run Code Online (Sandbox Code Playgroud)
问题解决了,但我不明白问题的根源.
这条线的问题一样
float mask = saturate(1-4*rad); => float mask = saturate(1.0-4.0*rad);
vec3 crisp = 2*texture2D(sampler_main, uv2).xyz; => vec3 crisp = 2.0*texture2D(sampler_main, uv2).xyz;
vec3 lay1 = vec3 (0,0,1)*uv.y*pow(1-rad,8); => vec3 lay1 = vec3 (0,0,1)*uv.y*pow(1.0-rad,8.0);
crisp = 3*crisp * pow(rad,1); => crisp = 3.0*crisp * pow(rad,1.0);
Run Code Online (Sandbox Code Playgroud)
有人能解释一下:
早期GLSL不允许隐式演员表演.所以尝试一个明确的演员:
uv3.x = uv3.x + time/float(32);
Run Code Online (Sandbox Code Playgroud)
该GLSL 1.1规格说,在第4章(第16页):
OpenGL着色语言是类型安全的.类型之间没有隐式转换
最近的GLSL允许隐式类型转换.该GLSL 4.4规格说,在第4章(第25页):
OpenGL着色语言是类型安全的.类型之间存在一些隐式转换.具体如何以及何时发生这种情况将在4.1.10"隐式转换"一节中描述,并在本说明书的其他章节中引用.
稍后从第39页开始,有一个可能的隐式转换列表.
| 归档时间: |
|
| 查看次数: |
3278 次 |
| 最近记录: |