次回:影をつける方法
#はじめに
みなさんはMinecraftの影Modをご存じでしょうか...?
(画像:SEUS Renewed)
そうです!Minecraftの世界をとてもリアルにしてくれるアレです!
代表的なSEUS Renewedをはじめ、有志によって製作された様々な影Modがありますが、そのすべてに共通すること...
glslという、シェーダー言語で作られていることです!
#glsl(シェーダー言語)とは...
グラフィックに特化したC言語だと思ってくれてかまいません。
ベクトルやマトリックスなど...
色や座標の計算がしやすいような要素が豊富に用意されています!
この記事では、Minecraftを使用しながらglslの基本を解説していきます!
#準備
まず、Minecraftのシェーダーのテンプレート用意したので、そちらをダウンロードしてください。
テンプレートをMinecraftに適用させる方法は、基本的に他の影Modと変わらないです。
(ここでの導入方法の解説は割愛させていただきます)
適用すると、何も導入していない状態のMinecraftの世界と、見た目があまり変わっていないはずです。
違いがあるとすれば、霧の有無でしょうか。
#実際に編集してみましょう!
テンプレートのフォルダを開くと、「shaders」というフォルダが中にあります。
その中に、glslのシェーダーファイルである、拡張子が「.fsh」、「.vsh」のファイルがたくさん入っています。
今回は、Minecraftの基本的なブロックの色を担当している、「gbuffers_terrain.fsh」を編集してみましょう。
#version 120
uniform sampler2D lightmap;
uniform sampler2D texture;
varying vec2 lmcoord;
varying vec2 texcoord;
varying vec4 glcolor;
void main() {
vec4 diffuse = texture2D(texture, texcoord) * glcolor;
diffuse *= texture2D(lightmap, lmcoord);
gl_FragData[0] = diffuse;
}
仕組みを簡単に説明すると、「diffuse」という変数にMinecraftのテクスチャの情報や明るさの情報を入れ、それを最終的に色の情報を決める、「gl_FragData[0]」に入れています。
「diffuse」には、「赤、緑、青、透明度」の情報が入っているので、今回は透明度をのぞいた色の情報を編集してみます。
diffuse.rgb *= vec3(3.0 , 1.0 , 1.0);
こちらのコードを、「gl_FragData[0] = diffuse;」と「diffuse *= texture2D(lightmap, lmcoord);」の間に書いて保存し、シェーダーを読みこんでみましょう。
ブロックが真っ赤になりましたね。
「A *= B;」は、
Aに、AとBを掛け算したものを入れる
という意味になるので、さきほど書いたコードに置き換えると、
diffuse.rgbに、diffuse.rgbと「赤3.0、緑1.0、青1.0」を掛け算したものを入れる
という意味になります。
diffuseに「.rgb」をつけることで、透明度をのぞく、3色の情報を編集することができます。
「vec3()」は、
かっこの中にある、コンマで区切られた3つの数値を一つにまとめたもの、といった意味で覚えてもらってかまいません。
ご存じのとおり、何かに1.0を掛け算しても結果は変わらないので、さきほど書いたコードでは赤の要素を3倍にしたものになります。
vec3()のかっこの中の数値を変更することで好きな色にすることができるので、あなたのお好みの色に変更してみましょう!
#さいごに
今回が私の初めての記事となります。
なぜMinecraftを使用してglslの基礎を紹介したかというと、
・大人気のゲームなので知名度が高い
・環境を構築する必要がないため、手軽に始められる
・Qiitaで同じような記事が無かった
・単純に私が大好きなゲーム
などの理由があるからです。
Minecraftは有料のゲームですが、シェーダー以外にもMod、コマンド、データパック、リソースパックなど、ひとつのゲームだけで、プログラミング経験者やそうでない人でも多種多様な創作をすることができる点が素晴らしと思います!
次回があれば影をつける方法を解説するつもりなので、今後ともよろしくお願いします!