片段着色器glsl中的世界位置到屏幕位置

片段着色器glsl中的世界位置到屏幕位置,glsl,webgl,fragment-shader,coordinate-transformation,Glsl,Webgl,Fragment Shader,Coordinate Transformation,我有一个WebGL渲染器,我想在片段着色器中将随机世界坐标转换为屏幕坐标 这将允许我将计算的屏幕坐标与当前片段屏幕坐标进行比较 我相信我已经掌握了这样做所需的所有信息,只是不确定哪种方法是正确的 ... // available information: // uCanvasWidth (float) // uCanvasHeight (float) // modelMatrix (mat4) // modelViewMatrix (mat4) // project

我有一个WebGL渲染器,我想在片段着色器中将随机世界坐标转换为屏幕坐标

这将允许我将计算的屏幕坐标与当前片段屏幕坐标进行比较

我相信我已经掌握了这样做所需的所有信息,只是不确定哪种方法是正确的

  ...
  // 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
  }
  ...

请注意,modelView矩阵可能包含要渲染的模型的变换。我假设在着色器中指定的点被认为已经是最终世界空间,而不是相对于要渲染的模型,因此,您可能只想在此处使用视图矩阵,而更喜欢使用预乘的viewProjection。

我认为这将为您提供一个反转的screenSpace.y。它应该是screenSpace=ndx.xy*.5+.5*vec2viewportWidth、ViewPortHeight+vec2viewportLeft、viewportRight@gman是的,这可能是正确的,也是一个更通用的解决方案,但在我的情况下,我的视口与画布大小相同@gman是的,如果你的意思是+vec2viewportLeft,viewportTop,那么完整的视口变换就是这样的。
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;