【发布时间】:2016-03-03 02:31:33
【问题描述】:
vUv 和surfacePosition 有什么区别?
【问题讨论】:
-
我刚刚发布了对您的 GLSL 沙盒问题的回答,您可以将这个问题留在这里并将 ShaderToy 问题作为一个新帖子吗?
vUv 和surfacePosition 有什么区别?
【问题讨论】:
在 GLSL 沙盒中,varying vec2 surfacePosition 是可滚动、可缩放表面上的位置。在其默认位置,y 坐标范围从-1.0 到1.0,x 坐标具有类似的范围,已根据窗口的纵横比进行了缩放。
这在分形渲染器中很有用,允许用户平移和缩放分形。这是一个微不足道的曼德布罗集。点击左上角的“隐藏代码”按钮,然后鼠标左键平移,鼠标右键缩放。
http://glslsandbox.com/e#30483.0
uniform float time;
uniform vec2 mouse;
uniform vec2 resolution;
varying vec2 surfacePosition;
const float max_its = 100.;
float mandelbrot(vec2 z){
vec2 c = z;
for(float i=0.;i<max_its;i++){
if(dot(z,z)>4.) return i;
z = vec2(z.x*z.x-z.y*z.y,2.*z.x*z.y)+c;
}
return max_its;
}
void main( void ) {
vec2 p = surfacePosition;
gl_FragColor = vec4(mandelbrot(p)/max_its);
}
可以滥用相同的技术来提供 3D 平移和缩放。例如,这里是 Mandelbulb。它在你的 GPU 上比较重,但隐藏代码,你也可以平移和缩放它。
【讨论】:
vUv 不是 ShaderToy 本身的一部分,而是typical way to port ShaderToy samples to systems like Three.js 的一部分。用户可能希望使用模型的纹理坐标代替屏幕坐标 (gl_FragCoord.xy) 或surfacePosition 坐标。所以vUv代表模型自己的纹理坐标,用来代替屏幕或表面坐标。