世界位置到片段着色器 glsl 中的屏幕位置
world position to screen position in fragment shader glsl
我有一个 WebGL 渲染器,我想在片段着色器中将随机世界坐标转换为屏幕坐标。
这样我就可以将 "computed screen coordinates" 与当前片段屏幕坐标进行比较。
我相信我拥有这样做所需的所有信息,只是不确定哪种方法是正确的。
...
// available information:
// uCanvasWidth (float)
// uCanvasHeight (float)
// modelMatrix (mat4)
// modelViewMatrix (mat4)
// projectionMatrix (mat4)
vec4 someWorldCoordinates = vec4(1., 2., 3., 1.);
// map it to screen coordinates?
vec4 screenCoordinates = ???
// compare to current fragment location
if(screenCoordinates.x > gl_FragCoord.x){
// do stuff
}
...
vec4 worldSpace = vec4(1., 2., 3., 1.);
// get homogeneous clip space coordinates
vec4 clipSpace = projectionMatrix * ( modelViewMatrix * worldCoords );
// apply perspective divide to get normalized device coordinates
vec3 ndc = clipSpace.xyz / clipSpace.w;
// do viewport transform
vec2 screenSpace = (ndc.xy * .5 + .5) * vec2(uCanvasWidth, uCanvasHeight);
screenSpace.y = uCanvasHeight - screenSpace.y;
请注意,您的 modelView
矩阵可能包含您正在渲染的模型的 变换 。我假设在着色器中指定的点被认为已经是“final”世界space(因为与你正在渲染的模型无关),所以你可能只想在这里使用 view
矩阵(最好是预乘 viewProjection
)。
我有一个 WebGL 渲染器,我想在片段着色器中将随机世界坐标转换为屏幕坐标。
这样我就可以将 "computed screen coordinates" 与当前片段屏幕坐标进行比较。
我相信我拥有这样做所需的所有信息,只是不确定哪种方法是正确的。
...
// available information:
// uCanvasWidth (float)
// uCanvasHeight (float)
// modelMatrix (mat4)
// modelViewMatrix (mat4)
// projectionMatrix (mat4)
vec4 someWorldCoordinates = vec4(1., 2., 3., 1.);
// map it to screen coordinates?
vec4 screenCoordinates = ???
// compare to current fragment location
if(screenCoordinates.x > gl_FragCoord.x){
// do stuff
}
...
vec4 worldSpace = vec4(1., 2., 3., 1.);
// get homogeneous clip space coordinates
vec4 clipSpace = projectionMatrix * ( modelViewMatrix * worldCoords );
// apply perspective divide to get normalized device coordinates
vec3 ndc = clipSpace.xyz / clipSpace.w;
// do viewport transform
vec2 screenSpace = (ndc.xy * .5 + .5) * vec2(uCanvasWidth, uCanvasHeight);
screenSpace.y = uCanvasHeight - screenSpace.y;
请注意,您的 modelView
矩阵可能包含您正在渲染的模型的 变换 。我假设在着色器中指定的点被认为已经是“final”世界space(因为与你正在渲染的模型无关),所以你可能只想在这里使用 view
矩阵(最好是预乘 viewProjection
)。