SDL2 简明教程(五):OpenGL 绘制

article/2025/10/12 0:11:41

系列文章目录

SDL2 简明教程(一):使用 Cmake 和 Conan 构建 SDL2 编程环境

SDL2 简明教程(二):创建一个空的窗口

SDL2 简明教程(三):显示图片

SDL2 简明教程(四):用 SDL_IMAGE 库导入图片


文章目录

  • 系列文章目录
  • SDL 中使用 OpenGL API 进行绘制

SDL 中使用 OpenGL API 进行绘制

在 SDL 中使用 OpenGL 并不复杂,步骤为:

  1. SDL_CreateWindow 创建窗口时,flag 添加 SDL_WINDOW_OPENGL
  2. 使用 SDL_GL_CreateContext 创建 GL Context
  3. 使用 SDL_GL_MakeCurrent 为当前窗口设置 GL Context。 但其实 SDL_GL_CreateContext 中已经做了这个步骤,不切换 GL Context 的情况下可以忽略调用该函数
  4. 至此,OpenGL Context 设置好了,你只需要调用 OpenGL API 进行绘制即可。

关于 OpenGL 如何使用请参考

  • LearnOpenGL 笔记 - 入门 01 OpenGL
  • LearnOpenGL

接下来进行代码示例说明,下面的示例中使用 OpenGL 绘制了一个 三角形
。完整代码你可以在 opengl_sdl2_example.cpp 找到

//
// Created by user on 2/22/23.
//
#if defined(__cplusplus)
extern "C" {
#endif#define GL_GLEXT_PROTOTYPES#include <SDL.h>
#include <SDL_opengl.h>#if defined(__cplusplus)
};
#endifint main() {SDL_Init(SDL_INIT_VIDEO);SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);static const int width = 800;static const int height = 600;SDL_Window *window =SDL_CreateWindow("", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,width, height, SDL_WINDOW_OPENGL | SDL_WINDOW_ALLOW_HIGHDPI);SDL_GLContext gl_context = SDL_GL_CreateContext(window);SDL_GL_MakeCurrent(window, gl_context);SDL_GL_SetSwapInterval(1); // Enable vsync// opengl operations// create shaders and program// ....// set up vertex data(and buffer(s)) and configure vertex attributesfloat vertices[] = {-0.5f, -0.5f, 0.0f, // left0.5f, -0.5f, 0.0f,  // right0.0f, 0.5f, 0.0f,   // top};GLuint VBO{0};GLuint VAO{0};glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);// bind the vertex array object first, then bind and set vertex buffers// and then configure vertex attributesglBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void *)0);glEnableVertexAttribArray(0);glBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);bool done = false;for (; !done;) {SDL_Event event;while (SDL_PollEvent(&event)) {if (event.type == SDL_QUIT)done = true;if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window))done = true;}// render// -----glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);// draw out first triangleglUseProgram(shaderProgram);glBindVertexArray(VAO);glDrawArrays(GL_TRIANGLES, 0, 3);SDL_GL_SwapWindow(window);SDL_Delay(1);}SDL_DestroyWindow(window);SDL_Quit();return 0;
}
  • 在 include <SDL_opengl.h> 之前,定义 GL_GLEXT_PROTOTYPES,这样才可以使用 OpenGL 3 中的一些接口,例如 glGenBuffers
  • SDL_GL_SetAttribute 设置 OpenGL 的一些参数,其中对于 OpenGL Version 的设置很重要。代码中,我们指定使用 3.2 core
  • SDL_CreateWindow 创建 window,需要给定 SDL_WINDOW_OPENGL
  • SDL_GL_CreateContext 创建 OpenGL Context,SDL_GL_MakeCurrent 为当前 window 设置 context
  • 接来下,都是 OpenGL API 相关的操作了,包括 shader 编译、vao 和 vbo 的设置等等
  • for 循环中,进行 OpenGL 绘制,同时处理 SDL 事件

在这里插入图片描述


http://chatgpt.dhexx.cn/article/gNT3L092.shtml

相关文章

SDL —— SDL2及API简介

SDL2框架 SDL&#xff08; Simple DirectMedia Layer&#xff09; 是一套开放源代码的跨平台多媒体开发库&#xff0c; 使用 C 语 言写成。 SDL 提供了数种控制图像、 声音、 输出入的函数&#xff0c; 让开发者只要用相同或是相似的 代码就可以开发出跨多个平台&#xff08; L…

SDL2学习笔记(一):SDL2初步

一、Windows系统下的安装 MinGW ①安装MinGW并配置好环境变量&#xff1b; ②官网下载SDL for MinGW&#xff1b; ③将解压文件中的 .\i686-w64-mingw32\include\SDL2 复制到 .\MinGW\include &#xff1b; //有的设备需要用x86_64-w64-mingw32中的文件&#xff0c;下同 ④将解…

ISCC2021—ISCC客服一号冲冲冲(二)

ISCC客服一号冲冲冲&#xff08;二&#xff09; 呦&#xff0c;又见面了&#xff0c;狗子 打开链接&#xff0c;发现登录接口似乎是个图片截了一块啊&#xff0c;把图片下载下来&#xff0c;lsp隐写发现源代码&#xff0c;同时php弱比较登录页面 &#xff08;都看到这里啦&a…

ISCC2021——web部分

练武 ISCC客服冲冲冲&#xff08;一&#xff09; 该题目需要左边的客服票数高于右边的 我会的就两种方法&#xff0c;毕竟是废物嘛&#xff0c;允许 1、 把左右按钮换一下 然后就 2、在控制台输入 回车&#xff0c;走你 你涨啊&#xff0c;涨啊&#xff0c;接着涨啊…没吃…

ISCC,Misc:隐秘的信息

解码得到解压密码 解压出一张图&#xff0c;低位时头部显示有一串字符被 f f f f f 包裹&#xff0c;将可疑的字符单独拿出来 由于单个字符可能是由二进制错位导致的 fffffa4a9a1a1bd9 9b7a1a9ba34b127a 0b8abbc20b7a2b7a 2b524b43e9f8007f fffc7e3fe00fff00 71fffffffffffff…

ISCC理论题小解

B 域、工作组和家庭组表示在网络中组织计算机的不同方法。它们之间的主要区别是对网络中的计算机和其他资源的管理方式。 网络中运行 Windows 的计算机必须属于某个工作组或某个域。家庭网络中运行 Windows 的计算机也可以属于某个家庭组&#xff0c;但这不是必需的。 家庭网络…

ISCC web4

ISCC web4 打开网页看到&#xff1a; 代码审计。。。。。。。。。 一开始以为是sha256解密&#xff0c;结果半天搞不出来 后来才知道parse_url函数存在变量覆盖漏洞 因为要存在action参数&#xff0c;传入actionauth key也要传入key0 由于key是要被sha256加密的 传入一个has…

ISCC2022 擂台misc

文章目录 666扫&#xff01;弱雪真扫黑暗森林PNGstego这是压缩包吗&#xff1f;小 数 学习了 P.S&#xff1a;抬杠就是你对 666 考查知识点:伪加密、猜谜的steghide弱口令爆破、流量分析、gif帧、键盘密码、AES 下载下来是一个压缩包&#xff0c;但是图片显示需要密码&#xf…

ISCC-2022 部分wp

目录 Web冬奥会解题步骤详细描述解题收获 Easy_sql解题步骤详细描述解题收获 Pop2022解题步骤详细描述解题收获 findme解题步骤详细描述 爱国敬业好青年-2解题步骤详细描述解题收获 这是一道代码审计题 Misc单板小将苏翊鸣解题步骤详细描述解题收获 2022冬奥会解题步骤详细描述…

ISCC——部分题wp

练武场 WEB&#xff1a; ISCC客服冲冲冲&#xff08;一&#xff09; 知识点&#xff1a; js解密 解题思路&#xff1a; 1.打开后出现投票的页面 2.查看源码 发现可疑的function.js 3.function.js&#xff0c;js加密 var _0xodqjsjiami.com.v6,_0x3e40[_0xodq,\x77\x35\x4c\x…

ISCC ISCC客服一号冲冲冲(二)

这个题其实是转自Bugku的Login4 (CBC字节翻转攻击) 题目有提示密码就是web1 的flag 然后登入 这里有回显&#xff0c;然后我们换一下 下面cookie里的iv和cipher看着就像CBC加密的方式 利用的就是CBC解密的特点&#xff1a;前16个密文字符用来解密接下来的一组16个密文&#…

ISCC 2021 SSTI

文章目录 FUZZ测试&#xff1a;了解一下SSTI常用的语句格式&#xff1a;说一下构造思路&#xff1a;构造题外话&#xff1a;&#xff08;反转结果字符串&#xff09; 再ISCC中遇到了一道SSTI的题目&#xff0c;拿来练练手&#xff0c;题目难度的化&#xff0c;相对于普遍的过滤…

[ISCC 2021]部分wp

文章目录 海市蜃楼-1Retrieve the passcode我的折扣是多少小明的表情包Hack the Victim美人计李华的红包小明的宠物兔ISCC客服冲冲冲&#xff08;一&#xff09;这是啥Web01登录tornadowhich is the true isccISCC客服一号冲冲冲&#xff08;二&#xff09;Explore Rubylovely …

ISCC-WP

练武wp: MISC 2022冬奥会 图片在kali中&#xff0c;没有显示缩略图&#xff0c;其宽高很可能被修改过 修改图片的长之后&#xff0c;下面出些一些&#x编码&#xff0c;这是html实体编码。进行unicode解码得到 冰敦敦的小伙伴经常被人冷落&#xff0c;你知道他的原型是什…

ISCC认证的申请条件是什么?

ISCC国际可持续发展和碳认证介绍 ISCC - International Sustainability & Carbon Certification 国际可持续发展和碳认证&#xff0c;是满足欧盟《可再生能源指令》&#xff08;2009/28/ECRED&#xff09;的第一个标准&#xff0c;于2010年开始实施&#xff0c;现已发展成为…

ISCC 2022 部分

目录 web冬奥会popfindme爱国敬业好青年-2Easy-SQL让我康康&#xff01;这是一道代码审计题 MISC隐秘的信息真相只有一个单板小将苏翊鸣藏在星空中的诗-1藏在星空中的诗-22022冬奥会降维打击 REVERSEGetTheTableBobs Code web 冬奥会 <?phpshow_source(__FILE__);$Step1F…

ISCC 2022 wp

目录 解题步骤及过程&#xff1a; 练武题WP&#xff1a; Web: 冬奥会&#xff1a; 爱国敬业好青年-2&#xff1a; Pop2022&#xff1a; 这是一道代码审计题&#xff1a; Easy-SQL&#xff1a; Findme&#xff1a; 让我康康!&#xff1a; misc&#xff1a; 2022冬奥…

ISCC-2021

文章目录 一、ISCC客服冲冲冲&#xff08;一&#xff09;二、这是啥三、Web01四、ISCC客服一号冲冲冲&#xff08;二&#xff09;五、登录六、which is the true iscc 一、ISCC客服冲冲冲&#xff08;一&#xff09; 可以下载一个点击器&#xff0c;或者直接F12在html中改&…

ISCC 2021 WP

文章目录 MISC李华的红包Retrieve the passcode海市蜃楼-1美人计我的折扣是多少区块链Hack the Victim检查一下小明的宠物兔变异的SM2 WEBISCC客服冲冲冲&#xff08;一&#xff09;这是啥Web01ISCC客服一号冲冲冲&#xff08;二&#xff09;登录which is the true iscclovely …

2021-ISCC

webweb01-ISCC客服冲冲冲&#xff08;一&#xff09;web02-这是啥web3-web01 MISCMISC01-Retrieve the passcodeMISC02-我的折扣是多少MISC03-海市蜃楼-1MISC04-美人计MISC05-检查一下 web web01-ISCC客服冲冲冲&#xff08;一&#xff09; 1.写个脚本&#xff08;不会&#x…