wayland(xdg_wm_base) + egl + opengles 纹理贴图进阶实例(四)

这篇具有很好参考价值的文章主要介绍了wayland(xdg_wm_base) + egl + opengles 纹理贴图进阶实例(四)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

本文主要介绍如何在一个wayland client 里面使用 egl + opengles 读取一个 pattern 图片数据进行纹理贴图,在阅读本篇文章之前,建议先读一下之前的文章 《wayland(xdg_wm_base) + egl + opengles 最简实例(一)》
软硬件环境
硬件:PC
软件:ubuntu22.04 weston9.0 opengles2.0/3.0 egl1.4


一、使用gstreamer 获取 pattern 图片

在ubuntu 下执行如下命令可以获取一张格式为RGB888, 分辨率为640x480 的pattern 图片
gst-launch-1.0 videotestsrc num-buffers=1 foreground-color=0 ! video/x-raw,format=RGB, width=640,height=480 ! filesink location=./pattern_640x480.rgb
如下图所示:
wayland(xdg_wm_base) + egl + opengles 纹理贴图进阶实例(四),weston/wayland,EGL/OpenGL ES,opengles,egl,wayland
在PC 端使用YUV player 软件工具(格式和分辨率分别设置为RGB24和640x480)打开该图片的效果如下图所示
wayland(xdg_wm_base) + egl + opengles 纹理贴图进阶实例(四),weston/wayland,EGL/OpenGL ES,opengles,egl,wayland文章来源地址https://www.toymoban.com/news/detail-829949.html

二、代码实例

1. pattern 图片作为纹理数据源的代码实例

1.1 基于opengles2.0 接口的 egl_wayland_texture2_1.c

#include <wayland-client.h>
#include <wayland-server.h>
#include <wayland-egl.h>
#include <EGL/egl.h>
#include <GLES2/gl2.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include "xdg-shell-client-protocol.h"

#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;

struct window {
   
	struct wl_surface *surface;
	struct xdg_surface *xdg_surface;
	struct xdg_toplevel *xdg_toplevel;
	struct wl_egl_window *egl_window;
};

// Index to bind the attributes to vertex shaders
const unsigned int VertexArray = 0;

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 = wl_registry_bind(registry, name, &wl_compositor_interface, 1);
	} else if (strcmp(interface, "xdg_wm_base") == 0) {
   
		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 *registry, uint32_t name) 
{
   

}

static struct wl_registry_listener registry_listener = {
   registry_add_object, registry_remove_object};


static void
handle_surface_configure(void *data, struct xdg_surface *surface,
	uint32_t serial)
{
   
	xdg_surface_ack_configure(surface, serial);
}


static const struct xdg_surface_listener xdg_surface_listener = {
   
		handle_surface_configure
};

static void
handle_toplevel_configure(void *data, struct xdg_toplevel *toplevel,
				  int32_t width, int32_t height,
							  struct wl_array *states)
{
   
}

static void
handle_toplevel_close(void *data, struct xdg_toplevel *xdg_toplevel)
{
   
}

static const struct xdg_toplevel_listener xdg_toplevel_listener = {
   
	handle_toplevel_configure,
	handle_toplevel_close,
};

bool initWaylandConnection()
{
   	
	if ((display = wl_display_connect(NULL)) == NULL)
	{
   
		printf("Failed to connect to Wayland display!\n");
		return false;
	}

	if ((registry = wl_display_get_registry(display)) == NULL)
	{
   
		printf("Faield to get Wayland registry!\n");
		return false;
	}

	wl_registry_add_listener(registry, &registry_listener, NULL);
	wl_display_dispatch(display);

	if (!compositor)
	{
   
		printf("Could not bind Wayland protocols!\n");
		return false;
	}

	return true;
}

bool initializeWindow(struct window *window)
{
   
	initWaylandConnection();
	window->surface = wl_compositor_create_surface (compositor);
	window->xdg_surface = xdg_wm_base_get_xdg_surface(wm_base, window->surface);
	if (window->xdg_surface == NULL)
	{
   
		printf("Failed to get Wayland xdg surface\n");
		return false;
	} else {
   
		xdg_surface_add_listener(window->xdg_surface, &xdg_surface_listener, window);
		window->xdg_toplevel =
			xdg_surface_get_toplevel(window->xdg_surface);
		xdg_toplevel_add_listener(window->xdg_toplevel,
			&xdg_toplevel_listener, window);
		xdg_toplevel_set_title(window->xdg_toplevel, "egl_wayland_texture");
	}

	return true;

}

void releaseWaylandConnection(struct window *window)
{
   
	if(window->xdg_toplevel)
		xdg_toplevel_destroy(window->xdg_toplevel);
	if(window->xdg_surface)
		xdg_surface_destroy(window->xdg_surface);
	wl_surface_destroy(window->surface);
	xdg_wm_base_destroy(wm_base);
	wl_compositor_destroy(compositor);
	wl_registry_destroy(registry);
	wl_display_disconnect(display);
}

bool createEGLSurface(EGLDisplay eglDisplay, EGLConfig eglConfig, EGLSurface *eglSurface, struct window *window)
{
   

	window->egl_window = wl_egl_window_create(window->surface, WIDTH, HEIGHT);
	if (window->egl_window == EGL_NO_SURFACE) {
    
		printf("Can't create egl window\n"); 
		return false;
	} else {
   
		printf("Created wl egl window\n");
	}

	*eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig, window->egl_window, NULL);
	
	return true;
}

bool create_textures(GLuint *textureId)
{
   
	GLuint width, height;
	GLbyte *data;

	GLint fd;
	width = 640;
	height = 480;
	
	fd = open("./pattern_640x480.rgb", O_RDONLY);
	if(fd < 0) {
   
		printf("open failed\n");
		return false;
	}



	data = (GLbyte *)malloc(width * height * 3);
	if(<

到了这里,关于wayland(xdg_wm_base) + egl + opengles 纹理贴图进阶实例(四)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • wayland(xdg_wm_base) + egl + opengles 最简实例

    `本文主要介绍如何在linux 下,基于 xdg_wm_base 接口的 wayland client 中 使用 egl + opengles 渲染一个最基本的三角形 软硬件环境: 硬件:PC 软件: ubuntu22.04 EGL1.4 openGL ES3.1 weston9.0 之前的文章 weston 源码下载及编译 介绍了如何在ubuntu 22.04 下面编译 weston9.0 ,在编译结束后,在build 目

    2024年01月24日
    浏览(37)
  • wayland(xdg_wm_base) + egl + opengles 最简实例(一)

    `本文主要介绍如何在linux 下,基于 xdg_wm_base 接口的 wayland client 中 使用 egl + opengles 渲染一个最基本的三角形 软硬件环境: 硬件:PC 软件: ubuntu22.04 EGL1.4 openGL ES3.1 weston9.0 之前的文章 weston 源码下载及编译 介绍了如何在ubuntu 22.04 下面编译 weston9.0 ,在编译结束后,在build 目

    2024年02月20日
    浏览(40)
  • wayland(xdg_wm_base) + egl + opengles 光照模型实例(十五)

    本文主要介绍如何使用 wayland(xdg_wm_base) + egl + opengles3.0 绘制一个使用冯氏光照模型(Phong Lighting Model)的绕Y轴旋转的正方体,主要涉及环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照,使用一个固定位置和颜色的光源。 软硬件环境: 硬件:PC 软件:ubuntu22.04 egl1.4 opengles3.0 weston

    2024年03月15日
    浏览(47)
  • OpenGLES:3D立方体纹理贴图

    前几篇博文讲解了OpenGLES绘制多种3D图形,并赋予丰富的色彩,但是在这些3D图形绘制过程中,有一点还没有涉及,就是 纹理贴图。 今天这篇博文我会用如下 六张图片 对立方体进行纹理贴图,实现 六个面都是贴图 的3D旋转立方体 2.1 常规变量定义 2.2 顶点、纹理相关变量定义

    2024年02月08日
    浏览(41)
  • OpenGL排坑指南—贴图纹理绑定和使用

    一、前言         在OpenGL学习 的纹理这一章中讲述了纹理贴图的使用方式,主要步骤是先创建一个纹理的对象,和创建顶点VAO类似,然后就开始绑定这个纹理,最后在循环中使用,有时候可能还要用到激活纹理单元的函数。然而,对于何时应该激活如何和shader里的纹理编号

    2024年02月01日
    浏览(36)
  • OpenGL —— 2.5、绘制第一个三角形(附源码,glfw+glad)(更新:纹理贴图)

    源码效果   C++源码        纹理图片            需下载stb_image.h这个解码图片的库,该库只有一个头文件。         具体代码:            vertexShader.glsl              fragmentShader.glsl              main.c      

    2024年02月11日
    浏览(48)
  • 记录解决运行Qt程序出现警告提示“Warning: Ignoring XDG_SESSION_TYPE=wayland on Gnome. Use QT_QPA_PLATFORM=wayland t”

    运行Qt程序是出现警告提示“Warning: Ignoring XDG_SESSION_TYPE=wayland on Gnome. Use QT_QPA_PLATFORM=wayland to run on Wayland anyway.”,虽然并不影响程序的运行和显示,但是看着碍眼啊,于是上网搜索了一下解决办法,记录一下 这个警告提示是关于在 Gnome 桌面环境下运行 Qt 程序时的一种提示信

    2024年04月12日
    浏览(47)
  • 【Android OpenGL开发】OpenGL ES与EGL介绍

    OpenGL(Open Graphics Library)是一个跨编程语言、跨平台的编程图形程序接口,主要用于图像的渲染。 Android提供了简化版的OpenGL接口,即OpenGL ES。 早先定义 OpenGL ES 是 OpenGL 的嵌入式设备版本,用于移动端平台(Android、iOS),但由于嵌入式设备要求的是高性能,所以一些其它纯

    2024年02月04日
    浏览(86)
  • wayland 之opengl es

       EGL 是 OpenGL ES 渲染 API 和本地窗口系统(native platform window system)之间的一个中间接口层,它主要由系统制造商实现。 使用 EGL 绘图的基本步骤 Display(EGLDisplay) 是对实际显示设备的抽象。 Surface(EGLSurface)是对用来存储图像的内存区域 FrameBuffer 的抽象,包括 Color Buffer, Sten

    2024年02月09日
    浏览(51)
  • OpenGL ES EGL eglCreateWindowSurface

    一. EGL 前言 二. EGL 绘制流程简介 三.eglCreateWindowSurface 函数简介 1.eglCreateWindowSurface 函数 2.EGLSurface 分类 四.eglCreateWindowSurface 函数使用 五.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 OpenGL ES 特效 零基础

    2023年04月10日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包