我已经看到这个伪随机数生成器用于在这里和那里引用的着色器:
float rand(vec2 co){
return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}
Run Code Online (Sandbox Code Playgroud)
它被称为"规范",或"我在网上找到的单行".
这个功能的起源是什么?恒定值是否像它们看起来一样任意或是否有一些艺术选择?有没有讨论这个功能的优点?
编辑:我遇到的这个函数最早的参考是从2008年2月开始的这个档案,原来的页面现在已经从网上消失了.但是那里没有比其他任何地方更多的讨论.
我正在努力让下一个简单的算法在三星Galaxy SIII中运行
float rand(vec2 co)
{
return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}
....
vec3 color = texture2D(u_texture, v_texcoord);
gl_FragColor.rgb = color + vec3(rand(gl_FragCoord.xy + time / 1000.0));
....
Run Code Online (Sandbox Code Playgroud)
该代码完美地生成了三星Galaxy S1和谷歌Nexus S的预期噪音.但它完全失败了使用ARM的Mali-400/MP4的新智能手机.
任何人都可以发现这个算法有什么问题?或者也许明白为什么会失败?
我正在尝试编写一个非常简单的着色器,它可以为适用的对象添加随机闪烁.我想这样做的方法是在像素着色器中为像素值添加一个白色的随机阴影(R = G = B).
它似乎noise()不像我希望的那样工作:
float multiplier = noise(float3(Input.Position[0], Input.Position[1], time));
Run Code Online (Sandbox Code Playgroud)
它给我"错误X4532:无法将表达式映射到像素着色器指令集",指的是调用noise().
由于我不知道在着色器调用之间保留数字的方法,我认为我不能只根据渲染前传入的种子编写一个简单的随机数生成函数.
有没有办法从像素着色器内部生成一个随机数?如果有办法,怎么样?
在GLSL规范,和大约GLSL其他来源,采样器类型是在3个维度可用的:sampler1D,sampler2D,和sampler3D.
但是当我尝试在Chrome中使用WebGL编译GLSL程序时(包括常规的,也包括Canary),sampler2D并且sampler3D被接受但是sampler1D给出了语法错误.码:
uniform sampler1D tex1;
Run Code Online (Sandbox Code Playgroud)
错误:
FS ERROR: ERROR: 0:9: 'sampler1D' : syntax error
Run Code Online (Sandbox Code Playgroud)
即使我给Canary命令行参数,也会发生此错误--use-gl=desktop.
我正在运行Chrome 12.0.742.68 beta-m和Canary 13.0.782.1.我拥有的芯片组是Nvidia Quadro NVS 160M.
是否有可能Nvidia允许2维和3维纹理采样器,而不是1D?我已经尝试搜索相关的信息,但没有找到任何东西.
我需要在GLSL版本120片段着色器中生成正态分布的伪随机数.
它们甚至不必是特别好的伪随机数.但它们确实需要正常分布.
我想如果我想编写自己的随机数发生器,我知道在哪里看,但我想看看是否已经发明了这样的东西.我还要感谢GLSL 120中统一分布的随机数生成器的任何链接.
作为一个注释,我已经看到了GLSL 的随机噪声生成问题.不幸的是,它看起来像单纯形和Perlin噪声有某种多模式分布.我想我可以使用mod函数,但我想知道是否有更合适的方法.
或任何同行?如何生成便宜的随机数?
我使用three.js调用片段着色器 - 该着色器为我的素材指定一种颜色,分解为rgb - 我想看看我是否可以将这些颜色乘以随机值.这是我到目前为止使用的代码:
gl_FragColor = vec4( color.r*.5, color.g, color.b, smoothstep( 8000.0, -8000.0, gl_FragCoord.z / gl_FragCoord.w ) ); //MH - creates colors by multiplying color values
Run Code Online (Sandbox Code Playgroud)
这就是我想要做的,如果它是javascript,但显然这在GLSL着色器脚本中不起作用:
gl_FragColor = vec4( color.r*Math.random(), color.g, color.b, smoothstep( 8000.0, -8000.0, gl_FragCoord.z / gl_FragCoord.w ) ); //MH - creates colors by multiplying color values
Run Code Online (Sandbox Code Playgroud)