系列文章
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结构的一个实例,它提供对以下设置的访问:
- depthBits是用于深度缓冲区的每像素位数(0表示禁用)
- stencilBits是用于模具缓冲区的每像素位数(0表示禁用)
- antialiasingLevel是多重采样级别
- 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