1. GLSLシェーダープログラミング入門

あたしは暫くの間、自分のゲームエンジンで自分のゲームを作ってきました。これにより、ゲームプレイプログラミング以外にもゲーム開発の多くの側面を発見出来ます。其の中で、グラフィックスプログラミングが最も楽しんでいます。

其の為、GLSLシェーダープログラミングに関するチュートリアルシリーズを書いています。シェーダーシリーズの後には、Vulkan、Maya、線形代数に関するチュートリアルシリーズも書く予定です。

1.1 シェーダとは?

シェーダーはCPUではなくGPU上で動作するプログラムです。其れらはレンダリングパイプラインに不可欠です。シェーダーなしでは、現代のリアルタイムレンダリング(例:3Dゲーム)はあたし達が知る形で機能しません。

ウェブ開発者であれば、グラフィックスAPIをブラウザエンジンに、シェーダーをCSSとJavaScriptに例えるとイメージし易いでしょう。

複数のシェーディング言語がありますが、最も一般的なものはGLSL(OpenGLシェーディング言語)、HLSL(高レベルシェーディング言語)、MSL(Metalシェーディング言語)です。GLSLはCに似た構文、MSLはC++に似た構文、HLSLはCに似た構文ですが、多くのMicrosoft固有の規約とキーワードがあります。

使用する物は、ターゲットとするグラフィックスAPIとプラットフォームに依存します。Metal(macOS及びiOS専用)を使用する場合、MSLを使用します。DirectX(Windows及びXbox専用)を使用する場合、HLSLを使用します。興味深い事に、UnityやUnreal Engineを使用する人は、ターゲットプラットフォームに関係なくHLSLを書く事になりますが、Windows以外のプラットフォームでは自動的にGLSL又はMSLに変換されます。PlayStationでは独自のGNM API用にPSSL(PlayStationシェーディング言語)が使用されますが、PlayStationへのアクセスがなくなった為、此れについて多くは言えません。

OpenGL、Vulkan、又はNVN(Linux、BSD、Windows、Nintendo Switch、Android、Haikuの殆どのプラットフォームで動作)を使用する場合、GLSLを使用します。其の為、ここではGLSLにのみ焦点を当てます。

Vulkanでは実際にはSPIR-Vを使用していますが、それはGLSLからコンパイルされた物です。

注:このチュートリアルシリーズでは、具体的にはOpenGL 4.5 Core(macOSの場合は4.1 Core)のGLSLを扱います。GLSLは様々なプラットフォームで使用されますが、グラフィックスAPIやプログラミングするプラットフォームによって方言が異なる場合があります。従って、Vulkan、Android、Nintendo Switch、又はWeb GPUに適応する場合は、違いに注意してください!

1.2 始め方

どのOSからでも此のチュートリアルシリーズを追う事が出来ますが、商用作業環境を再現します。此れは、Windowsで作業し、Visual Studio 2022をインストールしている事を前提としています。

スタータープロジェクトをダウンロード:

ZIPをダウンロード

TARをダウンロード

Windows又はmacOSの場合、ZIPファイルをダウンロードして下さい。BSD又はLinuxの場合、TARファイルをダウンロードして下さい。

BSDとLinuxでは、unzipユーティリティにバグがあり、其れを使用すると非英語文字が破損します。其の為、ZIPファイルではなくTarballをダウンロードする事をお勧めします。

Windowsユーザーの場合、Visual Studio 2022 Professionalをエディターとして使用していると仮定します。macOSユーザーの場合、macOSでコマンドラインユーティリティを使用してコンパイル及び実行する事が可能ですが、Xcodeをエディターとして使用していると仮定します。Unixユーザーの場合、Neovimをエディターとして使用していると仮定します。

Windows

Windowsでは、アーカイブを解凍し、glsltester.slnを実行し、F5を押してください。

次のような画面が表示されるはずです:

macOS

macOSでは、アーカイブを解凍し、glsltester.xcodeprojを実行し、CMD + Rを押して下さい。

次の様な画面が表示されるはずです:

注:AppleはOpenGL 4.2以上のサポートを廃止しました。其の為、main.cファイルはMacユーザー向けにOpenGL 4.1に設定されています。然し、このチュートリアルシリーズではGLSL 4.5シェーダーを使用している為、一部の機能が欠けている可能性があります。其の為、あたしが提供するコードで#version 450 coreを見た場合、代わりに#version 410 coreを使用して下さい。

更に、此れは2015年のIntelベースのMacBook Proで設定及びテストされた為、ARMベースのMacモデルで動作するかどうかは分かりません。

Unix

Linux、FreeBSD、OpenBSD、又はNetBSDを使用する場合、OSのパッケージマネージャーからOpenGLドライバーとGLFWをインストールして下さい。

FreeBSDの場合:

pkg install glfw

OpenBSDの場合:

pkg_add glfw

Devuan又はDebianの場合:

apt install libglfw3-dev libglfw3

他のディストリビューションの場合は、各自で解決して下さい。

このスクリプトはClangコンパイラーを使用していると仮定しています。ccが見つからないと言われた場合、build.shファイルを編集し、ccgccに変更して下さい。

tar zxfv glsltester.tar.gz
cd glsltester
chmod +x build.sh
./build.sh

次の様な画面が表示されるはずです:

今はコード全体を心配する必要はありません。最も重要な部分はシェーダーファイルと、main.c内の以下の2行です:

    glUniform3f(glGetUniformLocation(shaderProgram, "uColorA"), 1.0f, 0.0f, 0.0f); // 赤
    glUniform3f(glGetUniformLocation(shaderProgram, "uColorB"), 0.0f, 1.0f, 0.0f); // 緑