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 中的纹素/像素匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何基于最大值而不是默认合并创建 mipmap?

OpenGL中纹素和屏幕像素之间的一对一映射

对纹素中心进行采样不会给出正确的结果,OpenGL,C++

在 OpenGL 中重复纹理

加载 bmp 图像 OPENGL 3.x - 只加载一个像素?

unity灯光渲染参数