纹理(QOpenGLTexture使用)

纹理,简单说就是将图片展示在物体表面。可以将其类比为墙纸。纹理分为1D,2D,  3D 三类。这里只讨论2D纹理。先要记录一下比较基本的概念。

一、纹理坐标
纹理坐标起始于(0, 0),也就是纹理图片的左下角,终始于(1, 1),即纹理图片的右上角。和数学二维坐标一样。

二、纹理创建
Qt提供方便的纹理类——QOpenGLTexture。它使纹理操作变得非常简单。这样就创建了一个纹理对象了。和创建QImage对象类似。不过要注意坐标系(纹理坐标与绘制设备坐标)的不同原因。所以需进行镜像操作。

m_texture = new QOpenGLTexture(QImage(":/images/side6.png").mirrored());
三、纹理映射与采样
就像贴墙纸一样,壁纸上的点要和墙面上点要对应起来。那就需要指定物体的每个顶点各自对应纹理的哪个部分。我们看到的壁纸上边有各种图案,图案实际是由每个颜色点组成。使用纹理坐标获取纹理颜色就是采样。

四、纹理过滤方式
这是s.t 两个坐标方向上的属性。暂时先记住结论性的一句话:“纹理被缩小的时候使用邻近过滤,被放大时使用线性过滤。”以后对它有深刻认识在深入讨论。

m_texture->setMinificationFilter(QOpenGLTexture::Nearest);
m_texture->setMagnificationFilter(QOpenGLTexture::Linear);
五、纹理的其他属性
纹理环绕方式,类似qss的border-img。通常设置为GL_REPEAT:

m_texture->setWrapMode(QOpenGLTexture::Repeat);


原文链接:https://blog.csdn.net/ypy9323/article/details/90552412

六、纹理初始化代码

void MainWidget::initTextures()
{
    //创建并加载纹理类,不过要注意坐标系(纹理坐标与绘制设备坐标)的不同原因,所以需进行镜像操作
    // Load cube.png image,
    texture = new QOpenGLTexture(QImage(":/cube.png").mirrored());

    //纹理的过滤方式,纹理被缩小的时候使用邻近过滤,被放大时使用线性过滤
    // Set nearest filtering mode for texture minification,
    texture->setMinificationFilter(QOpenGLTexture::Nearest);

    // Set bilinear filtering mode for texture magnification
    texture->setMagnificationFilter(QOpenGLTexture::Linear);

    //纹理的其他属性,环绕方式
    // Wrap texture coordinates by repeating
    // f.ex. texture coordinate (1.1, 1.2) is same as (0.1, 0.2)
    texture->setWrapMode(QOpenGLTexture::Repeat);
}

 

posted on 2021-06-17 08:37  斗战胜佛美猴王  阅读(1640)  评论(0编辑  收藏  举报