我一直在查看OpenGLSL ES 3.0 Spec,但我找不到任何关于内置函数如何texture(sampler, p)
定义 P 的信息。我知道它是一个vec2
.
它是 0.0 到 1.0 之间的归一化浮点数,定义了从左上角到按钮右侧的缩放器吗?
还是像函数一样从 0 到尺寸减 1 的纹素查找texelFetch()
?
或者它是否更复杂并以某种方式在纹理属性中定义?这里它指出“纹理坐标可以被归一化或在纹素空间中。” 但我持怀疑态度,因为我没有看到任何将纹理设置为标准化的地方。
我一直在查看OpenGLSL ES 3.0 Spec,但我找不到任何关于内置函数如何texture(sampler, p)
定义 P 的信息。我知道它是一个vec2
.
它是 0.0 到 1.0 之间的归一化浮点数,定义了从左上角到按钮右侧的缩放器吗?
还是像函数一样从 0 到尺寸减 1 的纹素查找texelFetch()
?
或者它是否更复杂并以某种方式在纹理属性中定义?这里它指出“纹理坐标可以被归一化或在纹素空间中。” 但我持怀疑态度,因为我没有看到任何将纹理设置为标准化的地方。
正如您已经注意到的,texelFetch()
函数族通过指定图像数据的实际整数纹素坐标访问特定纹素。
相比之下,用于texture()
GLSL 函数系列的纹理坐标与实际纹理坐标之间的映射要复杂一些。
首先,纹理坐标被定义为浮点,从概念上讲,采样纹理表示评估连续的1-、2- 或 3D- 函数,而不是访问离散数组。过滤器模式当然定义了在纹理本身提供的数据点之间进行采样时获得的值。您应该知道,第一个区别是,在一般情况下,对纹理进行采样并不意味着处理单个纹素,而是使用多个纹素,以及过滤器模式(以及其他情况,如屏幕空间导数) tex coords) 定义在操作过程中必须提取哪些纹素。
“普通”2D 纹理的 texcoords 定义为,(0,0) 定义左下角纹理像素的左下角,(1,1) 定义右上角像素的右上角。请注意,此定义意味着当您想要在 0 <= i <= texWidth -1 和 0 <= j <= texHeight -1 的整数 texel 坐标 (i,j) 的 texel 中心位置精确采样时,您将拥有使用纹理坐标( (i+0.5)/texWidth, (j+0.5) / texHeight )。
如果指定了 [0,1] 范围之外的纹理坐标,则使用纹理的环绕模式来确定如何将其映射到该范围。您基本上可以选择夹住它们,或重复纹理(镜像而不镜像)。
或者它是否更复杂并以某种方式在纹理属性中定义?
过滤器和环绕模式是采样器状态的一部分。GLES 3 支持采样器对象,它允许您指定独立于纹理对象的采样器状态。在传统的 GL 中,纹理对象确实包含采样器状态。采样器对象允许您选择性地覆盖该状态。
这里它指出“纹理坐标可以被归一化或在纹素空间中。” 但我持怀疑态度,因为我没有看到任何将纹理设置为标准化的地方。
好吧,这是指桌面 GL,而不是 GLES 3。您提供的链接实际上在您引用的段落之后解释了这一点。矩形纹理使用映射,其中 [0,width) x [0,height) 表示纹理坐标中的整个图像,而不是标准化的 [0,1] 范围。但在 ES3 中,不支持矩形纹理,因此这里无关紧要。