将 gl_FragCoord 坐标转换为屏幕位置
Convert gl_FragCoord coordinate to screen positions
我说的是严格意义上的 2d 环境(实际上这是针对 2d 游戏的)。
在片段着色器中,如何将 gl_FragCoord.x 和 gl_FragCoord.y 转换为屏幕坐标,以便左上角像素为 0, 0,右下角为屏幕分辨率(例如800、600)?谢谢
默认情况下,原点位于左下角,像素以半整数坐标为中心(左下角像素位于 (0.5, 0.5))。实现您想要的一种方法是使用布局限定符重新声明 gl_FragCoord
:
layout(origin_upper_left) in vec4 gl_FragCoord;
或
layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord;
如果您希望像素以整数坐标为中心。
另一种方法是在统一变量中传递屏幕分辨率并做一些数学运算:
vec2 pos = vec2(gl_FragCoord.x, resolution.y - gl_FragCoord.y);
或获取整数值:
vec2 pos = vec2(gl_FragCoord.x, resolution.y - gl_FragCoord.y) - 0.5;
请注意,如果您希望像素以整数坐标为中心,那么原点对角的像素将是 resolution - 1.0
而不是 resolution
。
我说的是严格意义上的 2d 环境(实际上这是针对 2d 游戏的)。
在片段着色器中,如何将 gl_FragCoord.x 和 gl_FragCoord.y 转换为屏幕坐标,以便左上角像素为 0, 0,右下角为屏幕分辨率(例如800、600)?谢谢
默认情况下,原点位于左下角,像素以半整数坐标为中心(左下角像素位于 (0.5, 0.5))。实现您想要的一种方法是使用布局限定符重新声明 gl_FragCoord
:
layout(origin_upper_left) in vec4 gl_FragCoord;
或
layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord;
如果您希望像素以整数坐标为中心。
另一种方法是在统一变量中传递屏幕分辨率并做一些数学运算:
vec2 pos = vec2(gl_FragCoord.x, resolution.y - gl_FragCoord.y);
或获取整数值:
vec2 pos = vec2(gl_FragCoord.x, resolution.y - gl_FragCoord.y) - 0.5;
请注意,如果您希望像素以整数坐标为中心,那么原点对角的像素将是 resolution - 1.0
而不是 resolution
。