HPP*_*HPP 1 opengl-es glsl texture2d opengl-es-3.0
我一直在浏览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 纹理的纹理坐标定义为 (0,0) 定义左下纹理元素的左下角,(1,1) 定义右上角像素的右上角。请注意,此定义意味着,当您想要在整数纹素坐标 (i,j) 的纹素中心位置精确采样且 0 <= i <= texWidth -1 且 0 <= j <= texHeight -1 时,您将得到使用纹理坐标( (i+0.5)/texWidth, (j+0.5) / texHeight )。
如果指定了 [0,1] 范围之外的纹理坐标,则使用纹理的环绕模式来确定如何将其映射到该范围。您基本上可以选择夹紧它们,或重复纹理(镜像和非镜像)。
或者它是否更复杂并且以某种方式在纹理属性中定义?
过滤和环绕模式是采样器状态的一部分。GLES 3 支持Sampler Objects,它允许您指定独立于纹理对象的采样器状态。在传统 GL 中,纹理对象确实包含采样器状态。采样器对象允许您选择覆盖该状态。
这里它指出“纹理坐标可以标准化或在纹素空间中”。但我对此表示怀疑,因为我没有看到任何地方可以将纹理设置为标准化。
嗯,这是指桌面 GL,而不是 GLES 3。您提供的链接实际上在您引用的段落之后解释了这一点。矩形纹理使用映射,其中 [0,width) x [0,height) 表示纹理坐标中的整个图像,而不是标准化的 [0,1] 范围。但在 ES3 中,不支持矩形纹理,因此这里无关紧要。
| 归档时间: |
|
| 查看次数: |
1262 次 |
| 最近记录: |