feat: added text rendering class

This commit is contained in:
Krzysztof Rudnicki 2023-09-05 00:01:18 +02:00
parent a311ece772
commit 7b9961455c
2 changed files with 45 additions and 2 deletions

View File

@ -1791,13 +1791,13 @@ void TextRenderer::Load(const std::string &font, unsigned int fontSize)
\label{fig:loadingFont} \label{fig:loadingFont}
\end{figure} \end{figure}
\paragraph{Loading characters} \subsubsection{Loading characters}
In order to preload ASCII characters we use a method loadCharacter from TextRenderer, it uses FreeType library to load character, then generates textures for a character (it needs to allign a texture to character), sets options for texture and adds the character object to characters array In order to preload ASCII characters we use a method loadCharacter from TextRenderer, it uses FreeType library to load character, then generates textures for a character (it needs to allign a texture to character), sets options for texture and adds the character object to characters array
\begin{figure}[htp] \begin{figure}[htp]
\centering \centering
\begin{tikzpicture}[node distance=1.5cm] \begin{tikzpicture}[node distance=1.5cm]
\useasboundingbox (-5,0) rectangle (5, -13cm); % Set a custom bounding box \useasboundingbox (-5,0) rectangle (5, -10cm); % Set a custom bounding box
\node (start) [startstop] {Load character}; \node (start) [startstop] {Load character};
\node (pro1) [process, below of=start] {Load character using FreeType}; \node (pro1) [process, below of=start] {Load character using FreeType};
\draw [arrow] (start) -- (pro1); \draw [arrow] (start) -- (pro1);
@ -1822,6 +1822,49 @@ In order to preload ASCII characters we use a method loadCharacter from TextRend
\label{fig:loadingCharacter} \label{fig:loadingCharacter}
\end{figure} \end{figure}
\newpage
\paragraph{Texture options}
\begin{itemize}
\item The first two lines set the wrapping mode of the texture in the S and T directions (usually the x and y axes) to \texttt{GL\_CLAMP\_TO\_EDGE}. This means if the texture coordinates go beyond [0,1], the texture will not repeat but instead clamp to the edge values.
\item The next two lines set the minification and magnification filter to \texttt{GL\_LINEAR}. This means when the texture is scaled down or up, it will use linear interpolation between the texture coordinates, resulting in a smoother texture appearance.
\end{itemize}
\begin{lstlisting}[style=C++Style]
void TextRenderer::setTextureOptions() const {
// set texture options
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}
\end{lstlisting}
\newpage
\subsubsection{Rendering text}
We are given text as a C++ string and a position, method is supposed to automatically render text so that it fits in a position that was provided \\
We achieve that by iterating through each character of a string and putting it next to each other at a gap equal to a previous character width and height
\begin{figure}[htp]
\centering
\includegraphics[scale=1.00]{images/glyph_offset.png}
\caption{Glyph metrics from learnopengl}
\label{}
\end{figure}
Calculating x and y positions of each character \\
$x_{pos}$ and $y_{pos}$ is the final x/y position of character \\
$x_{start}$ and $y_{start}$ is the position inputed to the method render text \\
$x_{bearing}$ and $y_{bearing}$ is a parameter shown in image above \\
$s$ is scale \\
We calculate final bearing of $y_{pos}$ by subtracting bearing of "H" character from the bearing of actual character, we do it this way because "y" bearing of "H" character is highest \\
\[
x_{pos} = x_{start} + x_{bearing} * s
\]
\[
y_{pos} = y_{start} + (H_{bearing} - y_{bearing}) * s
\]
\subsection{Dependency Management} \subsection{Dependency Management}
There are several libraries: OpenGL, GLFW, stb\_image and freetype being integrated into engine, they are simply included at the top of any files that need them. There are several libraries: OpenGL, GLFW, stb\_image and freetype being integrated into engine, they are simply included at the top of any files that need them.

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB