在片段着色器glsl中筛选位置的世界位置

时间:2017-02-08 16:33:46

标签: glsl webgl fragment-shader coordinate-transformation

我有一个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
  }
  ...

1 个答案:

答案 0 :(得分:1)

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 "世界空间(与您正在渲染的模型无关),因此您可能只想在此处使用view矩阵(最好是预乘的viewProjection)。