+using namespace glm;
+
+int main( void )
+{
+ // Initialise GLFW
+ if( !glfwInit() )
+ {
+ fprintf( stderr, "Failed to initialize GLFW\n" );
+ return -1;
+ }
+
+ glfwOpenWindowHint(GLFW_FSAA_SAMPLES, 4);
+ glfwOpenWindowHint(GLFW_WINDOW_NO_RESIZE,GL_TRUE);
+ glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3);
+ glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 3);
+ glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
+
+ // Open a window and create its OpenGL context
+ if( !glfwOpenWindow( 1024, 768, 0,0,0,0, 32,0, GLFW_WINDOW ) )
+ {
+ fprintf( stderr, "Failed to open GLFW window. If you have an Intel GPU, they are not 3.3 compatible. Try the 2.1 version of the tutorials.\n" );
+ glfwTerminate();
+ return -1;
+ }
+
+ // Initialize GLEW
+ if (glewInit() != GLEW_OK) {
+ fprintf(stderr, "Failed to initialize GLEW\n");
+ return -1;
+ }
+
+ glfwSetWindowTitle( "Playground" );
+
+ // Ensure we can capture the escape key being pressed below
+ glfwEnable( GLFW_STICKY_KEYS );
+
+ // Dark blue background
+ glClearColor(0.0f, 0.0f, 0.3f, 0.0f);
+
+ do{
+ // Draw nothing, see you in tutorial 2 !
+
+ // Swap buffers
+ glfwSwapBuffers();
+
+ } // Check if the ESC key was pressed or the window was closed
+ while( glfwGetKey( GLFW_KEY_ESC ) != GLFW_PRESS &&
+ glfwGetWindowParam( GLFW_OPENED ) );
+
+ // Close OpenGL window and terminate GLFW
+ glfwTerminate();
+
+ return 0;
+}
+```
+
+* Compile the project.
+
+You will have many compiler errors. We will analyse all of them, one by one.
+
+# Troubleshooting
+
+The error messages below are for Visual Studio 2010, but they are more or less similar on GCC.
+
+## Visual Studio - fatal error C1083: Cannot open filetype file: 'GL/glew.h' : No such file or directory
+
+(or whichever other file)
+
+Some headers are in weird locations. For instance, GLEW include files are located in external/glew-x.y.z/include/. The compiler has no way to magically guess this, so you have to tell him. In the project settings, add the appropriate path in the COMPILER (not linker) options.
+
+Under *no circumstance* you should copy files in the compiler's default directory (Program Files/Visual Studio/...). Technically, this will work, but it's *very* bad practice.
+
+Also, it's good practice to use relative paths ( ./external/glew/... instead of C:/Users/username/Downloads/... )
+
+As an example, this is what the tutorial's CMake use :
+
+```
+external/glfw-2.7.2/include
+external/glm-0.9.1
+external/glew-1.5.8/include
+```
+
+Repeat until all files are found.
+
+## GCC - fatal error: GL/glew.h: No such file or directory
+
+(or whichever other file)
+
+This means that the library is not installed. If you're lucky, the library is well-known and you just have to install it. This is the case for GLFW, GLEW and GLM :
+
+``` bash
+sudo apt-get install libglfw-dev libglm-dev libglew1.6-dev
+```
+
+If this is not a widespread library, see the answer for Visual Studio above.
+
+## Visual Studio - error LNK2019: unresolved external symbol glfwGetWindowParam referenced in function main
+
+(or whichever other symbol in whichever other function)
+
+Congratulations ! You have a linker error. This is excellent news : this means that the compilation succeeded. Just one last step !
+
+glfw functions are in an external library. You have to tell the linker about this library. Add it in the linker options. Don't forget to add the path to the library.
+
+As an **example**, this is what the Visual project use. The names are a bit unusual because this is a custom build. What's more, GLM doesn't need to be compiled or linked, so it's not here.
+
+```
+external\Debug\GLFW_272.lib
+external\Debug\GLEW_158.lib
+```
+
+If you download these libraries from SourceForge ([GLFW](http://www.glfw.org/download.html), [GLEW](http://glew.sourceforge.net/index.html)) and build a library yourself, you have to specify the correct path. For instance :
+
+```
+C:\Where\You\Put\The\Library\glfw.lib
+C:\Where\You\Put\The\Other\Library\glew32.lib
+```
+
+## GCC - main.cpp: undefined reference to `glfwInit'
+
+(or whichever other symbol in whichever other file)
+
+Same answer than for Visual Studio.
+
+Note that on Linux, GLFW and GLEW (and many others) are usually installed with apt-get or similar : sudo apt-get install libglew-dev libglfw-dev (may vary). When you do that, the library is copied in the compiler's standard directory, so you don't have to specify the path. Just link to glfw and glew as shown in the 1rst section.
+
+## I set everything right, but I still have an "unresolved external symbol" error !
+
+This might me tricky to track down. Here are several options:
+
+### I have a linker error with _imp_glewInit or some other symbol that begins with _imp
+
+This means that the library (in this case, glew) has been compiled as a *static* library, but you're trying to use it as a *dynamic* library. Simply add the following preprocessor directive in your compiler's options (for your own project, not glew's) :
+
+```
+GLEW_STATIC
+```
+
+### I have some other weird problem with GLFW
+
+Maybe GLFW was built as a dynamic library, but you're trying to use it as a static one ?
+
+Try adding the following preprocessor directive :
+
+```
+GLFW_DLL
+```
+
+### I have another linker problem ! Help me, I'm stuck !
+
+Please send us a detailed report and a fully featured zipped project, and we'll add instructions.
+
+### I'd like to solve this myself. What are the generic rules ?
+
+Let's say you're the author of GLFW. You want to provide the function glfwInit().
+
+When building it as a DLL, you have to tell the compiler that glfwInit() is not like any other function in the DLL : it should be seen from others, unlike glfwPrivateImplementationMethodNobodyShouldCareAbout(). This is done by declaring the function "external" (with GCC) or "__declspec(dllexport)" (with Visual).
+
+When you want to use glfw, you need to tell the compiler that this function is not really available : it should link to it dynamically. This is done by declaring the function "external" (with GCC) or "__declspec(dllimport)" (with Visual).
+
+So you use a handy #define : GLFWAPI, and you use it to declare the functions :
+
+GLFWAPI int glfwInit( void );
+
+* When you're building as a DLL, you #define GLFW_BUILD_DLL. GLFWAPI then gets #define'd to __declspec(dllexport)
+* When you're using GLFW as a DLL, you #define GLFW_DLL. GLFWAPI then gets #define'd to __declspec(dllimport)
+* When you're building as a static lib, GLFWAPI is #define'd to nothing
+* When you're using GLFW as a static lib, GLFWAPI is #define'd to nothing.
+
+So the rule is : these flags must be consistent. If you build a lib (any lib, not just GLFW) as a DLL, use the right preprocessor definition : GLFW_DLL, GLEW_STATIC
+
+
+
+## My program crashes !
+
+There are many reasons why a C++ OpenGL application might crash. Here are a few. If you don't know the exact line where your program crashes, learn how to use a debugger ( see shortcuts above). PLEASE don't debug with printf().
+
+### I don't even go inside main()
+
+This is most probably because some dll could not be found. Try opening your application with Dependency Walker (Windows) or ldd (Linux; try also [this](http://stackoverflow.com/questions/6977298/dependency-walker-equivalent-for-linux))
+
+### My program crashes on glfwOpenWindow(), or any other function that creates an OpenGL context
+
+Several possible reasons :
+
+* Your GPU doesn't support the requested OpenGL version. Try to see the supported version with GPU Caps Viewer or similar. Update driver if it seems too low. Integrated Intel cards on netbooks especially suck. Use a lower version of OpenGL (2.1 for instance), and use extensions if you lack features.
+* Your OS doesn't support the requested OpenGL version : Mac OS... same answer.
+* You're trying to use GLEW with an OpenGL Core context (i.e. without all the deprecated stuff). This is a GLEW bug. Use glewExperimental=true before glewInit(), or use a compatibility profile ( i.e. use GLFW_OPENGL_COMPAT_PROFILE instead of GLFW_OPENGL_CORE_PROFILE )
+
+
+## My program crashes on the first OpenGL call, or on the first buffer creation
+
+Three possible reasons :
+
+* You're not calling glewInit() AFTER glfwOpenWindow()
+* You're using a core OpenGL profile, and you didn't create a VAO. Add the following code after glewInit() :
+
+``` cpp
+ GLuint VertexArrayID;
+ glGenVertexArrays(1, &VertexArrayID);
+ glBindVertexArray(VertexArrayID);
+```
+
+* You're using the default build of GLEW, which has a bug. You can't use a Core OpenGL Profile due to this bug. Either Use glewExperimental=true before glewInit(), or ask GLFW for a Compatibility Profile instead :
+
+``` cpp
+ glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE);
+```
+
+## My program crashes when I try to load some file
+
+Setup your working directory correctly. See Tutorial 1.
+
+Create a test.txt file and try the following code :
+
+``` cpp
+if ( fopen("test.txt", "r" ) == NULL ){
+ printf("I'm probably running my program from a wrong folder");
+}
+```
+
+USE THE DEBUGGER !!!! Seriously ! Don't debug with printf(); use a good IDE. [http://www.dotnetperls.com/debugging](http://www.dotnetperls.com/debugging) is for C# but is valid for C++ too. Will vary for XCode and QtCreator, but concepts remain exactly the same.
+
+## Something else is wrong
+
+Please contact us by mail
+
+
diff --git a/pt/miscellaneous/clicking-on-objects/index.markdown b/pt/miscellaneous/clicking-on-objects/index.markdown
new file mode 100644
index 000000000..81c211047
--- /dev/null
+++ b/pt/miscellaneous/clicking-on-objects/index.markdown
@@ -0,0 +1,16 @@
+---
+layout: page
+status: publish
+published: true
+title: Clicking on objects
+date: '2013-04-30 10:30:55 +0200'
+date_gmt: '2013-04-30 10:30:55 +0200'
+categories: []
+order: 60
+tags: []
+---
+There are various way to detect on which object a user click:
+
+- [Picking with an OpenGL hack](./picking-with-an-opengl-hack)
+- [Picking with a physics library](./picking-with-a-physics-library)
+- [Picking with custom Ray-OBB function](./picking-with-custom-ray-obb-function)
diff --git a/pt/miscellaneous/clicking-on-objects/picking-with-a-physics-library/index.markdown b/pt/miscellaneous/clicking-on-objects/picking-with-a-physics-library/index.markdown
new file mode 100644
index 000000000..b30cb152a
--- /dev/null
+++ b/pt/miscellaneous/clicking-on-objects/picking-with-a-physics-library/index.markdown
@@ -0,0 +1,199 @@
+---
+layout: page
+status: publish
+published: true
+title: Picking with a physics library
+date: '2013-05-18 20:42:49 +0200'
+date_gmt: '2013-05-18 20:42:49 +0200'
+categories: []
+order: 80
+tags: []
+print: true
+---
+
+In this tutorial, we will see the "recommended" way to pick objects in a classical game engine - which might not be your case.
+
+The idea is that the game engine will need a physics engine anyway, and all physics engine have functions to intersect a ray with the scene. On top of that, these functions are probably more optimized than what you'll be able to do yourself : all engines use *space partitionning* structures, which make it possible to avoid testing intersection with most objects which are not in the same region.
+
+In this tutorial, we will use the Bullet Physics Engine, but the concepts are exactly the same for any other : PhysX, Havok, etc.
+
+# Bullet integration
+
+Lots of tutorials explain how to integrate Bullet; in particular, the [Bullet's wiki](http://bulletphysics.org/mediawiki-1.5.8/index.php/Main_Page) is very well done.
+
+``` cpp
+// Initialize Bullet. This strictly follows http://bulletphysics.org/mediawiki-1.5.8/index.php/Hello_World,
+// even though we won't use most of this stuff.
+
+// Build the broadphase
+btBroadphaseInterface* broadphase = new btDbvtBroadphase();
+
+// Set up the collision configuration and dispatcher
+btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
+btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
+
+// The actual physics solver
+btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver;
+
+// The world.
+btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,solver,collisionConfiguration);
+dynamicsWorld->setGravity(btVector3(0,-9.81f,0));
+```
+
+Each object must have a *Collision Shape*. While this collision shape can be the mesh itself, it's often a bad idea for performance. Instead, one usually use much simpler shapes as boxes, spheres or capsules. Here are a few collision shapes. From left to right : sphere, cube, convex hull of the mesh, original mesh. Spheres are less precise than the full mesh, but much much faster to test.
+
+
+
+
+In this example, all meshes will use the same box :
+
+``` cpp
+btCollisionShape* boxCollisionShape = new btBoxShape(btVector3(1.0f, 1.0f, 1.0f));
+```
+
+Physics engines don't know anything about OpenGL; and in fact, all of them can run without any 3D visualization at all. So you can't directly give Bullet your VBO. You have to add a *Rigid Body* in the simulation instead.
+
+``` cpp
+btDefaultMotionState* motionstate = new btDefaultMotionState(btTransform(
+ btQuaternion(orientations[i].x, orientations[i].y, orientations[i].z, orientations[i].w),
+ btVector3(positions[i].x, positions[i].y, positions[i].z)
+));
+
+btRigidBody::btRigidBodyConstructionInfo rigidBodyCI(
+ 0, // mass, in kg. 0 -> Static object, will never move.
+ motionstate,
+ boxCollisionShape, // collision shape of body
+ btVector3(0,0,0) // local inertia
+);
+btRigidBody *rigidBody = new btRigidBody(rigidBodyCI);
+
+dynamicsWorld->addRigidBody(rigidBody);
+```
+
+Notice that the Rigid Body use the Collision Shape to determine its shape.
+
+We also keep track of this rigid body, but as the comment says, a real engine would somehow have a MyGameObject class with the position, the orientation, the OpenGL mesh, and a pointer to the Rigid Body.
+
+``` cpp
+rigidbodies.push_back(rigidBody);
+
+// Small hack : store the mesh's index "i" in Bullet's User Pointer.
+// Will be used to know which object is picked.
+// A real program would probably pass a "MyGameObjectPointer" instead.
+rigidBody->setUserPointer((void*)i);
+```
+
+In other words : please don't use the above code in real life ! It's just for demo purpose.
+
+# Raycasting
+
+
+## Finding the ray direction
+
+First, we need to find a ray which starts at the camera and goes "through the mouse". This is done in the *ScreenPosToWorldRay()* function.
+
+First, we find the ray's start and end position in Normalized Device Coordinates. We do it in this space because it's very easy :
+
+``` cpp
+// The ray Start and End positions, in Normalized Device Coordinates (Have you read Tutorial 4 ?)
+glm::vec4 lRayStart_NDC(
+ ((float)mouseX/(float)screenWidth - 0.5f) * 2.0f, // [0,1024] -> [-1,1]
+ ((float)mouseY/(float)screenHeight - 0.5f) * 2.0f, // [0, 768] -> [-1,1]
+ -1.0, // The near plane maps to Z=-1 in Normalized Device Coordinates
+ 1.0f
+);
+glm::vec4 lRayEnd_NDC(
+ ((float)mouseX/(float)screenWidth - 0.5f) * 2.0f,
+ ((float)mouseY/(float)screenHeight - 0.5f) * 2.0f,
+ 0.0,
+ 1.0f
+);
+```
+
+To understand this code, let's have a look at this picture from Tutorial 4 again :
+
+
+
+
+NDC is a 2*2*2 cube centered on the origin, so in this space, the ray going "trough the mouse" is just a straight line, perpendicular to the near plane! Which makes lRayStart_NDC and lEndStart_NDC so easy to compute.
+
+Now we simply have to apply the inverse transformation as the usual one :
+
+``` cpp
+// The Projection matrix goes from Camera Space to NDC.
+// So inverse(ProjectionMatrix) goes from NDC to Camera Space.
+glm::mat4 InverseProjectionMatrix = glm::inverse(ProjectionMatrix);
+
+// The View Matrix goes from World Space to Camera Space.
+// So inverse(ViewMatrix) goes from Camera Space to World Space.
+glm::mat4 InverseViewMatrix = glm::inverse(ViewMatrix);
+
+glm::vec4 lRayStart_camera = InverseProjectionMatrix * lRayStart_NDC; lRayStart_camera/=lRayStart_camera.w;
+glm::vec4 lRayStart_world = InverseViewMatrix * lRayStart_camera; lRayStart_world /=lRayStart_world .w;
+glm::vec4 lRayEnd_camera = InverseProjectionMatrix * lRayEnd_NDC; lRayEnd_camera /=lRayEnd_camera .w;
+glm::vec4 lRayEnd_world = InverseViewMatrix * lRayEnd_camera; lRayEnd_world /=lRayEnd_world .w;
+
+// Faster way (just one inverse)
+//glm::mat4 M = glm::inverse(ProjectionMatrix * ViewMatrix);
+//glm::vec4 lRayStart_world = M * lRayStart_NDC; lRayStart_world/=lRayStart_world.w;
+//glm::vec4 lRayEnd_world = M * lRayEnd_NDC ; lRayEnd_world /=lRayEnd_world.w;
+```
+
+With lRayStart_worldspace and lRayEnd_worldspace, the ray's direction (in world space) is straightforward to compute :
+
+``` cpp
+glm::vec3 lRayDir_world(lRayEnd_world - lRayStart_world);
+lRayDir_world = glm::normalize(lRayDir_world);
+```
+
+## Using rayTest()
+
+Raycasting is very simple, no need for special comments :
+
+``` cpp
+glm::vec3 out_end = out_origin + out_direction*1000.0f;
+
+btCollisionWorld::ClosestRayResultCallback RayCallback(
+ btVector3(out_origin.x, out_origin.y, out_origin.z),
+ btVector3(out_end.x, out_end.y, out_end.z)
+);
+dynamicsWorld->rayTest(
+ btVector3(out_origin.x, out_origin.y, out_origin.z),
+ btVector3(out_end.x, out_end.y, out_end.z),
+ RayCallback
+);
+
+if(RayCallback.hasHit()) {
+ std::ostringstream oss;
+ oss << "mesh " << (int)RayCallback.m_collisionObject->getUserPointer();
+ message = oss.str();
+}else{
+ message = "background";
+}
+```
+
+The only thing is that for some weird reason, you have to set the ray's start and direction twice.
+
+That's it, you know how to implement picking with Bullet !
+
+# Pro and cons
+
+Pros :
+
+* Very easy when you already have a physics engine
+* Fast
+* Doesn't impact OpenGL's performance
+
+Cons :
+
+* Probably not the right solution if you don't need any physics or collision engine
+
+
+# Final remarks
+
+All physics engines have a debug viewer. The example code shows how to to it with Bullet. You end up with a representation of what Bullet knows about your scene, which is incredibly useful to debug physics-related problem, especially to be sure that the "visual world" is consistent with the "physics world" :
+
+
+
+
+The green box is the *Collision Shape*, at the same position and orientation than the mesh. The red box is the object's *Axis-Aligned Bounding Box* (AABB), which is used as a faster rejection test : if the ray doesn't intersect the AABB (very cheap to compute), then there is no chance that it will intersect the collision shape. Finally, you can see the object's axes in blue and red (look at the nose and ear). Handy !
diff --git a/pt/miscellaneous/clicking-on-objects/picking-with-an-opengl-hack/index.markdown b/pt/miscellaneous/clicking-on-objects/picking-with-an-opengl-hack/index.markdown
new file mode 100644
index 000000000..0ff68255a
--- /dev/null
+++ b/pt/miscellaneous/clicking-on-objects/picking-with-an-opengl-hack/index.markdown
@@ -0,0 +1,202 @@
+---
+layout: page
+status: publish
+published: true
+title: Picking with an OpenGL hack
+date: '2013-05-18 20:43:28 +0200'
+date_gmt: '2013-05-18 20:43:28 +0200'
+categories: []
+order: 70
+tags: []
+print: true
+---
+
+This technique is not really recommended, but it's an easy and fast way to add simple picking. By all means, avoid using this in a game, since it might introduce noticeable framerate drops. However, if you have some kind of simulation and you don't really care about picking performance, this might the perfect option.
+
+Source code for this tutorial is available in [misc05_picking/misc05_picking_slow_easy.cpp](https://github.com/opengl-tutorials/ogl/blob/master/misc05_picking/misc05_picking_slow_easy.cpp), which is a quite meaningful name.
+
+# Basic idea
+
+The idea behind this technique is to render the scene as usual, but instead of using a nice shading, you render each mesh with a specific and unique color.
+
+Then, you retrieve the colour of the pixel under the mouse cursor and convert this color back to the original identifier. You have your clicked object.
+
+Here's an example :
+
+
+
+
+In this screenshot, each monkey has a slightly different color, which make is possible to uniquely identify them.
+
+Of course, you don't want to see the image with all these weird colors, so you also have to clear the screen and re-draw as usual.
+
+# Implementation
+
+
+## Giving an ID to every object
+
+Each object of the scene will need a unique color. The easiest way to do this is to give each object an identifying integer, and convert it to a color. This color doesn't have to have a meaning; this technique is just a hack anyway.
+
+In the accompanying source code, 100 objects are created and stored in a std::vector, so the ID is just the index of the object in the vector. If you have a more complex hierarchy, you'll probably need to add the ID to your Mesh class, and maintain some sort of std::map to associate the ID with the desired object.
+
+
+
+## Detecting the click
+
+In this simple example, the picking is done each frame where the left mouse button is down :
+
+``` cpp
+ if (glfwGetMouseButton(GLFW_MOUSE_BUTTON_LEFT)){
+```
+
+In a real application, you probably want to do this only when the user just released the button, so you'll have to store a bool wasLeftMouseButtonPressedLastFrame; or, better, use *glfwSetMouseButtonCallback()* (read GLFW's manual to know how to use this).
+
+## Convert your ID into a special color
+
+Since we're going to render each mesh with a different color, the first step is to compute this color. An easy way to do this is to put the least signifying bits in the red channels, and the most significant bits in the blue channel :
+
+``` cpp
+// Convert "i", the integer mesh ID, into an RGB color
+int r = (i & 0x000000FF) >> 0;
+int g = (i & 0x0000FF00) >> 8;
+int b = (i & 0x00FF0000) >> 16;
+```
+
+This might seem scary, but it's standard bit-manipulation code. You end up with 3 integers, each in the [0-255] range. With this scheme, you can represent 255^3 = 16 million different meshes, which is probably enough.
+
+## Drawing the scene with this color
+
+We now need a shader to use this color. It's very simple. The vertex shader does nothing :
+
+``` glsl
+#version 330 core
+
+// Input vertex data, different for all executions of this shader.
+layout(location = 0) in vec3 vertexPosition_modelspace;
+
+// Values that stay constant for the whole mesh.
+uniform mat4 MVP;
+
+void main(){
+
+ // Output position of the vertex, in clip space : MVP * position
+ gl_Position = MVP * vec4(vertexPosition_modelspace,1);
+
+}
+```
+{: .highlightglslvs }
+
+and the fragment shader simply writes the desired color in the framebuffer :
+
+``` glsl
+#version 330 core
+
+// Ouput data
+out vec4 color;
+
+// Values that stay constant for the whole mesh.
+uniform vec4 PickingColor;
+
+void main(){
+
+ color = PickingColor;
+
+}
+```
+{: .highlightglslfs }
+
+Easy !
+
+The only trick is that you have to send your color as floats (in [0,1]) but you have integers (in [0,255]), so you have to make a small division when calling *glUniformXX()* :
+
+``` cpp
+// OpenGL expects colors to be in [0,1], so divide by 255.
+glUniform4f(pickingColorID, r/255.0f, g/255.0f, b/255.0f, 1.0f);
+```
+
+You can now draw the meshes as usual (*glBindBuffer, glVertexAttribPointer, glDrawElements*) and you'll get the weird picture above.
+
+
+
+## Get the color under the mouse
+
+When you have drawn all meshes (probably with a for() loop), you need to call *glReadPixels()*, which will retrieve the rasterized pixels on the CPU. But for this function to work, a few more calls are needed.
+
+First, you need to call *glFlush()*. This will tell the OpenGL driver to send all the pending commands (including your latest *glDrawXX*) to the GPU. This is typically not done automatically, because commands are sent in batches, and not immediately (this means that when you call *glDrawElements()*, nothing is actually draw. It WILL be drawn a few milliseconds later). This operation is SLOW.
+
+Then, you need to call *glFinish()*, which will wait until everything is really drawn. The difference with *glFlush()* is that *glFlush()* just sends the commands; *glFinish()* waits for these commands to be executed. This operation is SLOOOW.
+
+You also need to configure how *glReadPixels* will behave with respect to memory alignment. This is a bit off-topic, but you simply need to call *glPixelStorei(GL_UNPACK_ALIGNMENT, 1)*.
+
+And finally, you can call *glReadPixels* ! Here is the full code :
+
+``` cpp
+// Wait until all the pending drawing commands are really done.
+// Ultra-mega-over slow !
+// There are usually a long time between glDrawElements() and
+// all the fragments completely rasterized.
+glFlush();
+glFinish();
+
+glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
+// Read the pixel at the center of the screen.
+// You can also use glfwGetMousePos().
+// Ultra-mega-over slow too, even for 1 pixel,
+// because the framebuffer is on the GPU.
+unsigned char data[4];
+glReadPixels(1024/2, 768/2,1,1, GL_RGBA, GL_UNSIGNED_BYTE, data);
+```
+
+Your color is now in the 'data' array. Here, you can see that the ID is 19.
+
+
+
+
+## Convert the color back to an ID
+
+You can now reconstruct your ID from the 'data' buffer. The code is the complete opposite from the id-to-color code :
+
+``` cpp
+// Convert the color back to an integer ID
+int pickedID =
+ data[0] +
+ data[1] * 256 +
+ data[2] * 256*256;
+```
+
+## Use this ID
+
+You can now use this ID for whatever you need. In the example, the text in the GUI is updated, but of course, you can do whatever you want.
+
+``` cpp
+if (pickedID == 0x00ffffff){ // Full white, must be the background !
+ message = "background";
+}else{
+ std::ostringstream oss; // C++ strings suck
+ oss << "mesh " << pickedID;
+ message = oss.str();
+}
+```
+
+# Pros and cons
+
+Pros :
+
+* Easy, fast to implement
+* No need for external library, or complicated math
+
+Cons :
+
+* Use glFlush(), glFinish(), glReadPixels(), all of which are notoriously slow, because they force the CPU to wait for the GPU, which ruins performance.
+* You don't have more precise information : which exact triangle was hit, normal at this point, etc.
+
+
+
+# Final remarks
+
+While not very recommended, this technique can be really useful; but it's quite restricted to picking. The methods in the two other tutorials can be used for other purposes, like detecting collisions, making an avatar walk on the ground, visibility queries for AIs, etc.
+
+If you end up using this technique, and you need to pick several points in a single frame, you should do all these points at once. For instance, if you need to handle 5 touch inputs, don't draw the scene 5 times !
+
+
diff --git a/pt/miscellaneous/clicking-on-objects/picking-with-custom-ray-obb-function/index.markdown b/pt/miscellaneous/clicking-on-objects/picking-with-custom-ray-obb-function/index.markdown
new file mode 100644
index 000000000..ab2f3bbbf
--- /dev/null
+++ b/pt/miscellaneous/clicking-on-objects/picking-with-custom-ray-obb-function/index.markdown
@@ -0,0 +1,175 @@
+---
+layout: page
+status: publish
+published: true
+title: Picking with custom Ray-OBB function
+date: '2013-05-18 22:13:41 +0200'
+date_gmt: '2013-05-18 22:13:41 +0200'
+categories: []
+order: 90
+tags: []
+print: true
+---
+
+This last method is a nice middleground between the "hacky" pure-OpenGL implementation, and having to integrate a fully-featured physics engine just to do raycasts and picking.
+
+This tutorial uses concepts and functions from the Bullet tutorial, so make sure you read it first.
+
+# The basic idea
+
+Instead of relying to Bullet intersect a ray with a *Collision Shape*, we're going to do this ourselves.
+
+As we have seen, there are many possible collision shapes. Spheres are very easy to intersect, but for many object, they represent the original mesh very poorly. On the other side, intersecting the ray with each triangle of the original mesh is way to costly. A good middleground are OBB : Oriented Bounding Boxes. There are quite precise (but it depends on your input geometry), and quite cheap to compute.
+
+An OBB is a box that fits the mesh, and when the mesh is translated or rotated, the same transformation is applied to the box :
+
+
+
+
+# Ray-OBB intersection algorithm
+
+*( The algorithm and the pictures are largely inspired from Real-Time Rendering 3. Buy this book ! )*
+
+Consider the OBB below. On the X axis, this is delimited by 2 vertical planes, colored in red here. When intersected with the ray (a very simple operation), it gives 2 intersections, one "near" and one "far" :
+
+
+
+
+When the ray intersects the 2 others planes that delimit the Y axis (in green), it gives 2 more intersections. Notice how the intersections are ordered : you enter the green area -> you leave the green area -> you enter the red area -> you leave the red area. This means that there is no intersection.
+
+
+
+
+
+
+But if this order changes (you enter the green area -> you enter the red area), then you know there is an intersection !
+
+
+
+
+Let's put this in practice.
+
+# Algorithm implementation
+
+(full source code is available in [Misc05/misc05_picking_custom.cpp](https://github.com/opengl-tutorials/ogl/blob/master/misc05_picking/misc05_picking_custom.cpp))
+
+Our Ray - OBB intersection function will look like this :
+
+``` cpp
+bool TestRayOBBIntersection(
+ glm::vec3 ray_origin, // Ray origin, in world space
+ glm::vec3 ray_direction, // Ray direction (NOT target position!), in world space. Must be normalize()'d.
+ glm::vec3 aabb_min, // Minimum X,Y,Z coords of the mesh when not transformed at all.
+ glm::vec3 aabb_max, // Maximum X,Y,Z coords. Often aabb_min*-1 if your mesh is centered, but it's not always the case.
+ glm::mat4 ModelMatrix, // Transformation applied to the mesh (which will thus be also applied to its bounding box)
+ float& intersection_distance // Output : distance between ray_origin and the intersection with the OBB
+){
+```
+
+We begin by nitializing a few variables. tMin is the largest "near" intersection currently found; tMax is the smallest "far" intersection currently found. Delta is used to compute the intersections with the planes.
+
+``` cpp
+float tMin = 0.0f;
+float tMax = 100000.0f;
+
+glm::vec3 OBBposition_worldspace(ModelMatrix[3].x, ModelMatrix[3].y, ModelMatrix[3].z);
+
+glm::vec3 delta = OBBposition_worldspace - ray_origin;
+```
+
+Now, let's compute the intersections with the 2 planes that delimit the OBB on the X axis :
+
+``` cpp
+glm::vec3 xaxis(ModelMatrix[0].x, ModelMatrix[0].y, ModelMatrix[0].z);
+float e = glm::dot(xaxis, delta);
+float f = glm::dot(ray_direction, xaxis);
+
+// Beware, don't do the division if f is near 0 ! See full source code for details.
+float t1 = (e+aabb_min.x)/f; // Intersection with the "left" plane
+float t2 = (e+aabb_max.x)/f; // Intersection with the "right" plane
+```
+
+t1 and t2 now contain distances betwen ray origin and ray-plane intersections, but we don't know in what order, so we make sure that t1 represents the "near" intersection and t2 the "far" :
+
+``` cpp
+if (t1>t2){ // if wrong order
+ float w=t1;t1=t2;t2=w; // swap t1 and t2
+}
+```
+
+We can update tMin and tMax :
+
+``` cpp
+// tMax is the nearest "far" intersection (amongst the X,Y and Z planes pairs)
+if ( t2 < tMax ) tMax = t2;
+// tMin is the farthest "near" intersection (amongst the X,Y and Z planes pairs)
+if ( t1 > tMin ) tMin = t1;
+```
+
+And here's the trick : if "far" is closer than "near", then there is NO intersection.
+
+``` cpp
+if (tMax < tMin )
+ return false;
+```
+
+This was for the X axis. On all other axes it's exactly the same !
+
+
+
+# Using the algorithm
+
+The TestRayOBBIntersection() functions enables us to test the intersection with only one OBB, so we have to test them all. In this tutorial, we simply test all boxes one after the other, but if you have many objects, you might need an additional acceleration structure like a Binary Space Partitionning Tree (BSP-Tree) or a Bounding Volume Hierarchy (BVH).
+
+``` cpp
+for(int i=0; i<100; i++){
+
+ float intersection_distance; // Output of TestRayOBBIntersection()
+ glm::vec3 aabb_min(-1.0f, -1.0f, -1.0f);
+ glm::vec3 aabb_max( 1.0f, 1.0f, 1.0f);
+
+ // The ModelMatrix transforms :
+ // - the mesh to its desired position and orientation
+ // - but also the AABB (defined with aabb_min and aabb_max) into an OBB
+ glm::mat4 RotationMatrix = glm::toMat4(orientations[i]);
+ glm::mat4 TranslationMatrix = translate(mat4(), positions[i]);
+ glm::mat4 ModelMatrix = TranslationMatrix * RotationMatrix;
+
+ if ( TestRayOBBIntersection(
+ ray_origin,
+ ray_direction,
+ aabb_min,
+ aabb_max,
+ ModelMatrix,
+ intersection_distance)
+ ){
+ std::ostringstream oss;
+ oss << "mesh " << i;
+ message = oss.str();
+ break;
+ }
+}
+```
+
+Note that this algorithm has a problem : it picks the first OBB it finds. But if this OBB is behind another OBB, this is wrong. So you would have to take only the nearest OBB ! Exercise left to the reader...
+
+# Pros and cons
+
+Pros :
+
+* Easy
+* Low memory requirements (just the OBB's extents)
+* Doesn't slows OpenGL down as the 1rst version
+
+Cons :
+
+* Slower than a physics engine since there is no acceleration structure
+* Might not be precise enough.
+
+
+
+# Final remarks
+
+There are many other intersection routines available for all sorts of collision shapes; see [http://www.realtimerendering.com/intersections.html](http://www.realtimerendering.com/intersections.html) for instance.
+
+If you need precise intersection, you will have to test ray-triangle intersections. Again, it's not a good idea to check each triangle of each mesh linearly. Another acceleration structure is required.
diff --git a/pt/miscellaneous/contribute/index.markdown b/pt/miscellaneous/contribute/index.markdown
new file mode 100644
index 000000000..c1cad150b
--- /dev/null
+++ b/pt/miscellaneous/contribute/index.markdown
@@ -0,0 +1,22 @@
+---
+layout: page
+title: Contribute
+categories: []
+order: 15
+tags: []
+---
+
+* TOC
+{:toc}
+
+Did you found these tutorials useful ?
+Do you want to contribute ?
+
+There are various way to contribute and we welcome any of them !
+
+*Want to share your knowledge and make your very own tutorial ? Drop us an email with your idea, we would be more than happy to help you, and host it on the website !
+*Spotted an error (code, math, typo, gramatical error) in a tutorial ? Report it on [Github issue tracker](https://github.com/opengl-tutorials/ogl).
+*Want to help us traduce one tutorial, or all the tutorials in a new language (like Spanish, Portuguese, etc) ? Follow this [guide]( {{ site.baseurl }}/miscellaneous/contribute/translation/).
+*The website is not beautiful enough ? If you're talented in CSS and website please drop us an email !
+
+If you have any other ideas that you wish to share with us please don't hesitate to contact us by email.
diff --git a/pt/miscellaneous/contribute/translation/index.markdown b/pt/miscellaneous/contribute/translation/index.markdown
new file mode 100644
index 000000000..79d39f079
--- /dev/null
+++ b/pt/miscellaneous/contribute/translation/index.markdown
@@ -0,0 +1,40 @@
+---
+layout: page
+title: Translation
+author:
+ display_name: Sistr
+ email: damien.mabin@gmail.com
+ url: ''
+categories: []
+order: 17
+tags: []
+---
+
+* TOC
+{:toc}
+
+Do you want to translate just one page ? No problem !
+A whole series of tutorial ? Even better (^_^)!
+
+# Want to complete / correct an existing translation ?
+
+Clone the branch "gh-pages" on the project's github repository [here](https://github.com/opengl-tutorials/ogl/tree/gh-pages).
+Find the page you want to edit, modify it, and simply send it back to us **by email** (or submit a **github pull request if you prefer**).
+
+Finding the file you want to edit is really easy.
+For example if you want to translate that page in japanese:
+
+[https://github.com/opengl-tutorials/ogl/tree/gh-pages/jp/intermediate-tutorials/tutorial-9-vbo-indexing](https://github.com/opengl-tutorials/ogl/tree/gh-pages/jp/intermediate-tutorials/tutorial-9-vbo-indexing)
+
+Notice the path of the page: *"jp/intermediate-tutorials/tutorial-9-vbo-indexing/"*.
+Next in the github repository, under the branch *gh-pages*, you'll find a file: *"index.markdown"* under the same path:
+
+[https://github.com/opengl-tutorials/ogl/tree/gh-pages/jp/intermediate-tutorials/tutorial-9-vbo-indexing](https://github.com/opengl-tutorials/ogl/tree/gh-pages/jp/intermediate-tutorials/tutorial-9-vbo-indexing)
+
+# Want to participate in a new language ?
+
+Contact us, we will create the new language folder for you, and you can then follow the same step as above: Find the file you want to translate, edit it, and send it back via email or pull-request.
+
+# This Git stuff looks complicated...
+
+Contact us, we'll do our best to make translating as easy as possible !
diff --git a/pt/miscellaneous/faq/index.markdown b/pt/miscellaneous/faq/index.markdown
new file mode 100644
index 000000000..91bc0fcc4
--- /dev/null
+++ b/pt/miscellaneous/faq/index.markdown
@@ -0,0 +1,153 @@
+---
+layout: page
+status: publish
+published: true
+title: FAQ
+date: '2012-04-29 13:22:31 +0200'
+date_gmt: '2012-04-29 13:22:31 +0200'
+categories: []
+order: 10
+tags: []
+print: true
+---
+
+# About sending e-mails...
+
+Sending an e-mail to contact@opengl-tutorial.org is the most effective way to get support. However, if you have a problem, please include as much information as you can. This means at least :
+
+* OS : Gentoo ? Windows XP ? ... (remember : use the 2.1 port if you have a mac !)
+* 32 bits or 64 bits ?
+* Graphic card : NVIDIA ? AMD ? Intel ? S3 ? Matrox ? (remember : use the 2.1 port if you have an integrated GPU !)
+
+... and optionally any other information you can find useful. This may include :
+
+* GPU Driver version
+* Call stack
+* screenshots
+* console output
+* minidump...
+
+And of course, read this FAQ first. It's called FAQ for a reason =)
+
+# I can't compile the tutorials
+
+
+* Make sure you read Tutorial 1. PLEASE use CMake instead of re-creating the project. Or at least, make sure you read [Building your own C application](http://www.opengl-tutorial.org/miscellaneous/building-your-own-c-application/).
+* If you have an error related to the AssImp library, it'll be fixed soon; in the meantime, it only affects ONE tutorial, all the others will build fine.
+* If you have an error related to the AntTweakBar library, it only affects ONE tutorial, all the others will build fine.
+* If there is really a problem, don't hesitate to send us an e-mail.
+
+
+# I have compiled the tutorials, but it fails at startup. What's going on ?
+
+Several possible reasons :
+
+## Incompatible GPU/OS
+
+Please check if you have an Intel card. You can do so using glewinfo, GPU Caps Viewer, or any other tool.
+
+Intel cards, except recent HD4000, don't support OpenGL 3.3. As a matter of fact, most only support OpenGL 2.1. You have to download the 2.1 version from the Downloads page instead.
+
+The other possible reason is that you're on a Mac, with a pre-Lion version. Same stuff applies...
+
+## Wrong working directory
+
+Chances are that you don't run them from the right directory. Try double-clicking on the .exe from the explorer.
+
+See Tutorial 1 for configuring the IDE so that you can debug the executable.
+
+Please note that the .exe is compiled in the *build* directory, but automatically copied to the *source* directory, so that it can find the needed resources (images, 3D models, shaders).
+
+## No VAO
+
+If you created a program from scratch, make sure you created a VAO :
+
+```
+GLuint VertexArrayID;
+ glGenVertexArrays(1, &VertexArrayID);
+ glBindVertexArray(VertexArrayID);
+```
+
+## GLEW bug
+
+GLEW has a bug which make it impossible to use a core context (except when you use the source code from the tutorials, which has been fixed). 3 solutions:
+
+* Ask GLFW for a Compatibility Profile instead:
+
+```
+
+glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE);
+```
+
+* Use glewExperimental; this is the recommended way:
+
+```
+
+glewExperimental = true;
+```
+
+* Actually fix glew... See [this patch](http://code.google.com/p/opengl-tutorial-org/source/browse/external/glew-1.5.8.patch?name=0009_33).
+
+
+## CMake
+
+You did read Tutorial 1, right ? You didn't try to write your own makefile and build everything yourself, RIGHT ?
+
+# Why should I use OpenGL 3.3 if Intel and Mac can't run it ?!
+
+... also known as :
+
+# Which version of OpenGL should I use ?
+
+As a matter of fact, I don't recommend using OpenGL 3 or above for an application. I use it in the tutorials because it's the **clean** way to learn OpenGL, without all the deprecated stuff, and because once you know 3.3, using 2.1 is straighforward.
+
+What I recommend is :
+
+* Learn in OpenGL 3.3 so that you know the "right way"
+* Set a target hardware for your application. For instance, *require *FBOs and GLSL.
+* Use GLEW to load all the extensions. At startup, refuse all hardware which hasn't the required functionality level.
+* From now on, you can code almost like if you were on 3.3, with only a few changes.
+* If you really want to deal with older/cheaper hardware , you can still deal with them by disabling effects which require FBOs, for instance.
+
+There's one big situation where you might want to use a very recent version, say 4.2 : you're a graduate student doing high-end research, you really need a recent feature, and you don't care about compatibility because your software will never be ran outside your lab. In this case, don't waste time and go straight to the highest OpenGL version your hardware supports.
+
+
+# Where do I download OpenGL 3 ?
+
+You don't.
+
+On Windows, for instance, you only have opengl32.dll, which is only OpenGL 1.1. BUT there is this function, wglGetProcAddress(), which makes is possible to get functions that are not implemented directly in opengl32.dll, but which are available in the driver.
+
+GLEW calls wglGetProcAdress on all needed symbols, and make them available to you. (you can do it yourself but it's horribly boring). It also declares new constants which did not exist 10 years ago, like, for instance, GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB.
+
+So, just make sure your GPU driver supports the needed version, use GLEW, and you're good to go.
+
+
+
+# Why do you create a VAO in each tutorial, but you never use it ?
+
+
+Wrong. It's bound, so in fact, it's used during the whole execution.
+
+VAOs are wrappers around VBOs. They remember which buffer is bound to which attribute and various other things. This reduces the number of OpenGL calls before glDrawArrays/Elements(). Since OpenGL 3 Core, they are compulsory, but you may use only one and modify it permanently (which is what is done in the tutorial).
+
+VAOs may be confusing for this beginner's tutorial, and there is no equivalent in OpenGL 2 (which I recommend for production, see related FAQ), and the performance benefits are not clear. If you're interested in VAOs, please have a look at OpenGL's wiki. It *may* slightly simplify your application and *may* increase the performance a tiny bit, but not always.
+
+
+
+# I've got error "Unable to start program ALL_BUILD"
+
+ALL_BUILD is just a helper project generated by CMake; it's not a real program.
+
+As stated in Tutorial 1, you have to select the project you want to run by right-clicking on a project (from inside Visual) and select "Set up as startup project", like this :
+
+
+
+
+
+
+# I've got a message about the working directory, and the program crashes.
+
+You have to start the program from tutorial01_first_window/, tutorial02_red_triangle/, etc. If you start the program from your IDE, you have to configure it from him to do so.
+
+Please read Tutorial 1 for details.
diff --git a/pt/miscellaneous/index.markdown b/pt/miscellaneous/index.markdown
new file mode 100644
index 000000000..053d2e154
--- /dev/null
+++ b/pt/miscellaneous/index.markdown
@@ -0,0 +1,25 @@
+---
+layout: page
+type: section
+status: publish
+published: true
+title: Miscellaneous
+date: '2011-05-08 08:24:33 +0200'
+date_gmt: '2011-05-08 08:24:33 +0200'
+categories: []
+tags: []
+---
+
+{% assign sorted_pages = site.pages | sort:"order" %}
+{% for p in sorted_pages %}
+ {% assign splt = p.url | split: page.url %}
+ {% if splt.size == 2 and splt[0] == '' %}
+ {% assign slash = splt[1] | split: '/' %}
+{% if slash.size == 1 %}
+- {{p.title}}
+{% else %}
+ - {{p.title}}
+{% endif %}
+ {% endif %}
+{% endfor %}
+
diff --git a/pt/miscellaneous/math-cheatsheet/index.markdown b/pt/miscellaneous/math-cheatsheet/index.markdown
new file mode 100644
index 000000000..b586859a2
--- /dev/null
+++ b/pt/miscellaneous/math-cheatsheet/index.markdown
@@ -0,0 +1,124 @@
+---
+layout: page
+status: publish
+published: true
+title: Math Cheatsheet
+date: '2011-05-11 20:04:48 +0200'
+date_gmt: '2011-05-11 20:04:48 +0200'
+categories: []
+order: 20
+tags: []
+print: true
+---
+
+# Trigonometry
+
+
+## Pi
+
+const float pi = 3.14159265f; // but an infinity of digits in reality
+
+## Cosinus & Sinus
+
+
+*(From http://commons.wikimedia.org/wiki/User:Geek3 , under GNU Free Documentation License )*
+
+## Unit circle
+
+
+
+*( Modified from http://en.wikipedia.org/wiki/User:Gustavb under Crative Commons 3.0 )*t is an angle in radians.
+
+0 radians = 0 degrees
+
+180 degrees = Pi radians
+
+360 degrees ( full circle ) = 2*Pi radians
+
+90 degrees = Pi/2 radians
+
+# Vectors
+
+ALWAYS know in which coordinates your vector is. See section 3 for details.
+
+## Homogeneous coordinates
+
+A 3D vector is (x,y,z), but a homogeneous 3D vector is (x,y,z,w).
+
+* w=0 : it's a direction
+* w=1 : it's a position
+* else : it may still be correct, but you'd better know what you're doing.
+
+You can only multiply a 4x4 matrix with a homogeneous vector.
+
+## Length
+
+Just like cartesian distance : sqrt( x² + y² + z² ). w doesn't count.
+
+## Cross product
+
+
+
+*( Modified from http://en.wikipedia.org/wiki/User:Acdx , former image under Creative Commons 3.0 )*The X is the notation for the cross product. length( a x b ) == length(a) * length(b) * sin(θ), so you may want to normalize() the result.
+
+## Dot product
+
+
+##
+
+
+*( from http://en.wikipedia.org/wiki/File:Dot_Product.svg )*A.B = length(A)*cos(Theta) , but most likely computed as A.x*B.x +A.y*B.y +A.z*B.z
+
+## Addition and substraction
+
+compontent-wise :
+
+``` cpp
+res.x = A.x + B.x
+res.y = A.y + B.y
+...
+```
+
+## Multiplication
+
+compontent-wise :
+
+``` cpp
+res.x = A.x * B.x
+res.y = A.y * B.y
+...
+```
+
+## Normalization
+
+Divide the vector by its length :
+
+``` cpp
+normalizedVector = vec * ( 1.0f / vec.length() )
+```
+
+# Matrices
+
+
+## Matrix-Matrix multiplication
+
+example for a translation matrix :
+
+
+
+
+
+
+## Matrix-Vector multiplication
+
+
+
+
+# Usual Transformations
+
+
+
+
+... but in your shaders, you can also represent your vectors in tangent space. And in image-space when you do post-effects.
+
+res.x = A.x + B.x
diff --git a/pt/miscellaneous/useful-tools-links/index.markdown b/pt/miscellaneous/useful-tools-links/index.markdown
new file mode 100644
index 000000000..59da77ba2
--- /dev/null
+++ b/pt/miscellaneous/useful-tools-links/index.markdown
@@ -0,0 +1,112 @@
+---
+layout: page
+status: publish
+published: true
+title: Useful Tools & Links
+date: '2011-05-11 20:31:21 +0200'
+date_gmt: '2011-05-11 20:31:21 +0200'
+categories: []
+order: 30
+tags: []
+---
+
+# Documentation
+
+
+
+## OpenGL references
+
+
+* [OpenGL Quick Reference PDF](http://www.opengl.org/sdk/docs/reference_card/opengl45-reference-card.pdf)
+* [OpenGL 4.5 Reference Pages](http://www.opengl.org/sdk/docs/man4/)
+* [OpenGL 4.5 (Core Profile) Specification](https://www.khronos.org/registry/OpenGL/specs/gl/glspec45.core.pdf). A heavy read.
+* [GLSL Specifications](https://www.khronos.org/registry/OpenGL/specs/gl/GLSLangSpec.4.50.pdf)
+* [List of all extensions, and up-to-date specs](http://www.opengl.org/registry/) If your GPU is recent enough, most of them will be available through GLEW.
+
+
+## Other tutorials
+
+
+* [ogldev](http://ogldev.atspace.co.uk/index.html) A nice and thorough tutorial
+* [NeHe ](http://nehe.gamedev.net/)Extensive OpenGL 1.1 programming tutorials and resources. Mostly deprecated now, but there are still a few intersting things.
+
+
+## Books
+
+
+* [Real-time Rendering 3](http://www.realtimerendering.com/). Fantastic for learning the high-level concepts.
+* [GPU Pro book series](http://gpupro.blogspot.fr/). For detailed explanation of specific algorithms.
+
+## Others
+
+
+* [A trip trough the graphic pipeline](http://fgiesen.wordpress.com/2011/07/09/a-trip-through-the-graphics-pipeline-2011-index/) : In-depth information about how the drivers & GPUs actually work. Fantastic source of information. Highly recommended.
+* [Unity stats](https://hwstats.unity3d.com/)
+* [Extensions stats](http://gpuinfo.org/)
+
+
+# Debugging tools
+
+
+* [NVidia Parallel NSight](http://developer.nvidia.com/nvidia-parallel-nsight) A wonderful tool which gives access to extremely precise performance numbers. Highly recommended. Visual Studio + NVidia only. The one I use most.
+* [GLIntercept ](http://glintercept.nutty.org/) Generates a webpage with the list of OpenGL commands issued. Displays shader code, content of images, content of framebuffers, etc. A bit hard to master, but very precise and useful.
+* [gdebugger](http://www.gremedy.com/) A profiler
+
+
+# Libraries
+
+
+## Windowing & misc
+
+* [GLFW ](http://www.glfw.org/), the one we use
+* GLUT, the oldest. Not maintained, horrible license. Not recommended.
+* [FreeGlut](http://freeglut.sourceforge.net/), same API, but Open Source.
+* [SDL](http://www.libsdl.org/) I think this one is weird but some people like it.
+* [SFML](http://www.sfml-dev.org/index-fr.php). Includes a coffee machine, a washing machine, and a cellular.
+
+## Extension loading
+
+Beware, most extensions loading library don't work well with OpenGL 3+ Core. Actually, GLEW is the only one I managed to make work, with changes in the source code.
+
+If unsure, simply use the GLEW version included in the source code.
+
+* [GLEW ](http://glew.sourceforge.net/), the one we use
+* [GLEE ](http://elf-stone.com/glee.php)I hear it's not bad either
+* [gl3w ](https://github.com/skaslev/gl3w/wiki). A Python scripts that generates a C++ file.
+
+## Math library
+
+* [GLM](http://glm.g-truc.net/), the one we use. Very complete. Directly OpenGL and CUDA compatible.
+* [Bullet's Vectormath](http://bulletphysics.com/Bullet/BulletFull/) Never used it but it seems to be SIMD'ed ( = faster, even if you seldom make big computations on the CPU side )
+* [Boost.ublas ](http://www.boost.org/). Heavyweight. I don't recommend it for OpenGL.
+* [MathFu](https://google.github.io/mathfu/) Google's tak on math libraries, SIMD optimised.
+
+## Image loading
+
+* [stbimage](http://nothings.org/) A single .c file to include to your project, and you can load jpeg, bmp and png files !!!
+* [SOIL ](http://www.lonesock.net/soil.html)I recommend this one. Based on stbimage, provides handy functions for use with OpenGL, and a DDS loader.
+* [DevIL](http://openil.sourceforge.net/) An all-in-one image loading library
+* [FreeImage](http://freeimage.sourceforge.net/) ... and another one
+* [Boost.GIL](http://www.boost.org/) Big and bulky, doesn't do jpg.
+* libjpg The usual library for .jpg loading. Quite hard to use, but plenty of examples on the net.
+* libpng Same thing here.
+
+## Static objects loading
+
+* [ASSIMP ](http://assimp.sourceforge.net/)
+
+## Articulated objects loading & stuff
+
+* Any Quake III or Quake IV loader around
+* [Cal3D](http://gna.org/projects/cal3d/)
+
+
+## Physics
+
+
+* [Bullet](http://bulletphysics.org/wordpress/) Open source, used by many games and even films
+* [Newton](http://newtondynamics.com/forum/newton.php) Free, very good too.
+* [ODE](http://www.ode.org/). Old and unstable. Avoid.
+* PhysX
+* Havok (expensive)
+