我有一个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
}
...
答案 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
)。