纹理,简单说就是将图片展示在物体表面。可以将其类比为墙纸。纹理分为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);
}
原文:https://www.cnblogs.com/david-china/p/14891855.html