【OpenGL】ウィンドウの作成

今日から OpenGL をゼロから学び始めます。もちろん、C++ の基礎があることが前提条件です。

まず、glad と GLFW のヘッダー ファイルをインクルードします。

#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>

GLFWの初期化

メイン関数では、最初に glfwInit を使用して GLFW を初期化し、次に glfwWindowHint を使用して GLFW を構成できます。この構成のオプションと意味については、GLFW で確認できます。ウィンドウ ガイド非常に詳細な説明が記載されています。これはツールとして参照することをお勧めします。本当に操作したい場所は、ウィンドウの初期化ではありません

int main() {
    glfwInit();  // 初始化GLFW
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // 指定创建的内容必须兼容的客户端 API 版本
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // 指定创建的内容必须兼容的客户端 API 版本
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 指定要为其创建内容的 OpenGL 配置文件
    //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // 指定 OpenGL 内容是否应向前兼容

    return 0;
}

ウィンドウオブジェクトを作成する

次に、ウィンドウ オブジェクトを作成する必要があります。glfwCreateWindow 関数の最初の 2 つのパラメータはウィンドウの幅と高さで、3 番目のパラメータはウィンドウの名前です。 、最後の 2 つのパラメータは次のとおりです。 の役割はGLFW: ウィンドウ ガイドで確認できます。

glfwMakeContextCurrent(window)ウィンドウのコンテンツを現在のスレッドのメイン コンテンツとして扱うように GLFW に指示します

    GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
    if (window == NULL)
    {
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);

GLADの初期化

GLAD は OpenGL の関数ポインタを管理しており、OpenGL 関数を呼び出す前に初期化する必要があります。関数を GLAD に渡して、オペレーティング システム固有の OpenGL 関数ポインタのアドレスをロードします。GLFW はオペレーティング システムに従って定義された glfwGetProcAddress を提供します正しい関数をコンパイルしました

if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
    std::cout << "Failed to initialize GLAD" << std::endl;
    return -1;
}    

レンダーウィンドウの調整 

glViewport を使用して、OpenGL レンダリング ウィンドウのサイズを設定します。最初の 2 つのパラメータは、ウィンドウの左下隅の位置を設定します。3 番目と 4 番目のパラメータは、レンダリング ウィンドウの幅と高さをピクセル単位で設定します。ビューポート サイズがGLFW サイズ値よりも小さい値に設定すると、すべての OpenGL レンダリングが小さなウィンドウに表示されます。

glViewport(0, 0, 800, 600);

ユーザーがウィンドウのサイズを変更すると、それに応じてビューポートも調整される必要があります。GLFWwindow を最初のパラメーターとして受け取り、新しいウィンドウ サイズを表す 2 つの整数を最初のパラメーターとして受け取る関数を登録します。

void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    glViewport(0, 0, width, height);
}  

ウィンドウのサイズが変更されるたびにこの関数を呼び出すように GLFW に登録するように指示します。

glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);  

レンダリングループ

while ループを作成し、それをレンダリング ループと呼びます。このループは、GLFW に停止を指示するまで実行されます。

while(!glfwWindowShouldClose(window))
{
    glfwSwapBuffers(window);
    glfwPollEvents();    
}

glfwWindowShouldClose 関数は、各ループ反復の開始時に、GLFW が閉じるように指示されているかどうかをチェックします。存在する場合、関数は戻り、レンダリング ループの実行が停止し、その後アプリケーションを閉じることができます。

glfwSwapBuffers は、このレンダリング反復中にレンダリングに使用されるカラー バッファ (GLFW ウィンドウ内の各ピクセルのカラー値を含む大きな 2D バッファ) を交換し、それを画面への出力として表示します。

ダブルバッファ

アプリケーションが単一のバッファーに描画すると、結果の画像がちらつきの問題が発生する場合があります。これは、結果の出力イメージが瞬時に描画されるのではなく、通常は左から右、上から下にピクセルごとに描画されるためです。

このイメージはレンダリングされてもすぐにはユーザーに表示されないため、結果にはアーティファクトが含まれる可能性があります。これらの問題を回避するには、ウィンドウ アプリケーションはレンダリングにダブル バッファリングを使用する必要があります。

フロントエンドバッファには画面に表示される最終出力イメージが含まれますが、すべてのレンダリング コマンドはバックエンド<に描画されます。 a i =3>バッファ。

すべてのレンダリング コマンドが完了したら、バック バッファをフロント バッファに交換して、画像を表示できるようにします。引き続きレンダリングされるため、上記のアーティファクトはすべて削除されます。

glfwPollEvents 関数は、イベント (キーボード入力イベントやマウス移動イベントなど) がトリガーされたかどうかを確認し、ウィンドウの状態を更新し、対応する関数を呼び出します (コールバック メソッドを通じて登録できます)。

レンダリング ループを終了したら、割り当てられたすべての GLFW リソースを適切にクリーン/削除する必要があります。これは、メイン関数の最後で呼び出される glfwTerminate 関数を通じて行うことができます。

glfwTerminate();
return 0;

コンパイルして実行する

すべてがうまくいけば、プログラムを実行すると黒いウィンドウが表示されます。

そうでない場合は、完全なソース コード分析を参照してください。

#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include<iostream>
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    glViewport(0, 0, width, height);
}
int main() {
    glfwInit();  // 初始化窗口
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // 指定创建的内容必须兼容的客户端 API 版本
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // 指定创建的内容必须兼容的客户端 API 版本
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 指定要为其创建内容的 OpenGL 配置文件
    //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // 指定 OpenGL 上下文是否应向前兼容
    GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
    if (window == NULL)
    {
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); // 注册窗口调整调用函数
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
    }
    while(!glfwWindowShouldClose(window))
    {
        glfwSwapBuffers(window);
        glfwPollEvents();
    }
    glfwTerminate();
    return 0;
}

色を変更したい場合は、glClearColor を使用して画面をクリアする色を指定できます。glClear を呼び出してカラー バッファをクリアすると、カラー バッファ全体が glClearColor で設定された色で埋められます。カラー オプションは rgb です。チャンネルパラメータ

    glClearColor(0.0f,0.5f,0.5f,1.0f);
    while(!glfwWindowShouldClose(window))
    {
        glClear(GL_COLOR_BUFFER_BIT);
        glfwSwapBuffers(window);
        glfwPollEvents();
    }
    glfwTerminate();

おすすめ

転載: blog.csdn.net/weixin_62264287/article/details/134795394