【Vulkan入门】14-ShowBySDL

文章目录

  • 先叨叨
  • 关键代码
    • Git信息
    • main.cpp
  • 运行结果
  • 接下来我会做什么
    • 重构代码
    • 在b站出一套视频

先叨叨

上篇我们让Vulkan渲染了一个三角形,但还没有把它显示出来。本篇介绍一下,如何使用SDL将这个图形显示出来。
原理其实很简单,就是将渲染的内存当作图片显示,因此直接上代码。

关于如何安装SDL的教程一搜一大把,这里就不介绍了。

关键代码

Git信息

  • repository: https://gitee.com/J8_series/easy-car-ui
  • tag: 14-Mailstone-ShowedByySDL
  • url: https://gitee.com/J8_series/easy-car-ui/tree/14-Mailstone-ShowedByySDL

main.cpp

删除原先的main函数,改用SDL的框架。SDL的框架需要我们自己实现4个方法

  1. SDL_AppInit: 该方法为程序启动时执行的初始化方法。
  2. SDL_AppEvent: 该方法为程序接收到外部事件时触发的方法。事件指键盘、鼠标、游戏舵等输入设备触发的事件。
  3. SDL_AppIterate: 为显示循环,即SDL调用该方法让应用准备下一帧的数据。
  4. SDL_AppQuit: 为应用退出时执行的方法。

基于以上信息,我们会在SDL_AppInit中初始化Vulkan、然后在SDL_AppIterate调用RenderOneFrame方法。将获取的图像设置给SDL的Texture进行显示。

#include <iostream>#define SDL_MAIN_USE_CALLBACKS 1
#include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>
#include <SDL3/SDL_surface.h>#include "RenderEngine/VulkanEnv.h"static SDL_Window *window = NULL;
static SDL_Renderer *renderer = NULL;
static SDL_Texture *texture = NULL;
static int texture_width = 0;
static int texture_height = 0;#define WINDOW_WIDTH 640
#define WINDOW_HEIGHT 480using namespace namespace_easy_car_ui;VulkanEnv* vulkanEnv {nullptr};/* This function runs once at startup. */
SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
{SDL_SetAppMetadata("Easy_Car_UI", "1.0", "com.eniac.easy_car_ui");if (!SDL_Init(SDL_INIT_VIDEO)){SDL_Log("Couldn't initialize SDL: %s", SDL_GetError());return SDL_APP_FAILURE;}if (!SDL_CreateWindowAndRenderer("examples/renderer/textures", WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_VULKAN, &window, &renderer)){SDL_Log("Couldn't create window/renderer: %s", SDL_GetError());return SDL_APP_FAILURE;}texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA32, SDL_TEXTUREACCESS_STATIC, WINDOW_WIDTH, WINDOW_HEIGHT);if (nullptr == texture){SDL_Log("Couldn't create texture: %s", SDL_GetError());return SDL_APP_FAILURE;}vulkanEnv = new VulkanEnv();vulkanEnv->Initalize(true, WINDOW_WIDTH, WINDOW_HEIGHT);vulkanEnv->PrintPhysicalDevices();vulkanEnv->PrintSelectedPhysicalDevice();return SDL_APP_CONTINUE;  /* carry on with the program! */
}/* This function runs when a new event (mouse input, keypresses, etc) occurs. */
SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event)
{if (event->type == SDL_EVENT_QUIT) {return SDL_APP_SUCCESS;  /* end the program, reporting success to the OS. */}return SDL_APP_CONTINUE;  /* carry on with the program! */
}/* This function runs once per frame, and is the heart of the program. */
SDL_AppResult SDL_AppIterate(void *appstate)
{using namespace namespace_easy_car_ui;const Uint64 now = SDL_GetTicks();SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);  /* black, full alpha */SDL_RenderClear(renderer);  /* start with a blank canvas. */uint32_t pixels[WINDOW_WIDTH * WINDOW_HEIGHT] {0};vulkanEnv->RenderOneFrame(pixels);if (!SDL_UpdateTexture(texture, nullptr, pixels, WINDOW_WIDTH*4)){SDL_Log("Couldn't update texture: %s", SDL_GetError());return SDL_APP_FAILURE;}if (!SDL_RenderTexture(renderer, texture, nullptr, nullptr)){SDL_Log("Couldn't render texture: %s", SDL_GetError());return SDL_APP_FAILURE;}if (!SDL_RenderPresent(renderer)){SDL_Log("Couldn't render present: %s", SDL_GetError());return SDL_APP_FAILURE;} /* put it all on the screen! */return SDL_APP_CONTINUE;  /* carry on with the program! */
}/* This function runs once at shutdown. */
void SDL_AppQuit(void *appstate, SDL_AppResult result)
{delete vulkanEnv;vulkanEnv = nullptr;SDL_DestroyTexture(texture);/* SDL will clean up the window/renderer for us. */
}

运行结果

至此已经成功地用Vulkan渲染出了三角性。
在这里插入图片描述

接下来我会做什么

重构代码

我学习Vulkan的目的是想作一个车辆HMI仪表渲染的框架,经过之前的学习我对Vulkan有了一些新的认识。因此我会设计一个渲染框架,将代码重构一下,以适应渲染HMI仪表的需求。

在b站出一套视频

我也知道有些同学不喜欢看文字,因此我会在B站出一套视频课程,重复介绍这套入门教程。主要是我也想赚点钱买个带光追的电脑(3050显卡就行,二手价钱在3000左右),因此我会将视频设置为付费。目前想定的价格是10元到30元之间。如果大家需要也请大家捧场。视频我会先全部录制完再发布,因此大概需要2到3个月的时间才能发布。

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

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

相关文章

GESP202412 四级【Recamán】题解(AC)

》》》点我查看「视频」详解》》》 [GESP202412 四级] Recamn 题目描述 小杨最近发现了有趣的 Recamn 数列&#xff0c;这个数列是这样生成的&#xff1a; 数列的第一项 a 1 a_1 a1​ 是 1 1 1&#xff1b;如果 a k − 1 − k a_{k-1}-k ak−1​−k 是正整数并且没有在数…

OpenCV实验:图片加水印

第二篇&#xff1a;图片添加水印&#xff08;加 logo&#xff09; 1. 实验原理 水印原理&#xff1a; 图片添加水印是图像叠加的一种应用&#xff0c;分为透明水印和不透明水印。水印的实现通常依赖于像素值操作&#xff0c;将水印图片融合到目标图片中&#xff0c;常用的方法…

OpenCV 功能函数介绍 (二)

一&#xff0c;梯度处理的sobel算子函数 功能&#xff1a; 用于计算图像梯度&#xff08;gradient&#xff09;的函数 参数&#xff1a; cv2.Sobel(src, ddepth, dx, dy, ksize3, scale1, delta0, borderTypeNone) cv2.Sobel&#xff08;输入图像 &#xff0c; 应该是灰…

MySQL有哪些高可用方案?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL有哪些高可用方案?】面试题。希望对大家有帮助&#xff1b; MySQL有哪些高可用方案? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MySQL 高可用方案旨在确保数据库系统的高可靠性、低宕机时间、以及在硬件故障…

鸿蒙项目云捐助第二讲鸿蒙图文互动基本程序实现

鸿蒙项目云捐助第二讲鸿蒙图文互动基本程序实现 结合第一讲建立的“Hello World”程序&#xff0c;得到如下图所示的界面。 这里的“Hello World”是通过“Priview”显示出来的。在这个界面中进行开发的前奏曲&#xff0c;可以通过点击更换图片的案例来体会一下鸿蒙Next的开发…

厦门凯酷全科技有限公司正规吗靠谱吗?

随着短视频和直播电商的迅猛发展&#xff0c;越来越多的企业开始将目光投向抖音这一平台。作为国内领先的短视频社交平台&#xff0c;抖音凭借其庞大的用户基础和强大的算法推荐系统&#xff0c;成为众多品牌拓展市场、提升销售的重要渠道。厦门凯酷全科技有限公司&#xff08;…

计算机网络从诞生之初到至今的发展历程

前言 "上网"&#xff0c;相信大家对这个动词已经不再陌生&#xff0c;网 通常指的是网络&#xff1b;在 2024 年的今天&#xff0c;网络已经渗透到了每个人的生活中&#xff0c;成为其不可或缺的一部分&#xff1b;你此时此刻在看到我的博客&#xff0c;就是通过网络…

django——admin后台管理1

一、admin后台管理 访问url进入&#xff1a; http://127.0.0.1:8000/admin ​ 创建超级管理用户 终端输入以下命令&#xff1a; python manage.py createsuperuser (py36_pingping) E:\django学习\day03-django入门\demo>python manage.py createsuperuser Username: mo…

如何保证数据库和缓存双写一致性?

数据库和缓存&#xff08;redis&#xff09;双写数据一致性问题再高并发的场景下&#xff0c;是一个很严重的问题&#xff0c;无论在工作中&#xff0c;还是面试&#xff0c;遇到的概率非常大&#xff0c;这里就聊一聊目前的常见解决方案以及最优方案。 常见方案 缓存的主要目…

Java基础知识(四) -- 面向对象(上)

1.概述 Java语言是一种面向对象的程序设计语言&#xff0c;而面向对象思想(OOP)是一种程序设计思想&#xff0c;在面向对象思想的指引下&#xff0c;使用Java语言去设计、开发计算机程序。这里的对象泛指现实中一切事物&#xff0c;每种事物都具备自己的属性和行为。 面向对象思…

【数据结构与算法】Java描述:学数据结构与算法你需要预备的知识点!!!

这篇文章主要介绍 什么是数据结构&#xff0c;算法的时间复杂度&#xff0c;空间复杂度计算&#xff0c;包装类的装箱拆箱&#xff0c; 泛型语法&#xff0c;以及擦除机制。 目录 一、什么是数据结构 二、时间复杂度&#xff0c;空间复杂度 2.1 时间复杂度&#xff0c;空间…

传输层7——TCP拥塞控制(重点!!!)

目录 一、认识拥塞控制 1、什么叫做拥塞&#xff1f; 2、拥塞的特点 3、流量控制 VS 拥塞控制 二、TCP如何防止拥塞&#xff1f; 1、慢开始 2、拥塞避免 3、3重复确认 和 快重传算法 4、快恢复算法 5、总结 三、主动队列管理AQM 1、技术背景 2、AQM思 想和实现策略…

[64]最小路径和⭐

[64]最小路径和⭐ 题目描述 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 **说明&#xff1a;**每次只能向下或者向右移动一步。 示例输入 示例 1&#xff1a; 输入&#xff1a;grid …

AI技术架构:从基础设施到应用

人工智能&#xff08;AI&#xff09;的发展&#xff0c;正以前所未有的速度重塑我们的世界。了解AI技术架构&#xff0c;不仅能帮助我们看懂 AI 的底层逻辑&#xff0c;还能掌握其对各行业变革的潜力与方向。 一、基础设施层&#xff1a;AI 技术的坚实地基 基础设施层是 AI 技…

每日计划-1213

1. 完成 SQL2 查询多列 https://www.nowcoder.com/exam/oj?page1tabSQL%E7%AF%87topicId199 2. 八股部分 1) C 中面向对象编程如何实现数据隐藏&#xff1f; 在c中&#xff0c;可以将数据成员声明为私有或受保护&#xff0c;并提供公有的成员函数来访问和修改这些数据成员&am…

【ADS射频电路设计教程】1. ADS基本操作

下面介绍ADS中主要仿真器的使用 1. 直流仿真 直流仿真器在控制面板的simulator-dc 直流仿真器 但是ADS自带有很多仿真器&#xff0c;可以直接来调用 选用晶体管电流扫描的模板 就可以输出模板 然后调入晶体管模型 然后要设置扫描的电压&#xff0c;选择dc仿真器对vds进行扫描…

EasyGBS点对点穿透P2P远程访问技术在安防视频监控中的应用

随着信息技术的快速发展&#xff0c;安防视频监控系统在公共安全领域的应用变得越来越广泛。传统的视频监控系统多依赖于中心服务器进行视频流的集中处理和分发&#xff0c;这不仅增加了网络带宽的负担&#xff0c;还可能成为系统性能瓶颈。为了解决这些问题&#xff0c;P2P&am…

CTFHub 命令注入-综合练习(学习记录)

综合过滤练习 命令分隔符的绕过姿势 ; %0a %0d & 那我们使用%0a试试&#xff0c;发现ls命令被成功执行 /?ip127.0.0.1%0als 发现一个名为flag_is_here的文件夹和index.php的文件&#xff0c;那么我们还是使用cd命令进入到文件夹下 http://challenge-438c1c1fb670566b.sa…

美团2024年秋招第一场笔试【前端移动端】

美团2024年秋招第一场笔试【前端&移动端】 2024/12/12 1.在一个长度为28的数组中删除第5个元素时&#xff08;元素序号&#xff1a;1~28&#xff09;&#xff0c;需要向前移动&#xff08;23&#xff09;个元素。 2.如下图一个树型结构&#xff0c;其结点E在树的中序遍历…

2025周易算命网站搭建详细方法+源码选择php环境的配置

以下是一个详细的搭建教程&#xff0c;包括网站分类、环境配置、程序设计和功能实现。 1. 环境准备 1.1 服务器选择 操作系统: Linux&#xff08;推荐使用Ubuntu或CentOS&#xff09;Web服务器: Nginx数据库: MySQLPHP版本: 7.4.x&#xff08;确保小于8.0&#xff09; 1.2 安…