wayland(xdg_wm_base) + egl + opengles 使用 Assimp 加载材质文件Mtl 中的纹理图片最简实例(十六)

文章目录

  • 前言
  • 一、3d 立方体 model 属性相关文件
    • 1. cube.obj
    • 2. cube.Mtl
    • 3. 纹理图片 cordeBouee4.jpg
  • 二、代码实例
    • 1. 依赖库和头文件
      • 1.1 assimp
      • 1.2 stb_image.h
    • 2. egl_wayland_obj_cube.cpp
    • 3. Matrix.h 和 Matrix.cpp
    • 4. xdg-shell-client-protocol.h 和 xdg-shell-protocol.c
    • 5. 编译
    • 6. 运行
  • 总结
  • 参考资料


前言

本文主要介绍opengles 如何使用 第三方库Assimp(基于C++) 加载一个最简单的带纹理 的3d 立方体model,3d 立方体 model 信息存储在 cube.obj 中,纹理图片信息存储在cube.Mtl 材质文件中,主要是介绍如何使用Assimp 解析Mtl 文件。
软硬件环境:
硬件:PC
软件:ubuntu22.04 egl1.4 weston9.0 opengles3.0 libassimp.so.5.2.0


一、3d 立方体 model 属性相关文件

.obj文件是一种常见的三维模型文件格式,它包含了描述三维模型的顶点、法线、纹理坐标和面信息等,通常,.obj文件会搭配使用.mtl文件(材质文件)来定义模型的材质属性。

1. cube.obj

本文的例子由于没有使用光照相关的属性,因此,cube.obj 中可以没有法线相关的信息
cube.obj 内容如下:

# 3D Cube with texture coordinatesmtllib cube.Mtl
usemtl cubeMaterial# 顶点坐标
v -1.0 -1.0 1.0
v -1.0 1.0 1.0
v 1.0 1.0 1.0
v 1.0 -1.0 1.0
v -1.0 -1.0 -1.0
v -1.0 1.0 -1.0
v 1.0 1.0 -1.0
v 1.0 -1.0 -1.0# 纹理坐标
vt 0.0 0.0
vt 0.0 1.0
vt 1.0 1.0
vt 1.0 0.0# 面
f 1/1 2/2 3/3
f 1/1 3/3 4/4
f 4/1 3/2 7/3
f 4/1 7/3 8/4
f 8/2 7/1 6/4
f 8/2 6/4 5/3
f 5/3 6/4 2/1
f 5/3 2/1 1/2
f 2/2 6/3 7/4
f 2/2 7/4 3/1
f 5/4 1/1 4/2
f 5/4 4/2 8/3

2. cube.Mtl

本文的例子由于没有使用光照相关的属性,因此,cube.Mtl 中可以没有材质光照相关的信息
cube.Mtl 信息如下:

newmtl cubeMaterial
map_Kd cordeBouee4.jpg

3. 纹理图片 cordeBouee4.jpg

cordeBouee4.jpg

二、代码实例

1. 依赖库和头文件

1.1 assimp

本文是通过使用assimp 来解析3d model 相关的文件,因此需要在 ubuntu 上安装 libassimp.so 库, 安装命令可以查看前面的文章《wayland(xdg_wm_base) + egl + opengles 使用 Assimp 加载3D model 最简实例(十四)》

1.2 stb_image.h

使用 stb_image.h 中相关的接口加载.jpg格式的纹理图片,如何获取 stb_image.h 头文件,可以查看之前的文章《wayland(xdg_wm_base) + egl + opengles 渲染使用纹理贴图的旋转 3D 立方体实例(十三)》

2. egl_wayland_obj_cube.cpp

egl_wayland_obj_cube.cpp 代码如下(示例):

#include <wayland-client.h>
#include <wayland-server.h>
#include <wayland-egl.h>
#include <EGL/egl.h>
#include <GLES3/gl3.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>#include "Matrix.h"
#include "xdg-shell-client-protocol.h"#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
// 使用 Assimp 加载模型文件
#include <assimp/Importer.hpp>
#include <assimp/scene.h>
#include <assimp/postprocess.h>#define WIDTH 800
#define HEIGHT 600struct wl_display *display = NULL;
struct wl_compositor *compositor = NULL;
struct xdg_wm_base *wm_base = NULL;
struct wl_registry *registry = NULL;//opengles global varGLuint projectionLocation;
GLuint modelLocation;
GLuint viewLocation;
GLuint simpleCubeProgram;
GLuint samplerLocation;
GLuint textureId;aiMesh *mesh;
aiMaterial *material;
GLfloat *vVertices;
GLfloat *vTextures;
GLushort *indices;
GLuint indices_num;
GLuint vao,vbo1,vbo2,ebo;float projectionMatrix[16];
float modelMatrix[16];
float viewMatrix[16];
float angleX = 30.0f;
float angleY = 0.0f;
float angleZ = 0.0f;struct window {struct wl_surface *surface;struct xdg_surface *xdg_surface;struct xdg_toplevel *xdg_toplevel;struct wl_egl_window *egl_window;
};static void
xdg_wm_base_ping(void *data, struct xdg_wm_base *shell, uint32_t serial)
{xdg_wm_base_pong(shell, serial);
}/*for xdg_wm_base listener*/
static const struct xdg_wm_base_listener wm_base_listener = {xdg_wm_base_ping,
};/*for registry listener*/
static void registry_add_object(void *data, struct wl_registry *registry, uint32_t name, const char *interface, uint32_t version) 
{if (!strcmp(interface, "wl_compositor")) {compositor = (struct wl_compositor *)wl_registry_bind(registry, name, &wl_compositor_interface, 1);} else if (strcmp(interface, "xdg_wm_base") == 0) {wm_base = (struct xdg_wm_base *)wl_registry_bind(registry, name,&xdg_wm_base_interface, 1);xdg_wm_base_add_listener(wm_base, &wm_base_listener, NULL);}
}void registry_remove_object(void *data, struct wl_registry 

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

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

相关文章

SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述程序…

02 Statement和PreparedStatement

文章目录 StatementPreparedStatement Statement (1)相同的SQL语句&#xff0c; 重复执行第n次&#xff0c;编译n次 — 效率低 (2)Statement sql中的参数赋值 直接通过字符串拼接&#xff0c;可能会有非法sql注入&#xff0c;导致数据泄露 import java.sql.*; import java.util…

【Leetcode-189.轮转数组】

题目&#xff1a; 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3…

理论学习:KL散度

KL散度&#xff08;Kullback-Leibler Divergence&#xff09;&#xff0c;也称为相对熵&#xff0c;是衡量两个概率分布差异的一种方法。想象一下&#xff0c;你有两本关于同一个话题但写法不同的书。如果你想知道这两本书实际上讲的是不是同一个故事&#xff0c;你可以通过比较…

Hero Talk|无缝扩展:Kubernetes 上的 Amazon Aurora 分片和流量管理

亚马逊云科技 Data Hero 潘娟正在打开开源之门。作为“2020 中国开源先锋人物”以及“2021 OSCAR 尖峰开源人物”奖项获得者&#xff0c;她致力于赋能数据领域的开发者&#xff0c;助力他们把握先机。在亚马逊云科技 re:Invent 2023 大会上&#xff0c;潘娟就 Kubernetes 上的 …

杂题——1188: 做幻方

题目描述 Apple最近迷上了做幻方&#xff0c;Apple还是个中高手&#xff0c;只要你说个奇数N就能把N*N的幻方做出来。其实你可以比他做得更好的。Apple总是画得很乱&#xff0c;而你可以利用程序排得很整齐^_^ 幻方的要求&#xff1a;每一行&#xff0c;每一列&#xff0c;还有…

外贸网站建设需要注意什么

在外贸网站建设过程中&#xff0c;需要注意以下几点&#xff1a; 多语言支持&#xff1a;考虑目标市场的语言需求&#xff0c;提供多语言版本的网站&#xff0c;以便更好地与国际客户进行沟通和交流。 跨境支付和物流&#xff1a;为国际客户提供方便快捷的跨境支付方式&#x…

【Godot4.2】 基于SurfaceTool的3D网格生成与体素网格探索

概述 说明&#xff1a;本文基础内容写于2023年6月&#xff0c;由三五篇文章汇总而成&#xff0c;因为当时写的比较潦草&#xff0c;过去时间也比较久了&#xff0c;我自己都得重新阅读和理解一番&#xff0c;才能知道自己说了什么&#xff0c;才有可能重新优化整理。 因为我对…

【C++】struct和class区别

在 C 中&#xff0c;struct 和 class 都可以用来定义自定义的数据类型&#xff0c;但它们在语法上有一些区别&#xff0c;主要体现在访问权限和默认继承方式上&#xff1a; 默认访问权限&#xff1a; 在 struct 中&#xff0c;默认的成员访问权限是 public&#xff0c;即结构…

分光器和分流器

分光器 是一种无源器件&#xff0c;所谓无源是指不需要外接电源&#xff0c;只要有输入光就可以正常工作。分光器由入射和出射狭缝、反射镜和色散元件组成&#xff0c;其作用是将所需要的共振吸收线分离出来&#xff0c;对光信号进行比例分配&#xff0c;其中大比例光信号给业…

Java Json序列化工具使用比较

前言 在软件程序开发中&#xff0c;数据的传输和存储是一项非常重要的任务。特别是在分布式系统中&#xff0c;数据的序列化和反序列化是一项关键的技术&#xff0c;以确保不同系统之间的数据交换的正确性和高效性。 JSON&#xff08;JavaScript Object Notation&#xff09;是…

打造精美响应式CSS日历:从基础到高级样式

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

ARM开发板实现24位BMP图片缩放

ARM开发板实现24位BMP图片缩放 一、linux平台bmp图片缩放 最近想在ARM开发板实现BMP图片的缩放&#xff0c;查看了一些资料&#xff0c;大家部分理论知识可参考&#xff1a; akynazh博主 &#xff0c;这位博主程序以window平台为主进行显示&#xff0c;发现在linux平台下编译…

Nginx高可用实施指南:从规划到部署的全面解析

准备工作 192.168.16.128 192.168.16.129 两台虚拟机。 安装Nginx 更新yum源文件&#xff1a; rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyu…

堆排序(数据结构)

本期讲解堆排序的实现 —————————————————————— 1. 堆排序 堆排序即利用堆的思想来进行排序&#xff0c;总共分为两个步骤&#xff1a; 1. 建堆 • 升序&#xff1a;建大堆 • 降序&#xff1a;建小堆 2. 利用堆删除思想来进行排序. 建堆和堆删…

12|检索增强生成:通过RAG助力鲜花运营

什么是 RAG&#xff1f;其全称为 Retrieval-Augmented Generation&#xff0c;即检索增强生成&#xff0c;它结合了检 索和生成的能力&#xff0c;为文本序列生成任务引入外部知识。RAG 将传统的语言生成模型与大规模 的外部知识库相结合&#xff0c;使模型在生成响应或文本时可…

LeetCode 每日一题 Day 102-108

2864. 最大二进制奇数 给你一个 二进制 字符串 s &#xff0c;其中至少包含一个 ‘1’ 。 你必须按某种方式 重新排列 字符串中的位&#xff0c;使得到的二进制数字是可以由该组合生成的 最大二进制奇数 。 以字符串形式&#xff0c;表示并返回可以由给定组合生成的最大二进…

多个upload组件放在for循环调用submit失效的解决方法

示例代码 <div class"item" v-for"(item,index) in lbtList"><!-- 图片上传 --><div><el-uploadaction"#":ref"uploadindex"list-type"picture-card":limit"1":file-list"item.fileLi…

每日OJ题_简单多问题dp④_力扣LCR 091. 粉刷房子

目录 力扣LCR 091. 粉刷房子 解析代码 力扣LCR 091. 粉刷房子 LCR 091. 粉刷房子 难度 中等 假如有一排房子&#xff0c;共 n 个&#xff0c;每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种&#xff0c;你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相…

3.18号arm

4 跳转指令 实现汇编程序跳转的两种方式 直接修改PC的值 mov pc , #0x04 通过跳转指令跳转 b 标签 程序跳转到指定的标签下执行&#xff0c;此时LR寄存器不保存返回地址 bl 标签 程序跳转到指定的标签下执行&#xff0c;此时LR寄存器保存返回地址 5 内存读写指令&#xff0…