OpenGL 3.x / 4x 中的纹素/像素匹配
Posted
技术标签:
【中文标题】OpenGL 3.x / 4x 中的纹素/像素匹配【英文标题】:texel / pixel matching in OpenGL 3.x / 4x 【发布时间】:2018-11-30 17:07:08 【问题描述】:根据我所读到的像素中心约定,OpenGL 将像素的中心视为其半像素位置。这使得光栅化的像素中心“匹配”纹理中心的纹理。
所以,如果以下 4 个条件成立:
-
“世界” 坐标系“完全”匹配视口 分辨率(例如都是 1920x1080)
投影是正交的 (glm::ortho)
每个纹理的宽度/高度与由其相应四元数的顶点定义的匹配 1 到 1(纹素到像素)
UV [0,1] 用于纹理映射
然后:
纹理的纹素和视口的像素之间的匹配将是1-to-1?
不需要添加/减去任何校正 (+/-0.5) 吗?
关于如何检查它是否是一对一匹配的任何想法?
有什么提示吗?
【问题讨论】:
【参考方案1】:您可以在 glsl 中使用偏导数函数。 偏差分导函数。这些是片段着色器指令,可用于计算任何值相对于屏幕空间坐标的变化率。 这个任何值都可以是纹理坐标 所以
vec2 dx_vtc = dFdx(texture_coordinate); vec2 dy_vtc = dFdy(texture_coordinate);
float len1 = 长度(dx_vtc); float len2 = length(dy_vtc);
如果长度差为零,那么我们可以断定存在一对一映射。
【讨论】:
@Paritosh Kulkarni,非常有见地!!!在您的示例中,您使用的是 2 个纹理(纹理坐标),因此当您有纹理(texture coords.)和视口的顶点(顶点坐标。) ?还是同样的概念,但这次适用于顶点坐标和顶点坐标? 我认为您不需要视口顶点,因为您在这里考虑的两件事是纹理坐标和屏幕空间位置,这将是可用的。在片段着色器阶段作为模型视图投影的结果,然后是 NDC 转换和视口变换应用于顶点位置。因此,在具有导数函数的片段着色器中,您正在考虑纹理坐标相对于屏幕空间坐标的变化率,如果这是 0,我们表示它们彼此之间没有变化。我希望它清楚。 另外我没有使用两个纹理,我在相同纹理的纹理坐标上使用 x 方向的导数,在相同纹理的纹理坐标上使用 y 方向的导数。 @Paritosh Kulkarni,非常清楚!!!任何地方/文档,我可以在其中找到具有类似使用案例的示例? @Paritosh Kulkarni 明白了!感谢您的澄清。以上是关于OpenGL 3.x / 4x 中的纹素/像素匹配的主要内容,如果未能解决你的问题,请参考以下文章