Using OpenGL in a SFML window

这篇教程详细介绍了如何在SFML环境中集成OpenGL,创建OpenGL窗口,管理上下文,以及在多线程中进行渲染。通过sf::Window类,可以方便地创建支持OpenGL的窗口,并调整其设置。同时,文章还探讨了如何在多个窗口间切换,以及在没有窗口的情况下使用无窗口上下文。最后,讨论了在主线程和渲染线程中安全地使用OpenGL的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列文章

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 篇

Introduction

本教程不是关于OpenGL本身,而是关于如何使用SFML作为OpenGL的环境,以及如何将它们混合在一起。

正如您所知,OpenGL最重要的特性之一是可移植性。但是单靠OpenGL还不足以创建完整的程序:您需要一个窗口、渲染上下文、用户输入等。您别无选择,只能编写特定于操作系统的代码来自行处理这些内容。这就是sfml窗口模块发挥作用的地方。让我们看看它如何允许您使用OpenGL。


Including and linking OpenGL to your application

OpenGL头文件在每个操作系统上都不相同。因此,SFML提供了一个“抽象”头文件,负责为您包含正确的文件。

#include <SFML/OpenGL.hpp>

此标题包括OpenGL函数,而不包括其他内容。人们有时认为SFML自动包含OpenGL扩展头,因为SFML本身加载扩展,但这是一个实现细节。从用户的角度来看,必须像处理任何其他外部库一样处理OpenGL扩展加载。

然后需要将程序链接到OpenGL库。与头文件不同,SFML不能提供统一的链接OpenGL的方法。因此,您需要根据所使用的操作系统(“Windows上的opengl32”、“Linux上的GL”等)知道要链接到哪个库。

OpenGL函数以“gl”前缀开头。请记住,当您遇到链接器错误时,它将帮助您找到忘记链接的库。


Creating an OpenGL window

因为SFML是基于OpenGL的,所以它的窗口可以无需任何额外的努力就可以进行OpenGL调用。

sf::Window window(sf::VideoMode(800, 600), "OpenGL");

// it works out of the box
glEnable(GL_TEXTURE_2D);
...

如果您认为它太自动化,sf::Window的构造函数有一个额外的参数,允许您更改底层OpenGL上下文的设置。此参数是sf::ContextSettings结构的一个实例,它提供对以下设置的访问:

  1. depthBits是用于深度缓冲区的每像素位数(0表示禁用)
  2. stencilBits是用于模具缓冲区的每像素位数(0表示禁用)
  3. antialiasingLevel是多重采样级别
  4. majorVersion和minorVersion构成所需的OpenGL版本
sf::ContextSettings settings;
settings.depthBits = 24;
settings.stencilBits = 8;
settings.antialiasingLevel = 4;
settings.majorVersion = 3;
settings.minorVersion = 0;

sf::Window window(sf::VideoMode(800, 600), "OpenGL", sf::Style::Default, settings);

如果图形卡不支持这些设置中的任何一个,SFML将尝试查找最接近的有效匹配。例如,如果4x抗锯齿太高,它会尝试2x,然后回落到0。

在任何情况下,您都可以检查SFML在getSettings函数中实际使用了哪些设置:

sf::ContextSettings settings = window
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值