みかづきメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ 書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

GLSL の mod と HLSL の fmod は同等ではない話

ちょっと探せば出てくると言えば出てくるんですが、 GLSL コード (主に ShaderToy とか) を HLSL コード (主に Unity とか) に書き換える際、
以下のように解説しているサイトがあります (もしくは HLSL から GLSL パターンでも)。

GLSL の mod は HLSL の fmod に置き換えられる

実際、いくつかの GLSL to HLSL コンバーターでも、 GLSL の mod を渡すと HLSL では fmod を使うことがあるのですが、
これらの関数は負数を与えた場合の挙動がそれぞれ異なっています。
それぞれの関数をそれぞれのプラットフォームで表すとすると、以下のようにするのが正確です。

// HLSL

float mod(float a, float b) {
    return x - y * floor(x / y);
}

// float fmod(float a, float b) { ... }
// GLSL

// float mod(float a, float b) { ... }

float fmod(float a, float b) {
    return x - y * trunc(x / y);
}

グラフで表すと、下の画像のような結果になる。

f:id:MikazukiFuyuno:20210919191717p:plain
オレンジが GLSL の mod、黄色が HLSL の fmod と同等

ということでメモでした。

PowerShell で過去のコマンドヒストリーを検索したい

なんというか cat ~/.bash_history | rg hello みたいなことをやりたかっただけ。

function Search-History($query)
{
  Get-Content (Get-PSReadLineOption).HistorySavePath | rg $query
}

パイプの後は ripgrep 挟むなり、好みの grep ツールを挟むとよきです。

独自のツールで Visual Studio のエラーフォーマット形式で出力したい

Visual Studio の PostBuild イベントなどで使うツールで、エラーフォーマットを Visual Studio 側にあわせてあげることで、
それらをエラーリストに綺麗に表示してくれるようになります。
ということで、今日はその実装方法について書いてみます。

続きを読む

Python で4点が同一平面上にあるかどうかを確かめたい

最近は Blender Add-on をいじっている私です。
Blender で、ある4点が同一平面上にあるかどうかを知りたくなったので、スクリプトを書きました。

例えば、下のように点 A ~ D があったとして、これがほぼ同一平面上にあるかどうかを知りたい場合は、

import numpy as np

point_a = np.array([...])
point_b = np.array([...])
point_c = np.array([...])
point_d = np.array([...])

以下のようにしてあげることで求められる。

import math

ab = point_b - point_a
ac = point_c - point_a
ad = point_d - point_a

matrix = np.array([
    [ab[0], ac[0], ad[0]],
    [ab[1], ac[1], ad[1]],
    [ab[2], ac[2], ad[2]],
])

r = np.linalg.det(matrix)

if math.isclose(r, 0, abs_tol=1e-5):
    print("ほぼ同一平面上にあるよ")

単純に行列を用いて、4面体の体積を求め、体積が0であるかどうかを確認しているだけ。 (実際の体積は r の 1/6 だけど、今回は気にしない)

ではでは