什么是纹理sampler2d查找GLSL中的纹理坐标P.

时间:2015-07-11 18:27:20

标签: opengl-es glsl texture2d opengl-es-3.0

我一直在浏览OpenGLSL ES 3.0 Spec,但我无法找到内置函数texture(sampler, p)如何定义P的任何内容。我知道它是{{1} }}

它是0.0和1.0之间的标准化浮点,定义了从左上角到右侧按钮的缩放器吗?

或者是像vec2函数一样从0到维度大小减去1的纹素?

或者它是否更复杂并且以某种方式在纹理属性中定义? Here它表示"纹理坐标可以标准化或在纹素空间中。"但我持怀疑态度,因为我没有看到任何将纹理设定为正常化的地方。

1 个答案:

答案 0 :(得分:3)

正如您已经指出的那样,texelFetch()系列函数通过指定图像数据的实际整数纹理坐标访问特定纹素。

相比之下,用于GLSL函数texture()族的纹理坐标与实际纹素坐标之间的映射有点复杂。

首先,纹理坐标定义为浮点,概念上,采样纹理表示评估连续 1,2-或3D-函数,而不是访问离散数组。 过滤模式当然定义了在纹理本身提供的数据点之间进行采样时得到的值。你应该知道,第一个区别是在一般情况下对纹理进行采样并不意味着单个纹素被寻址,而是使用多个纹素,以及过滤模式(以及其他情况,如屏幕空间衍生物) tex coords)定义了在操作过程中必须使用哪些纹素。

"普通"的texcoords定义2D纹理使得(0,0)定义左下纹素的左下,以及(1,1)右上像素的右上角。请注意,此定义意味着当您想要在纹素中心位置精确地采样整数纹理坐标(i,j)时0< = i< = texWidth -1且0< = j< = texHeight -1 ,你将不得不使用纹理坐标((i + 0.5)/ texWidth,(j + 0.5)/ texHeight)。

如果指定了[0,1]范围之外的纹理坐标,则纹理的包裹模式用于确定如何将其映射到范围。你基本上可以选择钳制它们,或者重复纹理(镜像而不是镜像)。

  

或者它是否更复杂并且以某种方式在纹理属性中定义?

过滤器和环绕模式是 sampler 状态的一部分。 GLES 3支持Sampler Objects,它允许您指定独立于纹理对象的采样器状态。在传统的GL中,纹理对象确实包含采样器状态。采样器对象允许您可选地覆盖该状态。

  

Here它表示"纹理坐标可以标准化或在纹素空间中。"但我持怀疑态度,因为我没有看到任何将纹理设定为正常化的地方。

嗯,这是指桌面GL,而不是GLES 3.您提供的链接实际上是在您搜索的paraghaph之后解释的。矩形纹理使用映射,其中[0,宽度] x [0,高度]表示纹理坐标中的整个图像,而不是标准化的[0,1]范围。但是在ES3中,不支持矩形纹理,因此这里无关紧要。

相关问题