高级纹理查询函数

来源:互联网 发布:java string转time 编辑:程序博客网 时间:2024/06/06 02:24

sampler ——-> texture
samplerBuffer —–>textelFetch
对于具有细节层次贴图的纹理 textureLod(gsmapler* tex, vec, float lod);//lod 为细节层次,显示控制细节层次。

计算mipmap级别
minMap:滤波后的图像存储为完整的低分辨率版本。
细节层级由像素和纹理中的纹素的比值决定的。
使用mipMap时候,opengl根据被映射对象的大小,自动决定使用纹理图的哪个分辨率层级。如果不使用mipMap,那么映射到更小图像上的纹理将随着物体的移动发生闪烁现象。
如果不想使用mipmap到1x1的纹理的所有变化,可以将GL_TEXTURE_MAX_LEVEL值设置为提供的最大级数。
更小的纹理的纹素是更高分辨率的纹理对应的4个纹素的加权的平均。

线性滤波是用坐标来从离散采样信号选择临近样本的技术。


genmipMap(){    glGenTextures(1, &_mipmapTex);    glBindTexture(GL_TEXTURE_2D, _mipmapTex);    glTexStorage2D(GL_TEXTURE_2D, 7, GL_RGBA8, 64, 64);    //生成具有64*64  7细节层次纹理 每个细节层次具有不同的颜色    unsigned int colors[] = { 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFF00, 0xFFFFFFFF };    int i, j;    unsigned int * data = new unsigned int[64 * 64];    for (i = 0; i < 7; i++)    {        for (j = 0; j < 64 * 64; j++)        {            data[j] = colors[i];        }        int nm = 64 >> i;        glTexSubImage2D(GL_TEXTURE_2D, i, 0, 0, 64 >> i, 64 >> i, GL_RGBA, GL_UNSIGNED_BYTE, data);    }    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, 4.5f);    // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);    delete[] data;}

颜色 红色 白色
Lod级数 0 1 2 3 4 5 6
分辨率 64 32 16 8 4 2 1
GL_TEXTURE_MAG_FILTER 程序默认的最大级数为0级,采样这个参数表明计算的mipmap的lod层级小于等于0级。 GL_NEAREST 表示禁止使用滤波,采用最临近像素值。GL_LINEAR 表示采用线性滤波技术。
纹理缩小也就是mipmap生效的地方。
随着对象离视点的距离变远,对象的大小(屏幕像素大小)变小,纹理被压缩。迫使最小滤波模式采用更高的lod层级。
这里写图片描述

GL_TEXTURE_MIN_FILTER 控制在mipmap级数大于0时候如何重建纹素。选择GL_NEAREST GL_LINEAR 将禁用Mipmap,使用Lod = 0 的纹理.
GL_NEAREST 效果
这里写图片描述

GL_NEAREST_MIPMAP_NEAREST {A}MIPMAP{B}
A表示每个细节层级纹理的滤波控制,B表示细节层级间的纹理滤波模式。
GL_NEAREST_MIPMAP_LINEAR
这里写图片描述
GL_NEAREST_MIPMAP_NEAREST
这里写图片描述

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
设置起作用的最大级数:这里级数为1,那么只能显示0 到1 级的纹理,也就是两种颜色。

这里写图片描述

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, 0.5f);
这里写图片描述

glGenerateMipmap 提供自动生成细节层次图,在质量和性能之间更多考虑性能方面。

比例因子ρ:纹理图像和纹理映射多边形大小的比例因子。
λ=lodbias+ρlog2

lodbias:采样器的细节层次偏移。GL_TEXTURE_LOD_BIAS

λ:为mipmap级别。

λbase(x,y)=log2[ρ(x,y)]

默认缩小滤波器启用mipmap。

直接使用最小层级纹理颜色:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 6);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_BASE_LEVEL, 6);
shader 中等价于:
outcolor0 = textureLod(mipmapTex,vs_fs_texCoord,6.0f);


显示梯度设置:
textureGrad(tex,p,dpx,dpy);
dTdx和dTdy的值是表示窗口的X和Y坐标的每个像素的每个纹理坐标的变化的向量。

Gradient texture access

Being able to bias the mipmap LOD or specify the specific mipmap to use is useful, but it is also useful to change the mipmap lod computation in more subtle ways. This function allows you to specify the two gradients for how the texture coordinates change locally:

gvec textureGrad(gsampler sampler​, vec texCoord​, gradvec dTdx​, gradvec dTdy​);

The type of gradvec​ is a float-vector with a number of components equal to the dimensionality of the sampler type. A 1D sampler uses a “float”, etc. Note that shadow sampler types do not add an additional coordinate to gradvec​, so a sampler2DShadow is still “vec2”.

This function works for sampler types that are not multisample, buffer texture, or cubemap array samplers, including those that do not have mipmaps (like sampler2DRect).

The values of dTdx​ and dTdy​ are vectors that represent the change of each texture coordinate per pixel of the window’s X and Y coordinates.

This function does not require implicit derivatives, since it provides them.

更多关于纹理映射相关参考:
https://t.xiaomiquan.com/QRjA2Fq

原创粉丝点击