wayland(xdg_wm_base) + egl + opengles 使用 Assimp 加载带光照信息的材质文件Mtl 实现光照贴图的最简实例(十七)

文章目录

  • 前言
  • 一、3d 立方体 model 属性相关文件
    • 1. cube1.obj
    • 2. cube1.Mtl
    • 3. 纹理图片 cordeBouee4.jpg
  • 二、实现光照贴图的效果
    • 1. 依赖库和头文件
      • 1.1 assimp
      • 1.2 stb_image.h
    • 2. egl_wayland_obj_cube1.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. cube1.obj

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

# 3D Cube with texture coordinates

mtllib cube1.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

# 顶点法线
vn 0 0 1
vn 1 0 0
vn 0 0 -1
vn -1 0 0
vn 0 1 0
vn 0 -1 0

# 面 (使用纹理)
f 1/1/1 2/2/1 3/3/1
f 1/1/1 3/3/1 4/4/1
f 4/1/2 3/2/2 7/3/2
f 4/1/2 7/3/2 8/4/2
f 8/2/3 7/1/3 6/4/3
f 8/2/3 6/4/3 5/3/3
f 5/3/4 6/4/4 2/1/4
f 5/3/4 2/1/4 1/2/4
f 2/2/5 6/3/5 7/4/5
f 2/2/5 7/4/5 3/1/5
f 5/4/6 1/1/6 4/2/6
f 5/4/6 4/2/6 8/3/6

2. cube1.Mtl

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

newmtl cubeMaterial
Ka 1.0 1.0 1.0
Kd 1.0 1.0 1.0
Ks 0.5 0.5 0.5
Ns 32.0
illum 2
map_Kd cordeBouee4.jpg

3. 纹理图片 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_cube1.cpp

egl_wayland_obj_cube1.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>

#include <glm/vec3.hpp> // glm::vec3
#include <glm/vec4.hpp> // glm::vec4
#include <glm/gtc/type_ptr.hpp>

#define WIDTH 800
#define HEIGHT 600

struct wl_display *display = NULL;
struct wl_compositor *compositor = NULL;
struct xdg_wm_base *wm_base = NULL;
struct wl_registry *registry = NULL;

//opengles global var

GLuint projectionLocation;
GLuint modelLocation;
GLuint viewLocation;
GLuint simpleCubeProgram;
GLuint samplerLocation;
GLuint textureId;


aiMesh *mesh;
aiMaterial *material;
GLfloat *vVertices;
GLfloat *vNormals;
GLfloat *vTextures;
GLushort *indices;
GLuint indices_num;
GLuint vao,vbo1,vbo2,vbo3,ebo;


// Light parameters
glm::vec3 lightPos(0.0f, 3.0f, 0.0f);          // 建立一个在立方体正上方的光源(Y轴正方向上位置为3.0处)
//viewPos parameters
glm::vec3 viewPos(0.0f, 0.0f, 7.0f);

glm::vec3 lightambient(0.2f, 0.2f, 0.2f);
glm::vec3 lightdiffuse(1.0f, 1.0f, 1.0f);
glm::vec3 lightspecular(0.5f, 0.5f, 0.5f);



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<

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

无人机助力违法毒品种植,基于轻量级YOLOv5n开发构建无人机航拍场景下的农村田园场景下非法种植罂粟花检测预警识别系统

打击毒品人人有责&#xff0c;毒品带来的危害是人尽皆知的&#xff0c;我们不仅自身要严厉拒绝接触任何形式的毒品&#xff0c;更要言传身教告诫他人不要与任何形式的任何渠道的毒品有关联&#xff0c;但是在实际生活中&#xff0c;在一些偏远的乡村、田园、山丘、村落等地方&a…

网络安全的几个关键领域

网络安全是一个复杂且多维度的领域&#xff0c;涵盖了多个关键领域&#xff0c;涉及到信息保护、网络防护、应用安全、用户教育以及物理安全等多个方面。这些关键领域相互交织&#xff0c;共同构成了网络安全这一宏大且细致入微的领域。 今天德迅云安全就分享下网络安全的几个…

STP环路避免实验(华为)

思科设备参考&#xff1a;STP环路避免实验&#xff08;思科&#xff09; 一&#xff0c;技术简介 Spanning Tree Protocol&#xff08;STP&#xff09;&#xff0c;即生成树协议&#xff0c;是一种数据链路层协议。主要作用是防止二层环路&#xff0c;并自适应网络变化和故障…

【RabbitMQ | 第一篇】消息队列基础知识

文章目录 1.消息队列基础知识1.1什么是消息队列&#xff1f;1.2消息队列有什么用&#xff1f;&#xff08;结合项目说&#xff09;1.2.1异步处理1.2.2削峰/限流1.2.3降低系统耦合性1.2.4实现分布式事务 1.3消息队列的缺点1.4JMS和AMQP1.4.1 JMS的两种消息模型&#xff08;1&…

Python 自然语言处理库之stanza使用详解

概要 在自然语言处理(NLP)领域,Python Stanza 库是一个备受推崇的工具,它提供了强大的功能和易用的接口,帮助开发者处理文本数据、进行语言分析和构建NLP应用。本文将深入探讨 Stanza 库的特性、用法,并通过丰富的示例代码展示其在实际项目中的应用。 Stanza 简介 Stan…

【Oracle】Linux——Centos7安装Oracle12c

安装前拍快照、安装前拍快照、安装前拍快照 目录 安装前拍快照、安装前拍快照、安装前拍快照1.下载Oracle12C安装包2.基本环境搭建2.1创建用户和组2.2创建oralce安装目录,oracle用户分配目录权限2.3上传安装包 3.系统参数配置及服务器设置3.1依赖安装3.2内核参数配置3.3配置完成…

swagger3快速使用

目录 &#x1f37f;1.导入依赖 &#x1f32d;2.添加配置文件 &#x1f9c2;3.添加注解 &#x1f96f;4.访问客户端 1.导入依赖 引入swagger3的依赖包 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artif…

【保姆级】【Python + Django】静态文件的添加

前言&#xff1a; 前一篇文章我们已经学会了怎么用django写文本页面啦&#xff01;&#xff01;&#xff01; 有一说一&#xff0c;这个静态页面是真的丑。 我们总得用一些花花绿绿的东西把这个丑陋的网站给装饰一下吧&#xff01;&#xff01;&#xff01;&#xff01;&…

C语言——结构体自定义类型

目录 结构体类型 声明结构体 结构体的特殊声明 创建结构体变量和初始化结构体变量 结构体的自引用 结构体内存对齐 对齐规则 内存对齐存在意义 默认对齐数的修改 结构体传参 结构体实现位段 了解位段是什么 位段的内存分配 位段有跨平台的问题及使用注意事项 C语言…

QT 驾校系统界面布局编写

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);this->resize(ui->label_img->width(),ui->label_img->height());//图片自适应窗口大小ui->label_img->setScaledContents(true);//图片置…

WebMvcConfigurationSupport 注册自定义拦截器 Java SpringBoot

WebMvcConfigurationSupport 注册自定义拦截器 Java SpringBoot 说明 定义拦截器 拦截器&#xff08;Interceptor&#xff09;类&#xff0c;用于在处理请求之前进行一些操作。 实现方式&#xff0c;让类实现HandlerInterceptor。 在preHandle方法中进行请求拦截的逻辑操作…

【智能算法应用】智能算法优化BP神经网络思路

目录 1.思路2.设计 1.思路 在BP神经网络结构中&#xff0c;权值和阈值被视为模型的参数&#xff0c;它们在训练过程中需要通过反向传播算法进行学习&#xff0c;以使得网络的输出尽可能地接近真实标签。这意味着网络的目标是通过最小化均方误差&#xff08;MSE&#xff09;来调…

Flutter 在 Windows 下的开发环境搭建(Flutter SDK 3.19.2)【图文详细教程】

Git 下载与安装 对于 Flutter 3.19&#xff0c;Git 版本需要 2.27 及以上 Git 下载&#xff1a; Git 官网&#xff1a;https://git-scm.com/Git 下载淘宝镜像&#xff1a;https://registry.npmmirror.com/binary.html?pathgit-for-windows/ 对于 Git 的安装教程&#xff0c;…

基于springboot+vue的游戏交易系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

目标检测——PP-PicoDet算法解读

PP-YOLO系列&#xff0c;均是基于百度自研PaddlePaddle深度学习框架发布的算法&#xff0c;2020年基于YOLOv3改进发布PP-YOLO&#xff0c;2021年发布PP-YOLOv2和移动端检测算法PP-PicoDet&#xff0c;2022年发布PP-YOLOE和PP-YOLOE-R。由于均是一个系列&#xff0c;所以放一起解…

嵌入式学习41-数据结构2

今天学习了链表的增删改查 &#xff08;暂定&#xff01;&#xff01;后续再补内容&#xff09; 高内聚 &#xff1a;一个函数只实现一个功能 …

klipper源码分析之simulavr测试

分析Klipper源码&#xff0c;有时需要结合下位机一起分析&#xff0c;这样才能更加全面的了解Klipper的工作原理。如果手头上有打印机主板&#xff0c;电脑当做上位机运行Klipper&#xff0c;这样是比较方便。如果手头上没有打印机主板&#xff0c;可以用simulavr模拟AVR下位机…

ECharts绘制盒须图

一、箱线图 反应一组数据的分布情况&#xff0c;通过四分位数以图形的方式展示数值数据的局限性、分布和偏度组的方法。 四分位数&#xff1a;即把所有数值由小到大排列并分成四等份&#xff0c;处于三个分割点的数值就是四分位数。 下四分位&#xff1a;第一四分位Q1&#…

Android TransactionTooLargeException排查定位

Android TransactionTooLargeException排查定位 工具&#xff1a; https://github.com/guardian/toolargetoolhttps://github.com/guardian/toolargetool android TransactionTooLargeException问题的修复&#xff0c;一种简单的修复就是在Fragment的onCreate里面&#xff0…

Nginx实现原理全解析:构建高效Web服务器的关键

1、Nginx是什么 Nginx&#xff08;engine X&#xff09;是一个开源的轻量级的HTTP服务器&#xff0c;能够提供高性能的HTTP和反向代理服务。与传统的Apache服务器相比&#xff0c;在性能上Nginx占用系统资源更小、支持高并发&#xff0c;访问效率更高&#xff1b;在功能上&…
最新文章