高级纹理查询函数

本文详细介绍了纹理映射的基础知识,包括sampler与texture的关系、细节层次贴图(Mipmap)的工作原理及其在OpenGL中的应用。文章还探讨了不同纹理滤波模式的选择以及它们对图像质量的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值