サンプリングの参考資料。

Twitterみていたら,サンプリングの参考になりそうなツイートを見かけました。
SSAOとかの実装で使っていきたいなと思いました。

画像に書いてあるサイトは下記の様です。
https://note.com/outburst/n/n631a3845186c

ReSTIRがサッパリ解からない。

この記事はレイトレ合宿9のアドベントカレンダー2023 7/13の担当分の記事です。

こんにちわ,Pocolです。
最近,ReSTIRを調べているのですが,未だにサッパリ解かりません(特にGRIS周辺)。

今回は,自分の理解を促すために自分なりにまとめたスライドを作ってみました!
しかし,内容をサッパリ理解していない人が作っているスライドなので内容が盛大に間違えている場合があります。
間違いがあった場合は,間違い箇所の指摘とその修正例を教えて頂けると大変ありがたいです。あるいは,「そういう説明よりもこういう説明の方がいいよ」とか「この項目の説明抜けてる!」とか,アドバイスも貰えると嬉しいです。
または,有識者が分かりやすい解説記事を書いてもらえると大変助かります。
あと,論文の内容を切り貼りしている関係で,数式の表記ゆれがあります。予め注意してください。

読み下ろしテクニックの話。

こんらみ。Pocolです。
自分は,駿台っ子なんですが,当時御茶ノ水校や千葉校,柏校などで英語長文を担当していた新井和泰先生の教え子でもあるのですが,
この歳になっても非常に役に立っているのが,新井先生から習った読み下ろしテクニックです。新井先生!滅茶苦茶役に立っています!!

 こちらは一応文献的には,駿台フォーラム第18号で紹介されています。恐らく絶版していると思われるので,今手に入ることはないかもしれません。

 で,ネットで検索していたら,訳下しという記事が出てきて,当時先生が言っていたような話がヒットしました。なんだか懐かしい気がしてきたので,時間を掛けて読んでみようかなって思います。

https://thbook.simul.co.jp/archive/category/同時通訳

先生が今だに現役だったら申し訳ないんですが,恐らくもう還暦を超えていて,営業妨害にはならないと思われるのと,非常に有用なテクニックなので,時間があればどこかで先生のテクニックを紹介したいと思います。まぁ興味ある人がいればですけども…。

標準体重達成!

こんにちわ、Pocolです。
相変わらずダイエットを頑張ってやっています。

本日の体重は58.9kgで,ついに58kgに突入しました!
上記の体重で分かるように標準体重以下になりました。
内臓脂肪レベルは6.5で,体脂肪率は15.3%,BMIは21.8です。筋肉量が前回よりもちょっと減り気味なのが,気になる点です。

まだ,ダイエット始めて2カ月は立っていないのですが,1カ月ちょっとでここまで削れたのは自分でも驚きですね。
基本的に,ダイエットの仕方はほとんど変わっていないですが,最近停滞期気味なので,仕方なくFitboxingでの運動量を増やしました。
朝・昼・晩と3回Dailyをこなす感じにしました。

血液検査の結果は次回の診察時に教えてもらえるそうで,次回の診察で,薬物治療をやめるかどうか判断しましょうかという話になりました。
今のところは,あまり体の方も問題なく調子いい感じです。夜中に突然目が覚めるのも無くなって,ぐっすり眠れています。

会社もそろそろリアル出社に切り替わるようで,飲み会等も増える気がしているので,何とかそれまでには治ってほしいなぁと思っています。

Bilateral Upsampling

こんにちわ,Pocolです。
今日はバイラテラルアップサンプリングについてメモをしておこうと思います。
パフォーマンスを稼ぐために,低解像度で描画しておき,それを元解像度に戻したいという場面が,ゲームグラフィックスでは多々出てきます。具体的には,SSAOやSSRなどの計算です。
ただ単にバイリニア補間で元解像度に戻してしまうとエッジ部分などでアーティファクトが発生してしまうことがあります。
こうしたアーティファクトを避けるために使われる手法の中の一つとして,Bilateral Upsamplingがあります。

通常のバイリニア補間は4点から計算を行います。

バイラテラルアップサンプリングは,法線と深度によってバイリニアウェイトを修正します。サンプルは以下のように,バイリニアの重み,法線の類似度による重み,深度の類似度による重みの3つによって重みづけされます。

バイリニアの重みは以下です。

法線の重みは次のように求めます。

深度の重みは次のように求めます。

以上から求められた重みを使ってサンプルを重みづけします。下図の通りです。

実装例ですが,もんしょさんが「DirectXの話 第121回 Bilateral Upsampling」の記事にてサンプルコードをアップしてくださっています。有難いです。
シェーダコードを抜粋すると下記の通りです。

float4 RenderUpsamplingPS( OutputVS inPixel ) : SV_TARGET
{
	const float2 kScreenSize = g_ScreenParam.xy * 2.0;
	const float2 kScreenHalfSize = g_ScreenParam.xy;
	const float4 kBilinearWeights[4] =
	{
		float4( 9.0/16.0, 3.0/16.0, 3.0/16.0, 1.0/16.0 ),
		float4( 3.0/16.0, 9.0/16.0, 1.0/16.0, 3.0/16.0 ),
		float4( 3.0/16.0, 1.0/16.0, 9.0/16.0, 3.0/16.0 ),
		float4( 1.0/16.0, 3.0/16.0, 3.0/16.0, 9.0/16.0 )
	};

	// Hi-Resピクセルのインデックスを求める
	int2 hiResUV = (int2)(inPixel.texCoord0 * kScreenSize + float2(0.1, 0.1));
	int hiResIndex = (1 - (hiResUV.y & 0x01)) * 2 + (1 - (hiResUV.x & 0x01));
	float4 hiResND = texNormalDepth.Load( int3(hiResUV, 0), int2(0, 0) );

	// Low-Resから4ピクセルの法線・深度を求める
	int2 lowResUV = (int2)(inPixel.texCoord0 * kScreenHalfSize.xy + float2(0.1, 0.1));
	float4 lowResND[4];
	float lowResAO[4];
	switch (hiResIndex)
	{
	case 0:
		lowResND[0] = texHalfNormalDepth.Load( int3(lowResUV, 0), int2(0, 0) );
		lowResND[1] = texHalfNormalDepth.Load( int3(lowResUV, 0), int2(1, 0) );
		lowResND[2] = texHalfNormalDepth.Load( int3(lowResUV, 0), int2(0, 1) );
		lowResND[3] = texHalfNormalDepth.Load( int3(lowResUV, 0), int2(1, 1) );
		lowResAO[0] = texHDAO.Load( int3(lowResUV, 0), int2(0, 0) ).r;
		lowResAO[1] = texHDAO.Load( int3(lowResUV, 0), int2(1, 0) ).r;
		lowResAO[2] = texHDAO.Load( int3(lowResUV, 0), int2(0, 1) ).r;
		lowResAO[3] = texHDAO.Load( int3(lowResUV, 0), int2(1, 1) ).r;
		break;
	case 1:
		lowResND[0] = texHalfNormalDepth.Load( int3(lowResUV, 0), int2(-1, 0) );
		lowResND[1] = texHalfNormalDepth.Load( int3(lowResUV, 0), int2(0, 0) );
		lowResND[2] = texHalfNormalDepth.Load( int3(lowResUV, 0), int2(-1, 1) );
		lowResND[3] = texHalfNormalDepth.Load( int3(lowResUV, 0), int2(0, 1) );
		lowResAO[0] = texHDAO.Load( int3(lowResUV, 0), int2(-1, 0) ).r;
		lowResAO[1] = texHDAO.Load( int3(lowResUV, 0), int2(0, 0) ).r;
		lowResAO[2] = texHDAO.Load( int3(lowResUV, 0), int2(-1, 1) ).r;
		lowResAO[3] = texHDAO.Load( int3(lowResUV, 0), int2(0, 1) ).r;
		break;
	case 2:
		lowResND[0] = texHalfNormalDepth.Load( int3(lowResUV, 0), int2(0, -1) );
		lowResND[1] = texHalfNormalDepth.Load( int3(lowResUV, 0), int2(1, -1) );
		lowResND[2] = texHalfNormalDepth.Load( int3(lowResUV, 0), int2(0, 0) );
		lowResND[3] = texHalfNormalDepth.Load( int3(lowResUV, 0), int2(1, 0) );
		lowResAO[0] = texHDAO.Load( int3(lowResUV, 0), int2(0, -1) ).r;
		lowResAO[1] = texHDAO.Load( int3(lowResUV, 0), int2(1, -1) ).r;
		lowResAO[2] = texHDAO.Load( int3(lowResUV, 0), int2(0, 0) ).r;
		lowResAO[3] = texHDAO.Load( int3(lowResUV, 0), int2(1, 0) ).r;
		break;
	case 3:
		lowResND[0] = texHalfNormalDepth.Load( int3(lowResUV, 0), int2(-1, -1) );
		lowResND[1] = texHalfNormalDepth.Load( int3(lowResUV, 0), int2(0, -1) );
		lowResND[2] = texHalfNormalDepth.Load( int3(lowResUV, 0), int2(-1, 0) );
		lowResND[3] = texHalfNormalDepth.Load( int3(lowResUV, 0), int2(0, 0) );
		lowResAO[0] = texHDAO.Load( int3(lowResUV, 0), int2(-1, -1) ).r;
		lowResAO[1] = texHDAO.Load( int3(lowResUV, 0), int2(0, -1) ).r;
		lowResAO[2] = texHDAO.Load( int3(lowResUV, 0), int2(-1, 0) ).r;
		lowResAO[3] = texHDAO.Load( int3(lowResUV, 0), int2(0, 0) ).r;
		break;
	}

	// 法線のウェイトを求める
	float totalWeight = 0.0;
	float ao = 0.0;
	for( int i = 0; i < 4; ++i )
	{
		// 法線のウェイトを求める
		float normalWeight = dot( lowResND[i].xyz, hiResND.xyz );
		normalWeight = pow( saturate(normalWeight), 32.0 );

		// 深度のウェイトを求める
		float depthDiff = hiResND.w - lowResND[i].w;
		float depthWeight = 1.0 / (1.0 + abs(depthDiff));

		// 総合する
		float weight = normalWeight * depthWeight * kBilinearWeights[hiResIndex][i];
		totalWeight += weight;
		ao += lowResAO[i] * weight;
	}

	ao /= totalWeight;

	return float4(ao, ao, ao, 1);
}

…ということで,Bilateral Upsamplingの話でした。
もしかしたら,Quad系のWaveIntrinsics使って実装した方がナウいかもしれないですね(※試してないので,出来なかったらごめんなさい)。

※追記
Quad Intrinsics使って実装できました。
WaveGetLaneIndex() % 4でhiResIndexを算出します。一度現在位置での,lowResNDとlowResAOを先頭の方でサンプリングしておき,あとはループでQuadReadLaneAt(lowResND, i)と QuadReadLaneAt(lowResAO, i)で,処理対象を持ってきます。これでswitchケース分が丸っとなくせるのと,テクスチャフェッチ回数が減らせます。

減量継続中。

こんにちわ,Pocolです。

引き続き頑張って内臓脂肪を減らすためにダイエット中です。
今日体重を測ったら,62.4kgでした。前回投稿時が64.5kgなので10日で2kg減量したことになります。
これで,ダイエット始めてから1カ月以内に6kgの減量に成功したことになります。

2kgやせるのも5日ほど短縮しています。
ここ最近変化したことといえば,Fitboxingでの運動量を増やして,平均590kcal程度になるようにしたこと。8時間ダイエット法を取り入れるようにしたことですかね。
8時間ダイエット法のほうはあんまり効いている感じしないのですが,食事をとる時間が圧縮されて,自由に使える時間が増えるというメリットがあるので,効果は出なくとも減量中は一応続けていこうかと思います。

タニタの体組成計で,体重や基礎代謝等を毎日図っているのですが,今のところ筋力量も基礎代謝量も減らずに体重減っているので,いい感じです。
内臓脂肪レベルも8.5まで減り,ようやく標準の範囲に入ってきました。体脂肪率も減ってきて,18%とかそのあたりの数値になってきて,ギリギリ肥満ではないレベルに入りました。

数日後に病院に診察してもらいに行こうかなって思っているので,どういう結果になっているか,期待半分不安半分という感じです。

GDC 2023関連

こんにちわ、Pocolです。
GDC 2023関連の情報をまとめていなかったので,(FreeContentsで)興味ある資料をまとめておこうと思います。

成果が出てきた!

こんにちわ。
Pocolです。

引き続き,減量を頑張っています。
今日入浴前に体重を測ったら64.5kgでした。
前回投稿が4/21なので,15日経過で 66.8kg – 64.5kg = 2.3kg 減量しています。
着実にですが,効果が出ています。
今のところ1週間で1kgぐらいのペースですね。

前回投稿から気づいた点としては,無理に食事制限するとマジでヤバいということを体験しました。
まず,朝起きたら手足が何か痺れるのと,手などの皮膚が異様にボロボロになるという状態で,流石にダイエット完了する前に死んでしまう!と感じました。
で,ネットでも色々と調べてみるとあまりに食事制限してしまうと,体がヤバいと感じてしまいエネルギーを蓄えてしまう体になってしまい,痩せずらい身体になってしまうそうです。
あとは皮膚がボロボロになるのも必要な栄養素が不足している現象の様です。

…ということで,まずは栄養素の偏りを是正するために,ドラッグストアに駆け込みマルチビタミンとマルチミネラルを購入してきました。
これで最低限必要なビタミンとミネラルは補給できるはず。
次に,痩せずらい身体になってしまうのを回避するために,1週間に1回食事制限をしない普通の食生活にするということを行いました。
いつもよりも数百kcal多いですが,それでも多分一般的なの人がダイエットで摂取するぐらいで,十分少ないです。
後は,無理な食事制限はツライということも分かったので,野菜中心の食生活にしました。コンビニのサラダでちょっと頑張ろうかと思ったのですが,調べてみると意外とカロリーが高い。ご飯1杯ぐらいあるものも存在する(しかも,これまで好んで食べていたやつがそうだった)ので,季節感に全然合わないですが,鍋料理を昼夜と食べています。
意外と満腹感がありますが,ほとんど体重には悪い影響は出ていないというのも良い点です。今のところは,赤からの鍋と,バズレシピの脂肪燃焼塩スープを作って食べています。
これで,大分安心した生活が出来るようになりました。

また,Fitboxingも減量のために開始したのですが,1日の消費カロリーを300kcalを目安に動くようにしています。
これが,結構いい感じに効いていて,食事制限のみだと体重が減らない状態だったのですが,また順調に減るようになってきています。
35分のデイリーをやった後に,フリーで300kcalになるように調整という感じです。
普段運動を全くしない状態で,全部ぶっ通しでやるとツラいので,休憩を挟みながらやっています。
GWで実家に帰っていたのですが,昼と夜にそれぞれFitboxingやるようにすれば,意外と大変な思いをせずに続けられそうということが分かりました。

何とかこの調子で,残り5kgを頑張って減量していきたいです。