opengl进阶技巧(三)Sampler介绍

采样器是OpenGL 3.3中加入的特性。
在此之前,当你使用同一张纹理但过滤方式不同时,你需要创建两个不同的纹理对象,然后分别设置不同的过滤。 使用采样器之后,你可以将过滤等属性设置绑定到一个特定的采样器上,然后在使用纹理时,绑定与相应的采样器绑定即可。

在纹理映射过程中,纹理元素与屏幕上的像素几乎不是一一对应的。一般情况下,在把纹理映射到几何图形的表面上时,我们需要对其进行拉伸或收缩。对一个纹理贴图的拉伸或收缩来计算颜色片段的过程称为纹理过滤。

采样器对象描述了读取图像数据时如何对图像进行采样。图像读取函数 read_imageX 包含一个采样器参数,该参数可以在主机端通过调用 OpenCL API 函数创建,然后使用 clSetKernelArg 传递给内核;也可以在内核程序中声明,在内核程序中声明的采样器对象为 sampler_t 类型的常量。采样器对象包含了一些属性,这些属性描述了在读取图像对象的像素时如何采样。分别是规格化浮点坐标,寻址模式和过滤模式。

规格化坐标:指定传递的 x、y 和 z 坐标值是规格化浮点坐标还是非规格化坐标值。可以是 CLK_NORMALIZED_COORDS_TRUE 或者 CLK_NORMALIZED_COORDS_FALSE 枚举类型的值;
寻址模式:指定图像的寻址模式。即,当传递的坐标值超过图像坐标区域时该如何处理。可以是下面的枚举类型的值:
CLK_ADDRESS_MIRRORED_REPEAT:图像区域外的坐标设置为区域内坐标的反射值对应的颜色;
CLK_ADDRESS_REPEAT:图像区域外的坐标重复区域内坐标的颜色,只对规格化坐标有效;
CLK_ADDRESS_CLAMP_TO_EDGE:图像区域外的坐标返回图像边缘的颜色;
CLK_ADDRESS_CLAMP:图像区域外坐标返回的颜色和边框颜色保持一致;
过滤模式:指定使用的过滤模式。可以是 CLK_FILTER_NEAREST 或 CLK_FILTER_LINEAR 枚举类型值,分别表示最近邻插值和双线性插值。

在OpenGL3.3中先加入了采样器对象( sampler object ),记得以前做OpenGL程序的时候,有时会遇到需要相同的纹理数据只是filter模式不同而已,但当时由于不支持多个不同属性集共享同一个纹理对象,因此必须分别建立2个不同的纹理对象(当然使多个纹理对象共享同一个pixel buffer来达到此目的),显得很笨拙和浪费。新加入的采样器对象就使这个工作变得容易且合乎逻辑和直觉的“美感”

一个采样器对象实际上时定义了诸如过滤,寻址模式等属性,但不包括纹理的宽度和高度。之所以这样也是想当然的,因为通常采样器可以为多个纹理对象共享,当这些纹理对象的纹理内存尺寸不同时也不会造成歧义。

例如下列片元着色器的代码,texture的意思就是指定需要使用的Sampler与纹理。

//片元着色器代码
#version 330 core

out vec4 FragColor;

in vec3 ourColor;
in vec2 TexCoord;

uniform sampler2D ourTexture;

void main()
{
    FragColor = texture(ourTexture, TexCoord);  //对纹理指定位置进行采样
}

http://rungame.me/blog/2014/09/11/opengl-samplers/

https://open.gl/textures

https://www.jianshu.com/p/1b327789220d

https://www.khronos.org/opengl/wiki/Sampler_(GLSL)

发布了194 篇原创文章 · 获赞 8 · 访问量 9859

猜你喜欢

转载自blog.csdn.net/qq_43439240/article/details/104232930
今日推荐