OpenGL 中的纹素/像素匹配 3.x / 4x
texel / pixel matching in OpenGL 3.x / 4x
根据我读到的像素中心约定,OpenGL 认为像素的中心位于其 半像素位置 。这使得光栅化的像素中心 "match" 纹理中心的纹理。
所以,如果满足以下4个条件:
- "world" 坐标系 "exactly" 与 视口 分辨率匹配(例如均为 1920x1080)
- 投影是正交 (glm::ortho)
- 每个 纹理的 width/height 匹配 1 到 1(纹素到像素)由其对应的四元数顶点定义的纹理
- UV [0,1] 用于纹理映射
然后:
纹理纹素和视口像素之间的匹配将为 1 对 1 ?
不需要add/subtract任何修正(+/-0.5)?
知道如何检查它是否是 1 对 1 匹配吗?
有什么提示吗?
您可以在 glsl 中使用偏导函数。
偏差导数 functions.These 是片段着色器指令,可用于计算任何值相对于屏幕-space 坐标的变化率。
这个任何值都可以是纹理坐标
所以
vec2 dx_vtc = dFdx(texture_coordinate);
vec2 dy_vtc = dFdy(texture_coordinate);
浮动 len1 = 长度(dx_vtc);
float len2 = 长度(dy_vtc);
如果长度差为零,那么我们可以断定存在一对一映射。
根据我读到的像素中心约定,OpenGL 认为像素的中心位于其 半像素位置 。这使得光栅化的像素中心 "match" 纹理中心的纹理。
所以,如果满足以下4个条件:
- "world" 坐标系 "exactly" 与 视口 分辨率匹配(例如均为 1920x1080)
- 投影是正交 (glm::ortho)
- 每个 纹理的 width/height 匹配 1 到 1(纹素到像素)由其对应的四元数顶点定义的纹理
- UV [0,1] 用于纹理映射
然后:
纹理纹素和视口像素之间的匹配将为 1 对 1 ?
不需要add/subtract任何修正(+/-0.5)?
知道如何检查它是否是 1 对 1 匹配吗?
有什么提示吗?
您可以在 glsl 中使用偏导函数。 偏差导数 functions.These 是片段着色器指令,可用于计算任何值相对于屏幕-space 坐标的变化率。 这个任何值都可以是纹理坐标 所以
vec2 dx_vtc = dFdx(texture_coordinate); vec2 dy_vtc = dFdy(texture_coordinate);
浮动 len1 = 长度(dx_vtc); float len2 = 长度(dy_vtc);
如果长度差为零,那么我们可以断定存在一对一映射。