地形を着色するためにデータ配列をフラグメント シェーダーに渡す方法について以前にこの質問をしたところ、テクスチャの RGBA 値を使用できることが示唆されました。
私は今、yzw
値をどのように使用するかを考え出そうとしています。これは私のフラグメントシェーダーコードです:
vec4 data = texture2D(texture, vec2(verpos.x / 32.0, verpos.z / 32.0));
float blockID = data.x;
vec4 color;
if (blockID == 1.0) {
color = vec4(0.28, 0.52, 0.05, 1.0);
}
else if (blockID == 2.0) {
color = vec4(0.25, 0.46, 0.05, 1.0);
}
else if (blockID == 3.0) {
color = vec4(0.27, 0.49, 0.05, 1.0);
}
gl_FragColor = color;
これは問題なく動作しますが、ご覧のとおり、x
-coordinate の float のみを使用しています。座標も使用している場合yzw
、テクスチャ サイズは 32x32 ではなく 16x16 (4 分の 1) に縮小できます。
これの目的は、各「ブロック」が空間座標で 1x1 であり、blockID に基づいて色付けされる、ボクセル タイプの地形を作成することです。次のようになります。
GLSL 以外ではこれは簡単ですが、どのブロックが計算されたかを保存する機能がないため、これは難しいと感じています。間違いなく、私は物事を考えすぎており、簡単な数学で行うことができます.
編集:
ワグナー・パトリオタの答えに基づくコード:
vec2 pixel_of_target = vec2( verpos.xz * 32.0 - 0.5 ); // Assuming verpos.xz == uv_of_target ?
// For some reason mod() doesn't support integers so I have to convert it using int()
int X = int(mod(pixel_of_target.y, 2.0) * 2.0 + mod(pixel_of_target.x, 2.0));
// Gives the error "Index expression must be constant"
float blockID = data[ X ];
エラーについては、以前にそれについて質問したことが、実際にこれを質問することにつながりました。:P
何かアイデアはありますか? ありがとう!:)