You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
		
		
		
		
		
			
		
			
				
					
					
						
							328 lines
						
					
					
						
							11 KiB
						
					
					
				
			
		
		
	
	
							328 lines
						
					
					
						
							11 KiB
						
					
					
				/*! | 
						|
 | 
						|
@page quick Getting started — A quick introduction | 
						|
 | 
						|
@tableofcontents | 
						|
 | 
						|
This guide will show how to write simple OpenGL applications using GLFW 3.  It | 
						|
will introduce a few of the most commonly used functions, but there are many | 
						|
others.  To see detailed documentation on any GLFW function, just click on its | 
						|
name. | 
						|
 | 
						|
This guide assumes no experience with earlier versions of GLFW.  If you | 
						|
have used GLFW 2.x in the past, you should also read the | 
						|
[transition guide](@ref moving). | 
						|
 | 
						|
 | 
						|
@section quick_include Including the GLFW header | 
						|
 | 
						|
In the files of your program where you use OpenGL or GLFW, you need to include | 
						|
the GLFW 3 header file. | 
						|
 | 
						|
@code | 
						|
#include <GLFW/glfw3.h> | 
						|
@endcode | 
						|
 | 
						|
This defines all the constants, types and function prototypes of the GLFW API. | 
						|
It also includes the OpenGL header, and defines all the constants and types | 
						|
necessary for it to work on your platform. | 
						|
 | 
						|
For example, under Windows you are normally required to include `windows.h` | 
						|
before including `GL/gl.h`.  This would make your source file tied to Windows | 
						|
and pollute your code's namespace with the whole Win32 API. | 
						|
 | 
						|
Instead, the GLFW header takes care of this for you, not by including | 
						|
`windows.h`, but rather by itself duplicating only the necessary parts of it. | 
						|
It does this only where needed, so if `windows.h` *is* included, the GLFW header | 
						|
does not try to redefine those symbols. | 
						|
 | 
						|
In other words: | 
						|
 | 
						|
- Do *not* include the OpenGL headers yourself, as GLFW does this for you | 
						|
- Do *not* include `windows.h` or other platform-specific headers unless | 
						|
  you plan on using those APIs directly | 
						|
- If you *do* need to include such headers, do it *before* including the | 
						|
  GLFW one and it will detect this | 
						|
 | 
						|
Starting with version 3.0, the GLU header `glu.h` is no longer included by | 
						|
default.  If you wish to include it, define `GLFW_INCLUDE_GLU` before the | 
						|
inclusion of the GLFW header. | 
						|
 | 
						|
@code | 
						|
#define GLFW_INCLUDE_GLU | 
						|
#include <GLFW/glfw3.h> | 
						|
@endcode | 
						|
 | 
						|
 | 
						|
@section quick_init_term Initializing and terminating GLFW | 
						|
 | 
						|
Before you can use most GLFW functions, the library must be initialized.  This | 
						|
is done with @ref glfwInit, which returns non-zero if successful, or zero if an | 
						|
error occurred. | 
						|
 | 
						|
@code | 
						|
if (!glfwInit()) | 
						|
    exit(EXIT_FAILURE); | 
						|
@endcode | 
						|
 | 
						|
When you are done using GLFW, typically at the very end of the program, you need | 
						|
to call @ref glfwTerminate. | 
						|
 | 
						|
@code | 
						|
glfwTerminate(); | 
						|
@endcode | 
						|
 | 
						|
This destroys any remaining windows and releases any other resources allocated by | 
						|
GLFW.  After this call, you must call @ref glfwInit again before using any GLFW | 
						|
functions that require it. | 
						|
 | 
						|
 | 
						|
@section quick_capture_error Setting an error callback | 
						|
 | 
						|
Most events are reported through callbacks, whether it's a key being pressed, | 
						|
a GLFW window being moved, or an error occurring.  Callbacks are simply | 
						|
C functions (or C++ static methods) that are called by GLFW with arguments | 
						|
describing the event. | 
						|
 | 
						|
In case @ref glfwInit or any other GLFW function fails, an error is reported to | 
						|
the GLFW error callback.  You can receive these reports by setting the error | 
						|
callback.  The callback function itself should match the signature of @ref | 
						|
GLFWerrorfun.  Here is a simple error callback that just prints the error | 
						|
description to `stderr`. | 
						|
 | 
						|
@code | 
						|
void error_callback(int error, const char* description) | 
						|
{ | 
						|
    fputs(description, stderr); | 
						|
} | 
						|
@endcode | 
						|
 | 
						|
Setting the callback, so GLFW knows to call it, is done with @ref | 
						|
glfwSetErrorCallback.  This is one of the few GLFW functions that may be called | 
						|
before @ref glfwInit, which lets you be notified of errors during | 
						|
initialization, so you should set it before you do anything else with GLFW. | 
						|
 | 
						|
@code | 
						|
glfwSetErrorCallback(error_callback); | 
						|
@endcode | 
						|
 | 
						|
 | 
						|
@section quick_create_window Creating a window and context | 
						|
 | 
						|
The window (and its context) is created with @ref glfwCreateWindow, which | 
						|
returns a handle to the created window.  For example, this creates a 640 by 480 | 
						|
windowed mode window: | 
						|
 | 
						|
@code | 
						|
GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", NULL, NULL); | 
						|
@endcode | 
						|
 | 
						|
If window creation fails, `NULL` will be returned, so you need to check whether | 
						|
it did. | 
						|
 | 
						|
@code | 
						|
if (!window) | 
						|
{ | 
						|
    glfwTerminate(); | 
						|
    exit(EXIT_FAILURE); | 
						|
} | 
						|
@endcode | 
						|
 | 
						|
This handle is then passed to all window related functions, and is provided to | 
						|
you along with input events, so you know which window received the input. | 
						|
 | 
						|
To create a full screen window, you need to specify which monitor the window | 
						|
should use.  In most cases, the user's primary monitor is a good choice.  You | 
						|
can get this with @ref glfwGetPrimaryMonitor.  To make the above window | 
						|
full screen, just pass along the monitor handle: | 
						|
 | 
						|
@code | 
						|
GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", glfwGetPrimaryMonitor(), NULL); | 
						|
@endcode | 
						|
 | 
						|
Full screen windows cover the entire display area of a monitor, have no border | 
						|
or decorations, and change the monitor's resolution to the one most closely | 
						|
matching the requested window size. | 
						|
 | 
						|
When you are done with the window, destroy it with the @ref glfwDestroyWindow | 
						|
function. | 
						|
 | 
						|
@code | 
						|
glfwDestroyWindow(window); | 
						|
@endcode | 
						|
 | 
						|
Once this function is called, no more events will be delivered for that window | 
						|
and its handle becomes invalid. | 
						|
 | 
						|
 | 
						|
@section quick_context_current Making the OpenGL context current | 
						|
 | 
						|
Before you can use the OpenGL API, it must have a current OpenGL context.  You | 
						|
make a window's context current with @ref glfwMakeContextCurrent.  It will then | 
						|
remain as the current context until you make another context current or until | 
						|
the window owning it is destroyed. | 
						|
 | 
						|
@code | 
						|
glfwMakeContextCurrent(window); | 
						|
@endcode | 
						|
 | 
						|
 | 
						|
@section quick_window_close Checking the window close flag | 
						|
 | 
						|
Each window has a flag indicating whether the window should be closed.  This can | 
						|
be checked with @ref glfwWindowShouldClose.   | 
						|
 | 
						|
When the user attempts to close the window, either by pressing the close widget | 
						|
in the title bar or using a key combination like Alt+F4, this flag is set to 1. | 
						|
Note that **the window isn't actually closed**, so you are expected to monitor | 
						|
this flag and either destroy the window or give some kind of feedback to the | 
						|
user. | 
						|
 | 
						|
@code | 
						|
while (!glfwWindowShouldClose(window)) | 
						|
{ | 
						|
    // Keep running | 
						|
} | 
						|
@endcode | 
						|
 | 
						|
You can be notified when user is attempting to close the window by setting | 
						|
a close callback with @ref glfwSetWindowCloseCallback.  The callback will be | 
						|
called immediately after the close flag has been set. | 
						|
 | 
						|
You can also set it yourself with @ref glfwSetWindowShouldClose.  This can be | 
						|
useful if you want to interpret other kinds of input as closing the window, like | 
						|
for example pressing the escape key. | 
						|
 | 
						|
 | 
						|
@section quick_key_input Receiving input events | 
						|
 | 
						|
Each window has a large number of callbacks that can be set to receive all the | 
						|
various kinds of events.  To receive key press and release events, a | 
						|
[key callback](@ref GLFWkeyfun) is set using @ref glfwSetKeyCallback. | 
						|
 | 
						|
@code | 
						|
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) | 
						|
{ | 
						|
    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) | 
						|
        glfwSetWindowShouldClose(window, GL_TRUE); | 
						|
} | 
						|
@endcode | 
						|
 | 
						|
For event callbacks to actually be called when an event occurs, you need to | 
						|
process events as described below. | 
						|
 | 
						|
 | 
						|
@section quick_render Rendering with OpenGL | 
						|
 | 
						|
Once you have a current OpenGL context, you can use OpenGL normally.  In this | 
						|
tutorial, a multi-colored rotating triangle will be rendered.  The framebuffer | 
						|
size, needed by this example for `glViewport` and `glOrtho`, is retrieved with | 
						|
@ref glfwGetFramebufferSize. | 
						|
 | 
						|
@code | 
						|
int width, height; | 
						|
glfwGetFramebufferSize(window, &width, &height); | 
						|
glViewport(0, 0, width, height); | 
						|
@endcode | 
						|
 | 
						|
However, you can also set a framebuffer size callback using @ref | 
						|
glfwSetFramebufferSizeCallback and call `glViewport` from there. | 
						|
 | 
						|
@code | 
						|
void framebuffer_size_callback(GLFWwindow* window, int width, int height) | 
						|
{ | 
						|
    glViewport(0, 0, width, height); | 
						|
} | 
						|
@endcode | 
						|
 | 
						|
 | 
						|
@section quick_timer Reading the timer | 
						|
 | 
						|
For the triangle to rotate properly, a time source is needed.  GLFW provides | 
						|
@ref glfwGetTime, which returns the number of seconds since @ref glfwInit as | 
						|
a `double`.  The time source used is the most accurate on each platform and | 
						|
generally has micro- or nanosecond resolution. | 
						|
 | 
						|
@code | 
						|
double time = glfwGetTime(); | 
						|
@endcode | 
						|
 | 
						|
 | 
						|
@section quick_swap_buffers Swapping buffers | 
						|
 | 
						|
GLFW windows by default use double buffering.  That means that you have two | 
						|
rendering buffers; a front buffer and a back buffer.  The front buffer is the | 
						|
one being displayed and the back buffer the one you render to. | 
						|
 | 
						|
When the entire frame has been rendered, it is time to swap the back and the | 
						|
front buffers in order to display the rendered frame, and begin rendering a new | 
						|
frame.  This is done with @ref glfwSwapBuffers. | 
						|
 | 
						|
@code | 
						|
glfwSwapBuffers(window); | 
						|
@endcode | 
						|
 | 
						|
 | 
						|
@section quick_process_events Processing events | 
						|
 | 
						|
GLFW needs to communicate regularly with the window system both in order to | 
						|
receive events and to show that it hasn't locked up.  Event processing must be | 
						|
done regularly and is normally done each frame before rendering but after buffer | 
						|
swap. | 
						|
 | 
						|
There are two ways to process pending events.  @ref glfwPollEvents processes | 
						|
only those events that have already been received and then returns immediately. | 
						|
This is the best choice when rendering continually, like most games do. | 
						|
 | 
						|
@code | 
						|
glfwPollEvents(); | 
						|
@endcode | 
						|
 | 
						|
If instead you only need to update your rendering once you have received new | 
						|
input, @ref glfwWaitEvents is a better choice.  It waits until at least one | 
						|
event has been received, putting the thread to sleep in the meantime, and then | 
						|
processes all received events just like @ref glfwPollEvents does.  This saves | 
						|
a great deal of CPU cycles and is useful for, for example, many kinds of editing | 
						|
tools. | 
						|
 | 
						|
@code | 
						|
glfwWaitEvents(); | 
						|
@endcode | 
						|
 | 
						|
 | 
						|
@section quick_example Putting it together: A simple application | 
						|
 | 
						|
Now that you know how to initialize GLFW, create a window and poll for | 
						|
keyboard input, it's possible to create a simple program. | 
						|
 | 
						|
@snippet simple.c code | 
						|
 | 
						|
This program creates a 640 by 480 windowed mode window and starts a loop that | 
						|
clears the screen, renders a triangle and processes events until the user either | 
						|
presses Escape or closes the window. | 
						|
 | 
						|
This program uses only a few of the many functions GLFW provides.  There are | 
						|
guides for each of the areas covered by GLFW.  Each guide will introduce all the | 
						|
functions for that category. | 
						|
 | 
						|
 - @ref intro | 
						|
 - @ref window | 
						|
 - @ref context | 
						|
 - @ref monitor | 
						|
 - @ref input | 
						|
 | 
						|
 | 
						|
@section quick_build Compiling and linking the program | 
						|
 | 
						|
The complete program above can be found in the source distribution as | 
						|
`examples/simple.c` and is compiled along with all other examples when you | 
						|
build GLFW.  That is, if you have compiled GLFW then you have already built this | 
						|
as `simple.exe` on Windows, `simple` on Linux or `simple.app` on OS X. | 
						|
 | 
						|
This tutorial ends here.  Once you have written a program that uses GLFW, you | 
						|
will need to compile and link it.  How to do that depends on the development | 
						|
environment you are using and is best explained by the documentation for that | 
						|
environment.  To learn about the details that are specific to GLFW, see | 
						|
@ref build. | 
						|
 | 
						|
*/
 | 
						|
 |