[SFML] 多个OpenGL上下文

article/2025/9/30 13:27:31

代码

#include <iostream>
#include <gl/glew.h>
#include <SFML/Graphics.hpp>
#include <windows.h>int main()
{auto getInstance = [](){return (HINSTANCE)GetModuleHandle(nullptr);};auto debug = [](GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam){std::cout << message << std::endl;};const char* vsource ="#version 330 core\n""layout(location=0)in vec3 a_position;""void main()""{gl_Position = vec4(a_position,1.0);}";const char* fsource ="#version 330 core\n""out vec4 o_color;""void main()""{o_color = vec4(0.0,0.0,1.0,1.0);}";const float ver[] ={0.0f,0.5f,0.0f,-0.5f,-0.5f,0.0f,0.5f,-0.5f,0.0,};sf::RenderWindow main_window(sf::VideoMode(640,480),"Multi Contexts");sf::Event main_event;sf::WindowHandle main_handle = main_window.getSystemHandle();HWND sub_window_handle_1 = CreateWindowEx(WS_EX_WINDOWEDGE,TEXT("static"),TEXT(""),WS_VISIBLE|WS_CHILD,0,0,320,480,main_handle,nullptr,getInstance(),nullptr);sf::RenderWindow sub_window_1(sub_window_handle_1);sf::ContextSettings cs(8,8,8,3,3,sf::ContextSettings::Attribute::Core|sf::ContextSettings::Attribute::Debug);HWND sub_window_handle_2 = CreateWindowEx(WS_EX_WINDOWEDGE,TEXT("static"),TEXT(""),WS_VISIBLE|WS_CHILD,320,0,320,480,main_handle,nullptr,getInstance(),nullptr);sf::RenderWindow sub_window_2(sub_window_handle_2,cs);sub_window_2.setActive(true);std::cout << (glewInit() == GLEW_OK) << std::endl;glDebugMessageCallback(debug,nullptr);GLuint vs = glCreateShader(GL_VERTEX_SHADER);GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(vs,1,&vsource,nullptr);glShaderSource(fs,1,&fsource,nullptr);glCompileShader(vs);glCompileShader(fs);GLuint program = glCreateProgram();glAttachShader(program,vs);glAttachShader(program,fs);glLinkProgram(program);glDeleteShader(vs);glDeleteShader(fs);GLuint vao;glGenVertexArrays(1,&vao);glBindVertexArray(vao);GLuint vbo;glGenBuffers(1,&vbo);glBindBuffer(GL_ARRAY_BUFFER,vbo);glBufferData(GL_ARRAY_BUFFER,sizeof(ver),ver,GL_STATIC_DRAW);glEnableVertexAttribArray(0);glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3 * sizeof(float),nullptr);glBindVertexArray(0);glBindBuffer(GL_ARRAY_BUFFER,0);glDeleteBuffers(1,&vbo);//sub_window_2.setActive(false);sf::RectangleShape rect(sf::Vector2f(160,240));rect.setFillColor(sf::Color::Red);rect.setPosition(sf::Vector2f(80,120));while(main_window.isOpen()){while (main_window.pollEvent(main_event)){if(main_event.type == sf::Event::Closed){main_window.close();}else if(main_event.type == sf::Event::KeyPressed){if(main_event.key.code == sf::Keyboard::Key::Escape){main_window.close();}}}/*main_window.clear();main_window.display();*/sub_window_1.clear();sub_window_1.draw(rect);sub_window_1.display();sub_window_2.setActive(true);glClear(GL_COLOR_BUFFER_BIT);glUseProgram(program);glBindVertexArray(vao);glDrawArrays(GL_TRIANGLES,0,3);glBindVertexArray(0);sub_window_2.setActive(false);sub_window_2.display();}sub_window_2.setActive(true);glDeleteVertexArrays(1,&vao);glDeleteProgram(program);sub_window_2.setActive(false);return 0;
}

稍微讲一下

这里创建了一个主窗口(main_window),之后再主窗口内创建了两个小窗口(sub_window),一个是用默认上下文的,另一个是OpenGL3.3的上下文。
窗口创建可以看[C++] [SFML] 基于Win32的SFML程序。

效果

在这里插入图片描述
但是最后出现了奇怪的日志,表示没法启用上下文,让人困惑

Failed to activate OpenGL context:
Failed to activate the window’s context
Failed to activate OpenGL context:
Failed to activate the window’s context
Failed to activate OpenGL context:
Failed to activate the window’s context
Failed to activate OpenGL context:
Failed to activate the window’s context
Failed to activate OpenGL context:
Failed to activate the window’s context
Failed to activate OpenGL context:
Failed to activate OpenGL context:


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

相关文章

SFML配置问题

先去下载安装包&#xff0c;这里我就不多说了&#xff0c;我想说的是其中的报错问题&#xff0c;按照我所说的对照下去&#xff0c;一般不会出现报错现象。 ** 第一步&#xff1a; **找到项目属性&#xff0c;这里我选择所有配置和所有平台&#xff0c;你们也可以选择其他的。…

SFML+vs2019安装

SFMLvs2019安装 1.创建一个c空项目 2.打开属性管理器 3.添加新项目属性表 在64下单击鼠标右键 添加成功后回到属性表64找到刚刚添加的属性表单击鼠标右键–>属性单击 找到SFML安装目录的include&#xff0c;复制路径粘贴到C/C->常规–>附加包含目录 找到SFM…

SFML初学-俄罗斯方块实现

偶然看到大神使用 SFML 制作游戏&#xff0c;简单学习了一下这个库的使用并且仿照YouTube上大神的思路做了一个俄罗斯方块&#xff0c;目前只实现了出现方块、消除方块的功能&#xff0c;随着慢慢学习一点点继续修改吧&#xff1b; 资源&#xff1a; 源码&#xff1a; /*******…

使用c++SFML制作月圆之夜总集篇

写在开头 重新以时间线的形式整理一下去年使用c的SFML库制作月圆之夜&#xff08;游戏程序设计大作业&#xff09;的开发过程&#xff0c;括号里面是新的补充以及对一年前自己的吐槽 因为是在大二转专业后做首次接触游戏开发后才做的&#xff0c;当时c学习得并不好&#xff0…

SFML loadFromFile()出错:failed to load image

解决方法&#xff1a;确保你的依赖项和你的运行库一致。 如果你的附加依赖项&#xff08;即动态链接库的.lib文件&#xff09;是debug版本&#xff0c;即以-d结尾。那么你的运行库也必须为debug版&#xff0c;即MDd。&#xff08;如下&#xff09; 附加依赖项的位置&#xff1…

用c++和SFML实现简易的界面版贪吃蛇

运行截图 等待开始界面 运行过程 失败界面截图 SFML配置 csdn上面已经有很多SFML配置的blog&#xff0c;随便就能搜到。正常配置好SFML后&#xff0c;还需要将字体ttf文件放在源代码同一目录和exe同一目录中&#xff0c;不然无法显示字符 代码部分 下面贴上各个部分的代码 …

VS2017、VS2019配置SFML

一、sfml官网下载32位的版本 一样的设置&#xff0c;64位的版本我没有成功&#xff0c;用不了。 https://www.sfml-dev.org/ bin目录下的文件拷贝到System32和SysWOW64里面。 二、 鼠标右击红色处&#xff0c;弹出菜单&#xff0c;点最后那个属性。 如果不是win32&#xff0c;…

VS2019配置SFML

VS2019配置SFML 1.下载安装SFML SDK 网址&#xff1a;https://www.sfml-dev.org/download.php 解压并放在文件夹里&#xff0c;记住这个路径。 在我的电脑中这个路径是F:\CProjects\_library\SFML-2.5.1 2.VS新建一个C控制台项目 我命名为SfmlTest&#xff0c;并放在常用的项…

sfml-tutorials 官方教程 windows篇

系列文章 SFML-windows 篇 SFML-Events explained 篇 SFML-Keyboard, mouse and joystick 篇 SFML-Using OpenGL in a SFML window 篇 SFML-Drawing 2D stuff 篇 SFML-Shapes 篇 SFML-Sprites and textures 篇 文章目录 系列文章打开一个windows执行windows绘制windows控制帧速…

SFML基础

原文地址&#xff1a;https://www.cnblogs.com/karl07/p/10285692.html (1) 窗口和交互 创建一个新窗口&#xff1a; sf::RenderWindow window(sf::VideoMode(500,500),"new window"); 但是光创建一个窗口并不能显示 还要加一个循环 while (window.isOpen()){sf:…

引擎开发四: SFML库及使用

SFML 是多媒体库&#xff0c;它为PC的各个组件提供简单的界面&#xff0c;用来简化游戏和多媒体应用程序的开发。 主要由五个模块组成&#xff0c;分别是&#xff1a;系统&#xff0c;窗口&#xff0c;图形&#xff0c;音频和网络。 SFML 是跨平台的&#xff0c;通过 SFML&…

【C++】开源:多媒体SFML库使用入门

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍SFML库使用。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习知识&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&#…

使用SFML框架打造属于自己的俄罗斯方块

目录 一、效果展示 二、游戏说明 三、开发环境 四、代码展示 五、代码详解 1.游戏区域表示 2.方块表示 3.方块旋转 4.消行处理 六、个性化定制 七、结语 一、效果展示 二、游戏说明 相信大家都玩过俄罗斯方块&#xff0c;五种按键就能带来极高的可玩性。如果想要开发…

超详细!SFML库vs2022配置教程

1.官网下载SFML 官方网址&#xff1a;SFML 点击下载 根据自己电脑选择合适的版本下载 我的电脑是64位的 下载完成之后将文件放在一个自己方便找到的地方 2.vs2022配置 选择空项目 添加cpp源文件 附加包含目录 添加你SFML中的include路径 例如&#xff1a; 添加SFML中的li…

SFML学习笔记(1)——初识SFML

一、SFML SFML 是多媒体库&#xff0c;它为PC的各个组件提供简单的界面&#xff0c;用来简化游戏和多媒体应用程序的开发。 SFML分成以下五个模块&#xff0c;这些模块相互独立&#xff0c;也可以根据需要组合在一起: System(系统)&#xff1a;一个核心模块&#xff0c;它定义…

找出数组中第k大的数

给定一个数组&#xff0c;找出数组中第k大的数。其实现代码如下: package com.threeTop.www;/*** 找出数组中第k大的数* author wjgs**/ public class FindK {public static void find(int[]array,int begin,int end,int k){int ipartition(array,begin,end);if(i1>k){//左半…

n个数中找最大数c语言,N个数中找到第K大的数值(C语实现)

N个数中找到第K大的数值(C语实现) N个数中找到第K大的数值(C语实现) 研究生了,选了计算机算法这门课程,这周布置了一个作业,在OJ上做:**N个数中找到第K大的数值**。大一简单学过C语言基础,目前只能用C语言编程,后续会学C++编程。 分享一份不超时的C语代码~ 测试例子: 思…

快速排序计算第K大的数

先说结论&#xff0c;最终版本代码如下&#xff1a; public class KthNum {public static int k 2;public static boolean bigK false;public static void main(String[] args) {int arr[] {3, 2, 3, 1, 7, 4, 5, 5, 6};int kNum quickSort(arr);System.out.println("…

寻找第K大的数 C语言实现的一种方法

描述 在一个数组中&#xff0c;找到第K 大的数值一个数组&#xff0c;如&#xff1a;[3,2,1,5,6,4] &#xff0c;输入 2&#xff0c;返回&#xff1a;5也就是这个K的取值&#xff0c;是从 1 开始的&#xff0c;不超过数组的最大个数 解决思路 可以使用任意的排查函数&#x…

C++——寻找第k大的数

给出一个数组&#xff0c;找出数组的第k大的数&#xff1a;基于快速排序的思路&#xff0c;每次快排后&#xff0c;基准的左边都是比其小的数&#xff0c;右边都是比其大的数&#xff0c;一次快排结束后&#xff0c;若基准所处的位置正好是第k大&#xff08;即基准右边有k-1个数…