/opengl-window-tutorial

Simple tutorial for building an opengl window with glfw, and glad on linux command line

Primary LanguageC++GNU General Public License v3.0GPL-3.0

opengl-window-tutorial

Simple tutorial for building an opengl window with glfw, and glad on linux command line.

Why ?

Well, it took me 2 weeks to figure out how to compile a goddamn window that's why.

Most of the tutorials, books (at least the popular ones) I have seen, show you either how to do it by using an ide, or come with a repository and a complex CMakeLists.txt file that magically builds examples.

If you are new into C/C++ world and the build/compile/run operations like myself, you will soon find yourself trying IDEs advertised in the tutorial X.

I did that, and it didn't work out well in the end. I realized that I was getting more and more hesitant about build/compile process, which made me question whether I wanted to really pursue learning OpenGL, whether I should look for alternatives, etc.

But in the end, I noticed that at its base, it is a very simple process.

So I prepared this tutorial for you.

Just follow the steps and you shall have your first window. Make sure to actually read every step instead of copy pasting mindlessly. I lost a lot of time looking for magical lines.

Step 1: Project Layout

Here is my layout. It should work for simple applications, but might fail to deal with complexities of a large application.

Here is the logic behind the layout:

  • root: project's root dir. Contains the CMakeLists.txt
    • /bin: contains the final executable
    • /libs: contains dynamic and static libs that will be linked to your project
    • /include: contains the header files, like *.h , *.hpp
    • /build: contains build files that would be generated by cmake
    • /src: contains source files that implements/uses those that were specified in your header files

Step 2: Cmake

This is by far the only challenging aspect of building the application for a beginner.

Here is the contents of the projects CMakeLists.txt, I shall explain what they do in the comments:

cmake_minimum_required (VERSION 2.8.3) # this line specifies
# the minimum version of cmake that is required to build this project
project("Hello Window OpenGL")
# specifies the name of the project
# if your name includes spaces it should be in quotes

find_package(OpenGL REQUIRED)
# If you don't know where your opengl library is
# then this would find the location of your opengl library

include_directories(
    # my headers
    "./include/"
    )
    # this includes the header files in your directory to your projects
    # meaning that this helps you to write with statements like
    # #include <GLFW/glfw3.h>
    # #include <glad/glad.h>
    # assuming that ./include directory also contains
    # other subdirectories like GLFW/ and glad/

set( GLFW_SHARED_LIB
    "${PROJECT_SOURCE_DIR}/libs/glfw/src/libglfw.so")
    # this sets a variable to the path of the dynamic library of glfw
    # Meaning that the functions of GLFW would be available at runtime
    # not at compile time.
    # If you have undefined reference errors try compiling
    # GLFW with static library option.
    # Notice that libs/ contain a sub directory glfw/
    # I simply copy pasted the src/ directory that resulted from
    # the building process of glfw to project_root/lib/glfw/

set ( ALL_LIBS
    ${OpenGL}
    ${GLFW_SHARED_LIB}
    "-ldl"
    )
    # This line simply assings a new variable to the group of
    # libraries that we need to link to
    # -ldl is necessary I don't know why.
    #

add_executable(myWin
    "src/glad.c"
    "src/window.cpp"
    )
# This line generates the executable, the access point to your program
# basically it creates a file called myWin, that can be run as ./myWin
# Notice that in order to create the executable we need to add the glad.c
# as well
target_link_libraries(myWin ${ALL_LIBS})
# this line links the dependency libraries to our executable
# With out this line we won't be able to use <glad/glad.h> <GLFW/glfw3.h>
# etc
install(TARGETS myWin DESTINATION "${PROJECT_SOURCE_DIR}/bin/")
# this line gives an install location for the executable
# if the make command is invoked as make install

The above file should be easy to read and understand.

Step 3: Build

Let's try it:

  • ~/projectRoot$ rm -rf build/: Deletes the build directory
  • ~/projectRoot$ mkdir build: Creates a build directory
  • cd build: Enters into the build directory
  • cmake ..: Builds the contents of CMakeLists.txt of the parent directory to the current directory
  • make install: Creates the file myWin and puts it into the projectRoot/bin directory
  • cd projectRoot/bin: Enters into the bin directory
  • ./myWin: Launches the executable

If everything went alright, you should see a black window with Learn OpenGL as title