This post is as part of note series upon my OpenGL studying.
For shader creation, the following OpenGL related functions will be used
OpenGL Functions | Purpose |
---|---|
glGenBuffers() |
Generate a new buffer to work with VBO, VAO, EBO, and other purposes |
glBindBuffer() |
Bind to target buffer to work with it in current state |
glBufferData() |
Copy vertex data into buffer’s memory managed by OpenGL for currently bound buffer. This function will be closely working with glVertexAttribPointer() which helps define meaning of data inside vertex data. |
glCreateShader() |
Create a shader object |
glShaderSource() |
Set source code to shader object |
glCompileShader() |
Compile shader object as prior setting its source code |
glGetShaderiv() |
Fetch information of shader object i.e. mostly used to get compilation status after calling to glCompileShader() |
glGetShaderInfoLog() |
Get information log string from the last compile operation of shader object i.e. usually we use this to get compile error string in case of error after we already identified that there is an error via glGetShaderiv() |
glCreateProgram() |
Create a shader program object |
glAttachShader() |
Attach a shader object to shader program object preparing to be linked together later |
glLinkProgram() |
Link shader program object depending on its attached shader objects; to create executable shader program for specific pass i.e. vertex shader, geometry shader, fragment shader if such shader program object has it. |
glGetProgramiv() |
Fetch informatin of shader program object i.e. mostly used to get linking status after calling glLinkProgram() |
glGetProgramInfoLog() |
Get information log string from the last linking or validating operation of shader program object |
glDeleteShader() |
Mark a shader object to be deleted after it is no longer attached to any shader object |
glVertexAttribPointer() |
Tell OpenGL for its meaning of data inside vertex data i.e. which is vertex position, which is color, which is normal etc. |
glEnableVertexAttribArray() |
Enable to use vertex attribute array |
glUseProgram() |
Use shader program |
glGenVertexArrays() |
Generate VAO, can be just one or multiples |
glBindVertexArray() |
Bind VAO |
glDrawArrays() |
Draw primitives |
glDrawElements() |
Draw indexed primitives |
glBufferData
is just to copy the whole memory data to initialize data on GPU, later we will need to tell OpenGL how to interpret such data via glVertexAttribPointer()
. It’s like telling it whether the data sent are tightly packed, any values in between, which is position & which is material data.
Remember layout (location = 0)
as seen in GLSL code. This is the location of vertex attribute to be configured with glVertexAttribPointer()
and glEnableVertexAttribArray()
s first parameter. If we did not do this, then we will have to make call to glGetAttribLocation()
or glGetUniformLocation()
to get the location of defined variables inside GLSL code.
Note: A special care needs to be made if user uses explicit define location via
layout (location = ...)
foruniform
variable inside GLSL code in OpenGL version lower than 4.3. You have to use extension by explicitly defined
#extension GL_ARB_explicit_uniform_location : require
under#version
or else it will be error
uniform explicit location requires GL_ARB_explicit_uniform_location and either GL_ARB_explicit_attrib_location or GLSL 3.30.
More information here.
This is to help group the configuration of vertex data preparation included binding to VBO, setting its vertex attributes thus reduce lines of code and time we need for this boiler-plate code every time we need to render something.
Anyway for OpenGL3.3+, it is a requirement to use VAO whenever we render things on screen.
It stores the following information
glEnableVertexAttribArray()
or glDisableVertexAttribArray()
glVertexAttribPointer()
glVertexAttribPointer()
glBindBuffer()
in case if target is GL_ELEMENT_ARRAY_BUFFER
According to man page of glUseProgram()
, it states that if we pass in 0
as a parameter to the function, then it’s undefined behavior. Although this might be usual action whenever we want to reset or unbind the current in-use stuff. Make an exception for it, no further action need after you render stuff on screen.
Compare this to glBindVertexArray()
which we can safely pass in 0
, it will break the current binding.
gl_Position
.C++11
, you can use this multiple line to define string to embed GLSL code inside the source code conveniently.Aug, 5, 2019
layout (location = ...)
with uniform
variable inside GLSL.Aug, 7, 2019
#
in front of extension GL_ARB_explicit_uniform_location ...
.
First published on Aug, 3, 2019
Written by Wasin Thonkaew
In case of reprinting, comments, suggestions
or to do anything with the article in which you are unsure of, please
write e-mail to wasin[add]wasin[dot]io
Copyright © 2019-2021 Wasin Thonkaew. All Rights Reserved.