OpenGL系列(五)纹理贴图

news2024/11/26 4:39:57

概述

    OpenGL纹理是一种在三维图形中应用纹理映射的技术。纹理是一张图像,可以应用到三维模型的表面上,从而使得模型看起来更加真实和具有细节。通过纹理映射,可以将图像的像素值与三维模型的顶点进行匹配,从而为模型的表面增加细节和图案。

    OpenGL提供了一套用于加载、创建和使用纹理的API,使得纹理映射变得简单和高效。在OpenGL中,纹理被存储在纹理缓冲区中,并通过纹理坐标来进行访问。纹理坐标是一个二维向量,范围在[0,1]之间,用于映射纹理的像素值。

    为了应用纹理映射,需要先加载纹理图像并将其传输到OpenGL的纹理缓冲区中。然后,可以在绘制三维模型之前,将纹理坐标与模型的顶点进行匹配,并通过纹理坐标在纹理缓冲区中获取相应的像素值。最后,将像素值应用到模型的表面上,从而实现纹理映射。

OpenGL还提供了一些纹理过滤和纹理环绕的选项,用于控制纹理在放大和缩小时的插值和边界处理。这些选项可以改善纹理映射的质量和效果,使得纹理在不同大小和角度下都能正确显示。

总的来说,OpenGL纹理是一种强大的技术,可以为三维模型增加细节和图案,并提升图形渲染的质量和真实感。通过合理的纹理映射和纹理处理,可以使得模型在视觉上更加吸引人和逼真。

示例

    接下来通过一个简单的示例来介绍如何使用纹理贴图将一张图片映射到一个矩形中,效果如下图所示。

    在上图中,中间是一个矩形,在该矩形中显示的图片,下面分步介绍如何实现上面的效果。

1、创建纹理对象 

    要使用纹理,首先要创建纹理对象,代码如下。

    mTexture = 0;
    glGenTextures(1, &mTexture);
    glBindTexture(GL_TEXTURE_2D, mTexture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

 创建纹理过程解析如下。

1)创建纹理对象:glGenTextures用于创建纹理对象,1表示创建一个纹理对象,成功后纹理对象的句柄保存到tex中。

2)绑定纹理对象:glBindTexture用于绑定纹理对象到纹理目标GL_TEXTURE_2D,绑定后对目标的操作会影响到被绑定的纹理对象。

3)设置参数:glTexParameterf用于设置纹理参数。参数GL_TEXTURE_WRAP_S设置为GL_CLAMP_TO_EDGE表示S方向超出范围[0.0,1.0]时使用边界的颜色,同样参数GL_TEXTURE_WRAP_T也设置为GL_CLAMP_TO_EDGE表示T方向超出范围[0.0,1.0]时使用边界的颜色。参数GL_TEXTURE_MIN_FILTER和GL_TEXTURE_MAG_FILTER都设置为GL_LINEAR表示纹理缩小和放大的过滤方式都是线性插值。

2、载入图片数据

    创建纹理对象后,接下来向该对象载入图片数据,流程如下。

    AAsset *pathAsset = AAssetManager_open(assetManager,path.c_str(), AASSET_MODE_BUFFER);
    unsigned char *filedata = (unsigned char *) AAsset_getBuffer(pathAsset);
    off_t assetLength = AAsset_getLength(pathAsset);
    stbi_set_flip_vertically_on_load(true);
    unsigned char *data = stbi_load_from_memory(filedata, assetLength,&w,&h,&n,0);
    if(data != nullptr){
        GLint format = GL_RGB;
        if(n == 4) format = GL_RGBA;

        glTexImage2D(GL_TEXTURE_2D,0, format, w,h,0,format,GL_UNSIGNED_BYTE, data);
        glGenerateMipmap(GL_TEXTURE_2D);
    }

载入图片数据流程解析如下

1)AAssetManager_open打开assets目录的图片文件

2)AAsset_getBuffer获取图片文件的缓冲

3)stbi_load_from_memory将图片缓冲解吗得到图片数据

4)glTexImage2D向纹理对象载入图片数据

5)glGenerateMipmap生成多级渐远纹理

3、绑定纹理单元

    纹理对象要绑定到特定的纹理单元,采样器才能采样,绑定方法如下

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, mTexture);

    这里把纹理对象绑定到0号纹理单元。

4、编写着色器

    纹理贴图的着色器如下。

    std::string strVs = R"(
#version 300 es
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoord;

out vec2 vTexCoord;

void main()
{
    gl_Position = vec4(aPos, 1.0);
    vTexCoord = aTexCoord;
}
)";

    std::string strFs = R"(
#version 300 es
precision mediump float;
out vec4 FragColor;
in vec2 vTexCoord;
uniform sampler2D sampler;
void main()
{
    FragColor = texture(sampler, vTexCoord);
}
)";

    在顶点着色器中,有两个顶点属性,0号属性aPos表示顶点位置,1号属性aTexCoord表示纹理坐标。

    在片元着色器中,vTexCoord是纹理坐标,sampler是纹理采样器,在main方法中调用采样函数texture对纹理进行采样,采样结果输出到FragColor。

5、开始绘制

    绘制纹理的流程如下所示。

    mShader->setInt("sampler",0);

    glClear(GL_COLOR_BUFFER_BIT);
    glClearColor(0.5f,0.6f,0.7f,1.0f);
    glBindVertexArray(VAO);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

绘制流程解析如下:

mShader->setInt("sampler",0); 知会着色器的采样器到几号纹理单元采样,0表示0号纹理单元。

glBindVertexArray(VAO);绑定VAO,有了VAO才知道如何取得顶点数据。

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); 绑定索引数据

glDrawElements开始绘制,由于已经绑定了索引数据,所以最后的参数无须传索引数据的首地址。

6、工程地址

    本示例已经上传到github,地址如下。

示例工程地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1797162.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6ull--系统移植(U-Boot、内核kernel、根文件系统rootfs)

1、摘要 版本型号:ubuntu18.04 ARM板型号:imx6ull-emmc-8g核心板 要在Linux内核中进行驱动的编写,因此要找到kernel源码,适配内核kernel到板子上。 本文主要记录对imx6ull进行系统移植 U-Boot是官方自带的,没…

X86+FPGA方案:铁路货车装载视频智能监视系统应用

如果说高铁技术的问世开启了铁路运输的“速度革命”,那么人工智能技术的应用则将造就铁路出行的“智能革命”。铁路是国民经济的大动脉,铁路运输安全不仅影响铁路本身的效率和效益,更直接影响了整个社会的生产生活和稳定和谐。铁路货物运输是…

【笔记】1/4被动悬架垂向动力学仿真+频域特性分析

1/4被动悬架 代码: %书第156页、159页 clc clear close all %% 一.悬架参数 ms320; mw50; Ks22000; Cs1500; Kw195000; f00.07; %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% 二.垂向振动动力学仿真 %% 二.1.状态方程 A [0 1 0 -1;.…

LlamaIndex三 配置

前言 在上篇LlamIndex二 RAG应用开发 - 掘金 (juejin.cn)中,我们学习到LlamaIndex对RAG的全面支持。这篇文章,我们就来细化这个过程,尝试各种配置选项,满足不同场景需求。学习过后,大家再开发RAG应用,会更…

数据库优化sql的方案

一: 插入数据的优化 1.insert 如果我们需要一次性往数据库表中插入多条记录,可以从以下三个方面进行优化 优化方案一 批量插入数据 Insert into tb_test values(1,Tom),(2,Cat),(3,Jerry); 优化方案二 start transaction; insert into tb_test values(…

qwen2 vllm推理部署;openai接口调用

参考: https://qwenlm.github.io/zh/blog/qwen2/ 下载 https://huggingface.co/Qwen 下载的Qwen2-7B-Instruct使用: export HF_ENDPOINT=https://hf-mirror.comhuggingface-cli download --resume-download --local-dir-use-symlinks False Qwen/Qwen2-7B-Instruct

webpack 优化构建速度的插件

1.HardSourceWebpackPlugin本地缓存 HardSourceWebpackPlugin这个插件比DLL动态链接库更优秀 HardSourceWebpackPlugin是webpack的插件,为模块提供中间缓存步骤。为了查看结果,您需要使用此插件运行webpack两次:第一次构建将花费正常的时间…

mysql中事务的简介

大家好。我们在日常开发过程中肯定都或多或少的用到过事务,而且在面试时,数据库的事务也是必问内容之一。今天我们就来说说mysql的事务。 为了方便我们下面内容的讲解,我们也先建立一个讲事务必用的表–account表,并在表中插入两…

zoomeye api报错 request invalid, validate usage and try again

项目场景: 调用zoomeye的api接口进行数据拿取 问题描述 之前接口一直通着今天突然报错,以下为源代码 pip install zoomeye from zoomeye.sdk import ZoomEye zm ZoomEye(api_key"34A8B452-D874-C63E0-8471-F3D4f89766f") zm.dork_search(a…

Python 将CSV文件转为PDF文件

CSV文件通常用于存储大量的数据,而PDF文件则是一种通用的文档格式,便于与他人共享和打印。将CSV文件转换成PDF文件可以帮助我们更好地管理和展示数据。本文将介绍如何通过Python编程将CSV文件导出为PDF文件。 Python Excel库安装及介绍 在 Python 中&am…

《手把手教你》系列练习篇之12-python+ selenium自动化测试(详细教程)

1. 简介 前面文章我们了解了如何获取元素的text属性值,和判断元素是否显示在页面(is_displayed()方法),本文我们来学习下,判断一个控件是否被选中状态、获取页面元素的大小、组合键-全选文字、组合键-退格键删除文本和…

农业乡村振兴,绿意盎然谱新篇

乡村振兴,不仅是经济的繁荣,更是文化的传承和生态的保护。让我们以更加饱满的热情,投身到乡村建设中来,助力农业现代化,提升农村居民生活品质。 农业乡村振兴的吴总说:在这片热土上,农业承载着国…

简单聊聊大数据分析的方法有什么

大数据分析是指对规模巨大的数据集合进行的分析过程。 这些数据集合通常具有以下几个特点,可以概括为5个V: 1.数据量大(Volume):大数据分析处理的数据量巨大,远远超出了传统数据处理软件的能力范围。 2.…

Diffusers代码学习: IP-Adapter

从操作的角度来看,IP-Adapter和图生图是很相似的,都是有一个原始的图片,加上提示词,生成目标图片。但它们的底层实现方式是完全不一样的,我们通过源码解读来看一下。以下是ip adapter的实现方式 # 以下代码为程序运行…

语音降噪算法库介绍

一.语音降噪技术方向介绍 软件上进行语音降噪目前主要是两个方向:传统降噪算法和AI降噪算法,他们各有千秋,目前看他们各有千秋,有各自适用场景。 推荐一个不错的人工智能学习网站,通俗易懂,内容全面&#…

【Python报错】已解决AttributeError: list object has no attribute items ( Solved )

解决Python报错:AttributeError: list object has no attribute ‘items’ (Solved) 在Python中,AttributeError通常表示你试图访问的对象没有你请求的属性或方法。如果你遇到了AttributeError: list object has no attribute items的错误,这…

Si3N4/SiC纳米复相陶瓷综合性能明显提升 下游可应用范围广泛

Si3N4/SiC纳米复相陶瓷综合性能明显提升 下游可应用范围广泛 Si3N4/SiC纳米复相陶瓷,是以碳化硅(SiC)纳米颗粒为第二相,弥散进入氮化硅(Si3N4)基体相制备得到的新型陶瓷材料,对碳化硅陶瓷具有强…

【AIOT-Robot】3D pos 相关

1. Mediapipe 3D detection 使用移动增强现实(AR)会话数据(session data),开发了新的数据pipeline。大部分智能手机现在都具备了增强现实的功能,在这个过程中捕捉额外的信息,包括相机姿态、稀疏的3D点云、估计的光照和平面。 利用相机的姿势、检测到的平面、估计的照明,来生…

从LangChain迈出学习人工智能第一步入门指南

什么是langchain LangChain是一个用于开发由语言模型驱动的应用程序的框架,致力于简化AI模型应用的开发.简单来说,langchain就是一个帮助开发者轻松完成AI模型应用开发的框架,现在支持python和js两个版本,它集成多种大语言模型及第三方api. 对于使用langchain,把它当作一个第三…

禁用layui树形表格的多选框checkbox

1. 背景 在使用树形表格渲染数据时,需要对数据进行批量操作。相对于选中数据后,再做错误提示。直接把数据的多选框禁用掉更加直观。 2. 实现 DisabledTableCheckBox: () > {// 获取所有行 var tableElem $(".layui-table-fixed-l");var …