<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>HLSL on ながむしメモ</title><link>https://nagakagachi.github.io/categories/hlsl/</link><description>Recent content in HLSL on ながむしメモ</description><generator>Hugo</generator><language>ja-JP</language><lastBuildDate>Wed, 28 Jan 2026 23:46:56 +0900</lastBuildDate><atom:link href="https://nagakagachi.github.io/categories/hlsl/index.xml" rel="self" type="application/rss+xml"/><item><title>UEマテリアルネタ帳</title><link>https://nagakagachi.github.io/entry/2026/01/28/234656/</link><pubDate>Wed, 28 Jan 2026 23:46:56 +0900</pubDate><guid>https://nagakagachi.github.io/entry/2026/01/28/234656/</guid><description>&lt;p&gt;雑多なネタを書いてあとで探しやすくするためのページ.&lt;/p&gt;&#10;&lt;p&gt;役に立ったらイイネや紹介してね☆（ゝω・）vｷｬﾋﾟ&lt;/p&gt;&#10;&lt;ul class="table-of-contents"&gt;&#10;&lt;li&gt;&lt;a href="#Simplex頂点に任意の乱数を利用できるSimplex-Noise"&gt;Simplex頂点に任意の乱数を利用できるSimplex Noise&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#入力ベクトルの主要軸と第二主要軸を抽出する"&gt;入力ベクトルの主要軸と第二主要軸を抽出する&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="Simplex頂点に任意の乱数を利用できるSimplex-Noise"&gt;Simplex頂点に任意の乱数を利用できるSimplex Noise&lt;/h3&gt;&#10;&lt;p&gt;&lt;iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fnagakagachi.hatenablog.com%2Fentry%2F2023%2F07%2F26%2F135233" title="Simplex頂点に任意の乱数を利用できるSimplex Noise Custom Node[UE][UE5] - ながむしメモ" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"&gt;&lt;/iframe&gt;&lt;cite class="hatena-citation"&gt;&lt;a href="https://nagakagachi.hatenablog.com/entry/2023/07/26/135233"&gt;nagakagachi.hatenablog.com&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;&lt;br /&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="入力ベクトルの主要軸と第二主要軸を抽出する"&gt;入力ベクトルの主要軸と第二主要軸を抽出する&lt;/h3&gt;&#10;&lt;p&gt;ベクトルの&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%DD%A1%BC%A5%CD%A5%F3%A5%C8"&gt;コンポーネント&lt;/a&gt;について絶対値が大きい順で第一位(Dominant), 第二位(Secondary)の軸の情報を抽出する.&lt;br /&gt;&#10;軸インデックス:x=0, y=1, z=2&lt;br /&gt;&#10;と&lt;br /&gt;&#10;軸マスクベクトル (1, 0, 0), (0, 1, 0), (0, 0, 1)&lt;br /&gt;&#10;を返す.&lt;br /&gt;&#10;もっとシンプルな記述ができそうなので後でアップデートするかも.&lt;br /&gt;&#10;&lt;span itemscope itemtype="http://schema.org/Photograph"&gt;&lt;img src="images/2f7988364730b8938c8767f1068a1d61ce37261a3bab66557ad5ed82ea7fbfab.png" width="1200" height="717" loading="lazy" title="" class="hatena-fotolife" itemprop="image"&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;pre class="code lang-cpp" data-lang="cpp" data-unlink&gt;&lt;span class="synType"&gt;const&lt;/span&gt; float3 abs_dir = &lt;span class="synIdentifier"&gt;abs&lt;/span&gt;(in_dir);&#10;&lt;p&gt;&lt;span class="synType"&gt;const&lt;/span&gt; int3 comp0 = abs_dir.xyz &amp;gt; abs_dir.yzx;&#10;&lt;span class="synType"&gt;const&lt;/span&gt; int3 comp1 = abs_dir.xyz &amp;gt; abs_dir.zxy;&#10;&lt;span class="synType"&gt;const&lt;/span&gt; int3 &lt;span class="synType"&gt;rank&lt;/span&gt; = comp0+comp1;&lt;/p&gt;</description></item><item><title>Simplex頂点に任意の乱数を利用できるSimplex Noise Custom Node[UE][UE5]</title><link>https://nagakagachi.github.io/entry/2023/07/26/135233/</link><pubDate>Wed, 26 Jul 2023 13:52:33 +0900</pubDate><guid>https://nagakagachi.github.io/entry/2023/07/26/135233/</guid><description>&lt;p&gt;題名の通りです.&lt;/p&gt;&#10;&lt;p&gt;個人的な興味により Simplex Noiseの頂点毎の乱数計算 を差し替えられるCustomNodeを作成したので公開.&lt;/p&gt;&#10;&lt;p&gt;Simplex Noise には以下のShadertoyを参考にしています. thanks!&lt;br /&gt;&#10;&lt;a href="https://www.shadertoy.com/view/XsX3zB"&gt;https://www.shadertoy.com/view/XsX3zB&lt;/a&gt;&lt;br /&gt;&#10;(XsX3zB)&lt;/p&gt;&lt;p&gt;&lt;span itemscope itemtype="http://schema.org/Photograph"&gt;&lt;img src="images/6341e8500430eef917d544f8bbfdce4695c1a4c941362eaa86570ca9392d3d32.png" width="1200" height="896" loading="lazy" title="" class="hatena-fotolife" itemprop="image"&gt;&lt;/span&gt;&lt;br /&gt;&#10;&lt;/p&gt;&#10;&lt;ul class="table-of-contents"&gt;&#10;&lt;li&gt;&lt;a href="#前置き"&gt;前置き&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#コピペ用テキスト"&gt;コピペ用テキスト&lt;/a&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="#前処理CustomNode"&gt;前処理CustomNode&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#乱数CustomNode-3D座標から3D乱数出力ができるものに置き換え可能"&gt;乱数CustomNode (3D座標から3D乱数出力ができるものに置き換え可能)&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#後処理CustomNode"&gt;後処理CustomNode&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#おまけ"&gt;おまけ&lt;/a&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="#マテリアルコピペ用"&gt;マテリアルコピペ用&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="前置き"&gt;前置き&lt;/h3&gt;&#10;&lt;p&gt;CustomNodeは3段階(コア部分は2段階)で,&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;前処理&#10;&lt;ul&gt;&#10;&lt;li&gt;Simplexの頂点情報他を出力&lt;/li&gt;&#10;&lt;/ul&gt;&lt;/li&gt;&#10;&lt;li&gt;乱数ノード&#10;&lt;ul&gt;&#10;&lt;li&gt;(ここが任意に差し替え可)&lt;/li&gt;&#10;&lt;/ul&gt;&lt;/li&gt;&#10;&lt;li&gt;後処理&#10;&lt;ul&gt;&#10;&lt;li&gt;Simplex頂点の乱数からノイズ出力&lt;/li&gt;&#10;&lt;/ul&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;という構成です.&lt;/p&gt;&#10;&lt;p&gt;使用例としては以下のようになります.&lt;/p&gt;&#10;&lt;figure class="figure-image figure-image-fotolife" title="使用例"&gt;&lt;span itemscope itemtype="http://schema.org/Photograph"&gt;&lt;img src="images/1a45015452350cb2918ce03f7060bd4fc083c8bcfcac3def2bc52f7e6b2fcb22.png" width="1200" height="454" loading="lazy" title="" class="hatena-fotolife" itemprop="image"&gt;&lt;/span&gt;&lt;figcaption&gt;使用例&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="コピペ用テキスト"&gt;コピペ用テキスト&lt;/h3&gt;&#10;&lt;p&gt;マテリアルエディタにうまくコピペできない等の問題がありましたら&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/Twitter"&gt;Twitter&lt;/a&gt;等でお知らせください.&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4 id="前処理CustomNode"&gt;前処理CustomNode&lt;/h4&gt;&#10;&lt;p&gt;&lt;span itemscope itemtype="http://schema.org/Photograph"&gt;&lt;img src="images/e250ef305152f57f40e7c94ccbcb91414348dc489a18cd1ec49f4181f0ad3e60.png" width="381" height="386" loading="lazy" title="" class="hatena-fotolife" itemprop="image"&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;pre class="code lang-hlsl" data-lang="hlsl" data-unlink&gt;Begin Object Class=/Script/UnrealEd.MaterialGraphNode Name=&lt;span class="synConstant"&gt;&amp;quot;MaterialGraphNode_109&amp;quot;&lt;/span&gt;&#10; Begin Object Class=/Script/Engine.MaterialExpressionCustom Name=&lt;span class="synConstant"&gt;&amp;quot;MaterialExpressionCustom_0&amp;quot;&lt;/span&gt;&#10; End Object&#10; Begin Object Name=&lt;span class="synConstant"&gt;&amp;quot;MaterialExpressionCustom_0&amp;quot;&lt;/span&gt;&#10; Code=&lt;span class="synConstant"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;/*&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt; 3D SimplexNoise の前段処理&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;[Reference materials]&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;https://www.shadertoy.com/view/XsX3zB&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n\r\n\r\n&lt;/span&gt;&lt;span class="synConstant"&gt; input:&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt; // ノイズ計算座標.&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt; in_pos&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n\r\n&lt;/span&gt;&lt;span class="synConstant"&gt; output:&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt; // Simplex(3DではTetrahedron)の頂点座標&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt; out_simplex_vtx_pos0&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt; out_simplex_vtx_pos1&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt; out_simplex_vtx_pos2&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt; out_simplex_vtx_pos3&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt; &lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt; // Simplexの頂点へのベクトル. 後段でのGradientNoise計算用.&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt; out_simplex_d0&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt; out_simplex_d1&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt; out_simplex_d2&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt; out_simplex_d3&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;*/&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;const float F3 = 0.33333;&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;const float G3 = 0.16667;&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;// Skew&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;float3 s = floor(in_pos + dot(in_pos, F3));&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;float3 x = in_pos - s + dot(s, G3);&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;//&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;float3 e = step(0.0, x - x.yzx);&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;float3 i1 = e * (1.0 - e.zxy);&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;float3 i2 = 1.0 - e.zxy*(1.0-e);&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;//&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;float3 x1 = x - i1 + G3;&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;float3 x2 = x - i2 + 2.0 * G3;&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;float3 x3 = x - 1.0 + 3.0*G3;&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;out_simplex_vtx_pos0 = s;&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;out_simplex_vtx_pos1 = s + i1;&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;out_simplex_vtx_pos2 = s + i2;&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;out_simplex_vtx_pos3 = s + 1;&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;out_simplex_d0 = x;&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;out_simplex_d1 = x1;&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;out_simplex_d2 = x2;&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;out_simplex_d3 = x3;&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;return 1;&amp;quot;&lt;/span&gt;&#10; Description=&lt;span class="synConstant"&gt;&amp;quot;Custom_SimplexNoise3to1_Setup&amp;quot;&lt;/span&gt;&#10; &lt;span class="synIdentifier"&gt;Inputs&lt;/span&gt;(&lt;span class="synConstant"&gt;0&lt;/span&gt;)=(InputName=&lt;span class="synConstant"&gt;&amp;quot;in_pos&amp;quot;&lt;/span&gt;,Input=(Expression=/Script/Engine.MaterialExpressionAdd'&lt;span class="synConstant"&gt;&amp;quot;MaterialExpressionAdd_5&amp;quot;&lt;/span&gt;'))&#10; &lt;span class="synIdentifier"&gt;AdditionalOutputs&lt;/span&gt;(&lt;span class="synConstant"&gt;0&lt;/span&gt;)=(OutputName=&lt;span class="synConstant"&gt;&amp;quot;out_simplex_vtx_pos0&amp;quot;&lt;/span&gt;,OutputType=CMOT_Float3)&#10; &lt;span class="synIdentifier"&gt;AdditionalOutputs&lt;/span&gt;(&lt;span class="synConstant"&gt;1&lt;/span&gt;)=(OutputName=&lt;span class="synConstant"&gt;&amp;quot;out_simplex_vtx_pos1&amp;quot;&lt;/span&gt;,OutputType=CMOT_Float3)&#10; &lt;span class="synIdentifier"&gt;AdditionalOutputs&lt;/span&gt;(&lt;span class="synConstant"&gt;2&lt;/span&gt;)=(OutputName=&lt;span class="synConstant"&gt;&amp;quot;out_simplex_vtx_pos2&amp;quot;&lt;/span&gt;,OutputType=CMOT_Float3)&#10; &lt;span class="synIdentifier"&gt;AdditionalOutputs&lt;/span&gt;(&lt;span class="synConstant"&gt;3&lt;/span&gt;)=(OutputName=&lt;span class="synConstant"&gt;&amp;quot;out_simplex_vtx_pos3&amp;quot;&lt;/span&gt;,OutputType=CMOT_Float3)&#10; &lt;span class="synIdentifier"&gt;AdditionalOutputs&lt;/span&gt;(&lt;span class="synConstant"&gt;4&lt;/span&gt;)=(OutputName=&lt;span class="synConstant"&gt;&amp;quot;out_simplex_d0&amp;quot;&lt;/span&gt;,OutputType=CMOT_Float3)&#10; &lt;span class="synIdentifier"&gt;AdditionalOutputs&lt;/span&gt;(&lt;span class="synConstant"&gt;5&lt;/span&gt;)=(OutputName=&lt;span class="synConstant"&gt;&amp;quot;out_simplex_d1&amp;quot;&lt;/span&gt;,OutputType=CMOT_Float3)&#10; &lt;span class="synIdentifier"&gt;AdditionalOutputs&lt;/span&gt;(&lt;span class="synConstant"&gt;6&lt;/span&gt;)=(OutputName=&lt;span class="synConstant"&gt;&amp;quot;out_simplex_d2&amp;quot;&lt;/span&gt;,OutputType=CMOT_Float3)&#10; &lt;span class="synIdentifier"&gt;AdditionalOutputs&lt;/span&gt;(&lt;span class="synConstant"&gt;7&lt;/span&gt;)=(OutputName=&lt;span class="synConstant"&gt;&amp;quot;out_simplex_d3&amp;quot;&lt;/span&gt;,OutputType=CMOT_Float3)&#10; MaterialExpressionEditorX=-&lt;span class="synConstant"&gt;2048&lt;/span&gt;&#10; MaterialExpressionEditorY=&lt;span class="synConstant"&gt;2512&lt;/span&gt;&#10; MaterialExpressionGuid=4244B9A4494561E6D73F14B3D48C4E67&#10; Material=/Script/UnrealEd.PreviewMaterial'&lt;span class="synConstant"&gt;&amp;quot;/Engine/Transient.M_InnerLayerPm2&amp;quot;&lt;/span&gt;'&#10; bShowOutputNameOnPin=True&#10; bCollapsed=True&#10; &lt;span class="synIdentifier"&gt;Outputs&lt;/span&gt;(&lt;span class="synConstant"&gt;0&lt;/span&gt;)=(OutputName=&lt;span class="synConstant"&gt;&amp;quot;return&amp;quot;&lt;/span&gt;)&#10; &lt;span class="synIdentifier"&gt;Outputs&lt;/span&gt;(&lt;span class="synConstant"&gt;1&lt;/span&gt;)=(OutputName=&lt;span class="synConstant"&gt;&amp;quot;out_simplex_vtx_pos0&amp;quot;&lt;/span&gt;)&#10; &lt;span class="synIdentifier"&gt;Outputs&lt;/span&gt;(&lt;span class="synConstant"&gt;2&lt;/span&gt;)=(OutputName=&lt;span class="synConstant"&gt;&amp;quot;out_simplex_vtx_pos1&amp;quot;&lt;/span&gt;)&#10; &lt;span class="synIdentifier"&gt;Outputs&lt;/span&gt;(&lt;span class="synConstant"&gt;3&lt;/span&gt;)=(OutputName=&lt;span class="synConstant"&gt;&amp;quot;out_simplex_vtx_pos2&amp;quot;&lt;/span&gt;)&#10; &lt;span class="synIdentifier"&gt;Outputs&lt;/span&gt;(&lt;span class="synConstant"&gt;4&lt;/span&gt;)=(OutputName=&lt;span class="synConstant"&gt;&amp;quot;out_simplex_vtx_pos3&amp;quot;&lt;/span&gt;)&#10; &lt;span class="synIdentifier"&gt;Outputs&lt;/span&gt;(&lt;span class="synConstant"&gt;5&lt;/span&gt;)=(OutputName=&lt;span class="synConstant"&gt;&amp;quot;out_simplex_d0&amp;quot;&lt;/span&gt;)&#10; &lt;span class="synIdentifier"&gt;Outputs&lt;/span&gt;(&lt;span class="synConstant"&gt;6&lt;/span&gt;)=(OutputName=&lt;span class="synConstant"&gt;&amp;quot;out_simplex_d1&amp;quot;&lt;/span&gt;)&#10; &lt;span class="synIdentifier"&gt;Outputs&lt;/span&gt;(&lt;span class="synConstant"&gt;7&lt;/span&gt;)=(OutputName=&lt;span class="synConstant"&gt;&amp;quot;out_simplex_d2&amp;quot;&lt;/span&gt;)&#10; &lt;span class="synIdentifier"&gt;Outputs&lt;/span&gt;(&lt;span class="synConstant"&gt;8&lt;/span&gt;)=(OutputName=&lt;span class="synConstant"&gt;&amp;quot;out_simplex_d3&amp;quot;&lt;/span&gt;)&#10; End Object&#10; MaterialExpression=/Script/Engine.MaterialExpressionCustom'&lt;span class="synConstant"&gt;&amp;quot;MaterialExpressionCustom_0&amp;quot;&lt;/span&gt;'&#10; NodePosX=-&lt;span class="synConstant"&gt;2048&lt;/span&gt;&#10; NodePosY=&lt;span class="synConstant"&gt;2512&lt;/span&gt;&#10; NodeGuid=694DDEB64074FA334F4FD9A71A7FD483&#10; CustomProperties &lt;span class="synIdentifier"&gt;Pin &lt;/span&gt;(PinId=14B3EA4E44D4A873700D33A55F7AE5AD,PinName=&lt;span class="synConstant"&gt;&amp;quot;in_pos&amp;quot;&lt;/span&gt;,PinType.PinCategory=&lt;span class="synConstant"&gt;&amp;quot;required&amp;quot;&lt;/span&gt;,PinType.PinSubCategory=&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,PinType.PinSubCategoryObject=&lt;span class="synConstant"&gt;None&lt;/span&gt;,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=&lt;span class="synConstant"&gt;None&lt;/span&gt;,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(MaterialGraphNode_103 &lt;span class="synConstant"&gt;5246F&lt;/span&gt;4EE4F841D0B87A775BDC4A8D155,),PersistentGuid=&lt;span class="synPreProc"&gt;0&lt;/span&gt;&lt;span class="synConstant"&gt;0000000000000000000000000000000&lt;/span&gt;,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)&#10; CustomProperties &lt;span class="synIdentifier"&gt;Pin &lt;/span&gt;(PinId=B819619E4D1A27419AB524893B6ECD84,PinName=&lt;span class="synConstant"&gt;&amp;quot;return&amp;quot;&lt;/span&gt;,Direction=&lt;span class="synConstant"&gt;&amp;quot;EGPD_Output&amp;quot;&lt;/span&gt;,PinType.PinCategory=&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,PinType.PinSubCategory=&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,PinType.PinSubCategoryObject=&lt;span class="synConstant"&gt;None&lt;/span&gt;,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=&lt;span class="synConstant"&gt;None&lt;/span&gt;,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=&lt;span class="synPreProc"&gt;0&lt;/span&gt;&lt;span class="synConstant"&gt;0000000000000000000000000000000&lt;/span&gt;,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)&#10; CustomProperties &lt;span class="synIdentifier"&gt;Pin &lt;/span&gt;(PinId=9EE1744F4571B813B1BBDE890386E4B4,PinName=&lt;span class="synConstant"&gt;&amp;quot;out_simplex_vtx_pos0&amp;quot;&lt;/span&gt;,Direction=&lt;span class="synConstant"&gt;&amp;quot;EGPD_Output&amp;quot;&lt;/span&gt;,PinType.PinCategory=&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,PinType.PinSubCategory=&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,PinType.PinSubCategoryObject=&lt;span class="synConstant"&gt;None&lt;/span&gt;,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=&lt;span class="synConstant"&gt;None&lt;/span&gt;,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(MaterialGraphNode_111 9D0A05744027353F9E7118A2194B1162,),PersistentGuid=&lt;span class="synPreProc"&gt;0&lt;/span&gt;&lt;span class="synConstant"&gt;0000000000000000000000000000000&lt;/span&gt;,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)&#10; CustomProperties &lt;span class="synIdentifier"&gt;Pin &lt;/span&gt;(PinId=1E152C9B4E3FDD460C71EBBD7728B4F5,PinName=&lt;span class="synConstant"&gt;&amp;quot;out_simplex_vtx_pos1&amp;quot;&lt;/span&gt;,Direction=&lt;span class="synConstant"&gt;&amp;quot;EGPD_Output&amp;quot;&lt;/span&gt;,PinType.PinCategory=&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,PinType.PinSubCategory=&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,PinType.PinSubCategoryObject=&lt;span class="synConstant"&gt;None&lt;/span&gt;,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=&lt;span class="synConstant"&gt;None&lt;/span&gt;,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(MaterialGraphNode_113 &lt;span class="synConstant"&gt;8126F&lt;/span&gt;F97480C0E2317A4F7A582DAD0A3,),PersistentGuid=&lt;span class="synPreProc"&gt;0&lt;/span&gt;&lt;span class="synConstant"&gt;0000000000000000000000000000000&lt;/span&gt;,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)&#10; CustomProperties &lt;span class="synIdentifier"&gt;Pin &lt;/span&gt;(PinId=EDB6385B40CB4F839646B784E3E9D173,PinName=&lt;span class="synConstant"&gt;&amp;quot;out_simplex_vtx_pos2&amp;quot;&lt;/span&gt;,Direction=&lt;span class="synConstant"&gt;&amp;quot;EGPD_Output&amp;quot;&lt;/span&gt;,PinType.PinCategory=&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,PinType.PinSubCategory=&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,PinType.PinSubCategoryObject=&lt;span class="synConstant"&gt;None&lt;/span&gt;,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=&lt;span class="synConstant"&gt;None&lt;/span&gt;,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(MaterialGraphNode_112 164ABAAD466D2377D81D0CA5A60C9B3C,),PersistentGuid=&lt;span class="synPreProc"&gt;0&lt;/span&gt;&lt;span class="synConstant"&gt;0000000000000000000000000000000&lt;/span&gt;,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)&#10; CustomProperties &lt;span class="synIdentifier"&gt;Pin &lt;/span&gt;(PinId=72873D064EE5FD985F001AA3892D9F49,PinName=&lt;span class="synConstant"&gt;&amp;quot;out_simplex_vtx_pos3&amp;quot;&lt;/span&gt;,Direction=&lt;span class="synConstant"&gt;&amp;quot;EGPD_Output&amp;quot;&lt;/span&gt;,PinType.PinCategory=&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,PinType.PinSubCategory=&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,PinType.PinSubCategoryObject=&lt;span class="synConstant"&gt;None&lt;/span&gt;,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=&lt;span class="synConstant"&gt;None&lt;/span&gt;,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(MaterialGraphNode_114 7D8DCA5C4A5DE0ACA7BD0C82724D301A,),PersistentGuid=&lt;span class="synPreProc"&gt;0&lt;/span&gt;&lt;span class="synConstant"&gt;0000000000000000000000000000000&lt;/span&gt;,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)&#10; CustomProperties &lt;span class="synIdentifier"&gt;Pin &lt;/span&gt;(PinId=7746174D4FB60AF7C5C5F095B5CA2773,PinName=&lt;span class="synConstant"&gt;&amp;quot;out_simplex_d0&amp;quot;&lt;/span&gt;,Direction=&lt;span class="synConstant"&gt;&amp;quot;EGPD_Output&amp;quot;&lt;/span&gt;,PinType.PinCategory=&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,PinType.PinSubCategory=&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,PinType.PinSubCategoryObject=&lt;span class="synConstant"&gt;None&lt;/span&gt;,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=&lt;span class="synConstant"&gt;None&lt;/span&gt;,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(MaterialGraphNode_110 DB76CCAB48E57973572CEC889D1AD7A3,),PersistentGuid=&lt;span class="synPreProc"&gt;0&lt;/span&gt;&lt;span class="synConstant"&gt;0000000000000000000000000000000&lt;/span&gt;,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)&#10; CustomProperties &lt;span class="synIdentifier"&gt;Pin &lt;/span&gt;(PinId=00AD30144201B89E1E00758A88479315,PinName=&lt;span class="synConstant"&gt;&amp;quot;out_simplex_d1&amp;quot;&lt;/span&gt;,Direction=&lt;span class="synConstant"&gt;&amp;quot;EGPD_Output&amp;quot;&lt;/span&gt;,PinType.PinCategory=&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,PinType.PinSubCategory=&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,PinType.PinSubCategoryObject=&lt;span class="synConstant"&gt;None&lt;/span&gt;,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=&lt;span class="synConstant"&gt;None&lt;/span&gt;,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(MaterialGraphNode_110 &lt;span class="synConstant"&gt;62F&lt;/span&gt;D7FB84275385A5AE2688318A0242F,),PersistentGuid=&lt;span class="synPreProc"&gt;0&lt;/span&gt;&lt;span class="synConstant"&gt;0000000000000000000000000000000&lt;/span&gt;,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)&#10; CustomProperties &lt;span class="synIdentifier"&gt;Pin &lt;/span&gt;(PinId=A101A4114BE2E007A7A9DE8B88751614,PinName=&lt;span class="synConstant"&gt;&amp;quot;out_simplex_d2&amp;quot;&lt;/span&gt;,Direction=&lt;span class="synConstant"&gt;&amp;quot;EGPD_Output&amp;quot;&lt;/span&gt;,PinType.PinCategory=&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,PinType.PinSubCategory=&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,PinType.PinSubCategoryObject=&lt;span class="synConstant"&gt;None&lt;/span&gt;,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=&lt;span class="synConstant"&gt;None&lt;/span&gt;,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(MaterialGraphNode_110 68133C4D4BE01D7D4C180184CC5A24C8,),PersistentGuid=&lt;span class="synPreProc"&gt;0&lt;/span&gt;&lt;span class="synConstant"&gt;0000000000000000000000000000000&lt;/span&gt;,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)&#10; CustomProperties &lt;span class="synIdentifier"&gt;Pin &lt;/span&gt;(PinId=CF20B6B54351C38C12EB46B59994524D,PinName=&lt;span class="synConstant"&gt;&amp;quot;out_simplex_d3&amp;quot;&lt;/span&gt;,Direction=&lt;span class="synConstant"&gt;&amp;quot;EGPD_Output&amp;quot;&lt;/span&gt;,PinType.PinCategory=&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,PinType.PinSubCategory=&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,PinType.PinSubCategoryObject=&lt;span class="synConstant"&gt;None&lt;/span&gt;,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=&lt;span class="synConstant"&gt;None&lt;/span&gt;,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(MaterialGraphNode_110 1419241C4116FF68392D659CFBE3035C,),PersistentGuid=&lt;span class="synPreProc"&gt;0&lt;/span&gt;&lt;span class="synConstant"&gt;0000000000000000000000000000000&lt;/span&gt;,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)&#10;End Object&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4 id="乱数CustomNode-3D座標から3D乱数出力ができるものに置き換え可能"&gt;乱数CustomNode (3D座標から3D乱数出力ができるものに置き換え可能)&lt;/h4&gt;&#10;&lt;p&gt;&lt;span itemscope itemtype="http://schema.org/Photograph"&gt;&lt;img src="images/090f0c3bf42a233eab6c57b069cad5278d65b33a3b41b6e077285f7b51e60b76.png" width="305" height="160" loading="lazy" title="" class="hatena-fotolife" itemprop="image"&gt;&lt;/span&gt;&lt;/p&gt;</description></item><item><title> TextureSampleGradのCustomNode</title><link>https://nagakagachi.github.io/entry/2021/12/31/193043/</link><pubDate>Fri, 31 Dec 2021 19:30:43 +0900</pubDate><guid>https://nagakagachi.github.io/entry/2021/12/31/193043/</guid><description>&lt;p&gt;UEのマテリアルでTextureからSampleGradでサンプリングするメモ.&lt;/p&gt;&#10;&lt;p&gt;これが2021年最後の記事. 良いお年を!&lt;/p&gt;&#10;&lt;ul class="table-of-contents"&gt;&#10;&lt;li&gt;&lt;a href="#CustomNodeの内容"&gt;CustomNodeの内容&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#CustomNodeコピペ用"&gt;CustomNodeコピペ用&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#利用例"&gt;利用例&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#何に使うの"&gt;何に使うの&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ノードとしてSampleGradが提供されていないようなので、CustomNodeでSampleGrad関数を直接呼ぶこととする.&lt;/p&gt;&#10;&lt;p&gt;(提供されているようならこの記事は見なかったことにしてください.)&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="CustomNodeの内容"&gt;CustomNodeの内容&lt;/h3&gt;&#10;&lt;p&gt;TextureとUV, &lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/ddx"&gt;ddx&lt;/a&gt;, ddy を引数にとって内部で TextureSampleGrad関数を利用する.&lt;/p&gt;&#10;&lt;pre class="code lang-cpp" data-lang="cpp" data-unlink&gt;&lt;span class="synComment"&gt;/*&lt;/span&gt;&#10;&lt;span class="synComment"&gt; Input&lt;/span&gt;&#10;&lt;span class="synComment"&gt; InTexture ( and InTextureSampler)&lt;/span&gt;&#10;&lt;span class="synComment"&gt; InUv&lt;/span&gt;&#10;&lt;span class="synComment"&gt; InDdx&lt;/span&gt;&#10;&lt;span class="synComment"&gt; InDdy&lt;/span&gt;&#10;&lt;span class="synComment"&gt; &lt;/span&gt;&#10;&lt;span class="synComment"&gt; Output&lt;/span&gt;&#10;&lt;span class="synComment"&gt; float4&lt;/span&gt;&#10;&lt;span class="synComment"&gt;*/&lt;/span&gt;&#10;&lt;p&gt;float4 tex = &lt;span class="synIdentifier"&gt;Texture2DSampleGrad&lt;/span&gt;(InTexture, InTextureSampler, InUv, InDdx, InDdy);&#10;&lt;span class="synStatement"&gt;return&lt;/span&gt; tex;&#10;&lt;/pre&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="CustomNodeコピペ用"&gt;CustomNodeコピペ用&lt;/h3&gt;&#10;&lt;p&gt;コピペで利用したい場合は以下のテキストをマテリアルエディタに貼り付ければCustomNodeが生成される.&lt;/p&gt;&#10;&lt;pre class="code lang-cpp" data-lang="cpp" data-unlink&gt;&#10;Begin Object Class=/Script/UnrealEd.MaterialGraphNode Name=&lt;span class="synConstant"&gt;&amp;quot;MaterialGraphNode_21&amp;quot;&lt;/span&gt;&#10; Begin Object Class=/Script/Engine.MaterialExpressionCustom Name=&lt;span class="synConstant"&gt;&amp;quot;MaterialExpressionCustom_2&amp;quot;&lt;/span&gt;&#10; End Object&#10; Begin Object Name=&lt;span class="synConstant"&gt;&amp;quot;MaterialExpressionCustom_2&amp;quot;&lt;/span&gt;&#10; Code=&lt;span class="synConstant"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;/*&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt; Input&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt; InTexture ( and InTextureSampler)&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt; InUv&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt; InDdx&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt; InDdy&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt; &lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt; Output&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt; float4&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;*/&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;float4 tex = Texture2DSampleGrad(InTexture, InTextureSampler, InUv, InDdx, InDdy);&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;return tex;&lt;/span&gt;&lt;span class="synSpecial"&gt;\r\n\r\n&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;&lt;/span&gt;&#10; OutputType=CMOT_Float4&#10; &lt;span class="synIdentifier"&gt;Inputs&lt;/span&gt;(&lt;span class="synConstant"&gt;0&lt;/span&gt;)=(InputName=&lt;span class="synConstant"&gt;&amp;quot;InTexture&amp;quot;&lt;/span&gt;,Input=(Expression=MaterialExpressionTextureObjectParameter'&lt;span class="synConstant"&gt;&amp;quot;MaterialExpressionTextureObjectParameter_1&amp;quot;&lt;/span&gt;'))&#10; &lt;span class="synIdentifier"&gt;Inputs&lt;/span&gt;(&lt;span class="synConstant"&gt;1&lt;/span&gt;)=(InputName=&lt;span class="synConstant"&gt;&amp;quot;InUv&amp;quot;&lt;/span&gt;,Input=(Expression=MaterialExpressionReroute'&lt;span class="synConstant"&gt;&amp;quot;MaterialExpressionReroute_0&amp;quot;&lt;/span&gt;'))&#10; &lt;span class="synIdentifier"&gt;Inputs&lt;/span&gt;(&lt;span class="synConstant"&gt;2&lt;/span&gt;)=(InputName=&lt;span class="synConstant"&gt;&amp;quot;InDdx&amp;quot;&lt;/span&gt;,Input=(Expression=MaterialExpressionDDX'&lt;span class="synConstant"&gt;&amp;quot;MaterialExpressionDDX_0&amp;quot;&lt;/span&gt;'))&#10; &lt;span class="synIdentifier"&gt;Inputs&lt;/span&gt;(&lt;span class="synConstant"&gt;3&lt;/span&gt;)=(InputName=&lt;span class="synConstant"&gt;&amp;quot;InDdy&amp;quot;&lt;/span&gt;,Input=(Expression=MaterialExpressionDDY'&lt;span class="synConstant"&gt;&amp;quot;MaterialExpressionDDY_0&amp;quot;&lt;/span&gt;'))&#10; MaterialExpressionEditorX=-&lt;span class="synConstant"&gt;352&lt;/span&gt;&#10; MaterialExpressionEditorY=&lt;span class="synConstant"&gt;240&lt;/span&gt;&#10; MaterialExpressionGuid=A6C202464ABAD8F6E9734E9B54C6742D&#10; Material=PreviewMaterial'&lt;span class="synConstant"&gt;&amp;quot;/Engine/Transient.M_TexturePreview&amp;quot;&lt;/span&gt;'&#10; End Object&#10; MaterialExpression=MaterialExpressionCustom'&lt;span class="synConstant"&gt;&amp;quot;MaterialExpressionCustom_2&amp;quot;&lt;/span&gt;'&#10; NodePosX=-&lt;span class="synConstant"&gt;352&lt;/span&gt;&#10; NodePosY=&lt;span class="synConstant"&gt;240&lt;/span&gt;&#10; ErrorType=&lt;span class="synConstant"&gt;1&lt;/span&gt;&#10; ErrorMsg=&lt;span class="synConstant"&gt;&amp;quot;Custom material Custom missing input 1 (InTexture)&amp;quot;&lt;/span&gt;&#10; NodeGuid=98660A2E479B2DED7843C29DD7E144AB&#10; CustomProperties &lt;span class="synIdentifier"&gt;Pin &lt;/span&gt;(PinId=&lt;span class="synConstant"&gt;3F&lt;/span&gt;B004F94791B89E090EB9B99B713C0F,PinName=&lt;span class="synConstant"&gt;&amp;quot;InTexture&amp;quot;&lt;/span&gt;,PinType.PinCategory=&lt;span class="synConstant"&gt;&amp;quot;required&amp;quot;&lt;/span&gt;,PinType.PinSubCategory=&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,LinkedTo=(MaterialGraphNode_83 FF18694A45E6BEAA46EA3F8C083A2CBC,),PersistentGuid=&lt;span class="synPreProc"&gt;0&lt;/span&gt;&lt;span class="synConstant"&gt;0000000000000000000000000000000&lt;/span&gt;,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)&#10; CustomProperties &lt;span class="synIdentifier"&gt;Pin &lt;/span&gt;(PinId=3E114E314D9BAB61118B329013A0C05A,PinName=&lt;span class="synConstant"&gt;&amp;quot;InUv&amp;quot;&lt;/span&gt;,PinType.PinCategory=&lt;span class="synConstant"&gt;&amp;quot;required&amp;quot;&lt;/span&gt;,PinType.PinSubCategory=&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,LinkedTo=(MaterialGraphNode_Knot_7 &lt;span class="synConstant"&gt;18F&lt;/span&gt;E939F4A97C00C67CC16A085BED853,),PersistentGuid=&lt;span class="synPreProc"&gt;0&lt;/span&gt;&lt;span class="synConstant"&gt;0000000000000000000000000000000&lt;/span&gt;,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)&#10; CustomProperties &lt;span class="synIdentifier"&gt;Pin &lt;/span&gt;(PinId=B5C056784D5BAD800E83398A08AD56B8,PinName=&lt;span class="synConstant"&gt;&amp;quot;InDdx&amp;quot;&lt;/span&gt;,PinType.PinCategory=&lt;span class="synConstant"&gt;&amp;quot;required&amp;quot;&lt;/span&gt;,PinType.PinSubCategory=&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,LinkedTo=(MaterialGraphNode_85 80EC1CDF4B3A1C9667D72EB37399E8C0,),PersistentGuid=&lt;span class="synPreProc"&gt;0&lt;/span&gt;&lt;span class="synConstant"&gt;0000000000000000000000000000000&lt;/span&gt;,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)&#10; CustomProperties &lt;span class="synIdentifier"&gt;Pin &lt;/span&gt;(PinId=905889CC49E11D9C88DB2792EF254574,PinName=&lt;span class="synConstant"&gt;&amp;quot;InDdy&amp;quot;&lt;/span&gt;,PinType.PinCategory=&lt;span class="synConstant"&gt;&amp;quot;required&amp;quot;&lt;/span&gt;,PinType.PinSubCategory=&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,LinkedTo=(MaterialGraphNode_86 BBAD4B0443CF6057D92E17A5A0BB730A,),PersistentGuid=&lt;span class="synPreProc"&gt;0&lt;/span&gt;&lt;span class="synConstant"&gt;0000000000000000000000000000000&lt;/span&gt;,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)&#10; CustomProperties &lt;span class="synIdentifier"&gt;Pin &lt;/span&gt;(PinId=8EFEA7514110CC30D32E41B0B1689991,PinName=&lt;span class="synConstant"&gt;&amp;quot;Output&amp;quot;&lt;/span&gt;,PinFriendlyName=&lt;span class="synIdentifier"&gt;NSLOCTEXT&lt;/span&gt;(&lt;span class="synConstant"&gt;&amp;quot;MaterialGraphNode&amp;quot;&lt;/span&gt;, &lt;span class="synConstant"&gt;&amp;quot;Space&amp;quot;&lt;/span&gt;, &lt;span class="synConstant"&gt;&amp;quot; &amp;quot;&lt;/span&gt;),Direction=&lt;span class="synConstant"&gt;&amp;quot;EGPD_Output&amp;quot;&lt;/span&gt;,PinType.PinCategory=&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,PinType.PinSubCategory=&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,LinkedTo=(MaterialGraphNode_Root_0 1653EE4D4D08EED8A95A3CA74981CFA2,),PersistentGuid=&lt;span class="synPreProc"&gt;0&lt;/span&gt;&lt;span class="synConstant"&gt;0000000000000000000000000000000&lt;/span&gt;,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)&#10;End Object&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="利用例"&gt;利用例&lt;/h3&gt;&#10;&lt;p&gt;TextureObjectとUV, &lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/ddx"&gt;ddx&lt;/a&gt;, ddy をCustomNodeに入力する.&lt;/p&gt;&#10;&lt;figure class="figure-image figure-image-fotolife" title="当記事のCustomNodeの利用例"&gt;&lt;span itemscope itemtype="http://schema.org/Photograph"&gt;&lt;img src="images/2e3423d49d6483a9c5d2b66d4970c02ffe9d900ccf2d17fd49f8834aaa349200.png" alt="f:id:nagakagachi:20211231190816p:plain" width="1181" height="819" loading="lazy" title="" class="hatena-fotolife" itemprop="image"&gt;&lt;/span&gt;&lt;figcaption&gt;当記事のCustomNodeの利用例&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;</description></item><item><title>縮小バッファによる半透明パーティクル描画についてのメモ</title><link>https://nagakagachi.github.io/entry/2021/12/12/193138/</link><pubDate>Sun, 12 Dec 2021 19:31:38 +0900</pubDate><guid>https://nagakagachi.github.io/entry/2021/12/12/193138/</guid><description>&lt;p&gt;縮小バッファに描いたものを合成するというフローについて.&lt;/p&gt;&#10;&lt;ul class="table-of-contents"&gt;&#10;&lt;li&gt;&lt;a href="#別バッファ半透明描画と直接描画の結果一致の確認"&gt;別バッファ半透明描画と直接描画の結果一致の確認&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#Lost-Planet"&gt;Lost Planet&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#METAL-GEAR-SOLID-4"&gt;METAL GEAR SOLID 4&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#Tales-of-ARISE"&gt;Tales of ARISE&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="別バッファ半透明描画と直接描画の結果一致の確認"&gt;別バッファ半透明描画と直接描画の結果一致の確認&lt;/h3&gt;&#10;&lt;p&gt;&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/METAL%20GEAR%20SOLID%204"&gt;METAL GEAR SOLID 4&lt;/a&gt;の記事などで紹介されている方法の確認をあらためて&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;半透明用バッファを(0,0,0,1)でクリア&lt;/li&gt;&#10;&lt;li&gt;半透明描画&#10;&lt;ul&gt;&#10;&lt;li&gt;アルファブレンドの場合&#10;&lt;ul&gt;&#10;&lt;li&gt;RGB : Dst*(1-SrcAlpha) + Src*SrcAlpha&lt;/li&gt;&#10;&lt;li&gt;Alpha: DstAlpha * (1 - SrcAlpha)&lt;/li&gt;&#10;&lt;/ul&gt;&lt;/li&gt;&#10;&lt;li&gt;加算ブレンドの場合&#10;&lt;ul&gt;&#10;&lt;li&gt;RGB : Dst + Src*SrcAlpha&lt;/li&gt;&#10;&lt;li&gt;Alpha: DstAlpha&lt;/li&gt;&#10;&lt;/ul&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&lt;/li&gt;&#10;&lt;li&gt;半透明バッファを最終合成&#10;&lt;ul&gt;&#10;&lt;li&gt;RGB : Dst * SrcAlpha + Src&lt;/li&gt;&#10;&lt;/ul&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;3回の半透明描画の例で計算確認&lt;/p&gt;&#10;&lt;p&gt;c[i]はアルファ乗算済みRGB&lt;/p&gt;&#10;&lt;p&gt;a[i]は対応する出力アルファ値{ 半透明アルファ値 : アルファブレンド, 0.0 : 加算合成 }&lt;/p&gt;&#10;&lt;p&gt;としてアルファブレンドと加算合成が任意に混在するものとする&lt;/p&gt;&#10;&lt;pre class="code lang-cpp" data-lang="cpp" data-unlink&gt;&lt;span class="synComment"&gt;// c0に直接3回の合成(c1, c2, c3 の順)&lt;/span&gt;&#10;cd=c3+(c2+(c1+&lt;span class="synIdentifier"&gt;c0&lt;/span&gt;(&lt;span class="synConstant"&gt;1&lt;/span&gt;-a1))(&lt;span class="synConstant"&gt;1&lt;/span&gt;-a2))(&lt;span class="synConstant"&gt;1&lt;/span&gt;-a3)&#10;ad=(&lt;span class="synConstant"&gt;1&lt;/span&gt;-a0)(&lt;span class="synConstant"&gt;1&lt;/span&gt;-a1)(&lt;span class="synConstant"&gt;1&lt;/span&gt;-a2)(&lt;span class="synConstant"&gt;1&lt;/span&gt;-a3)&#10;&#10;&#10;&lt;span class="synComment"&gt;// ---------------------------------------------&lt;/span&gt;&#10;&#10;&lt;span class="synComment"&gt;// cs_, as_へ3回の半透明を合成してから最後にc0と合成&lt;/span&gt;&#10;&lt;span class="synComment"&gt;// 疑似コードの通り初期値として c0=0, a0=1 とすると c1,c2,c3 の合成は&lt;/span&gt;&#10;c_temp=c3+(c2+&lt;span class="synIdentifier"&gt;c1&lt;/span&gt;(&lt;span class="synConstant"&gt;1&lt;/span&gt;-a2))(&lt;span class="synConstant"&gt;1&lt;/span&gt;-a3)&#10;a_temp=(&lt;span class="synConstant"&gt;1&lt;/span&gt;-a1)(&lt;span class="synConstant"&gt;1&lt;/span&gt;-a2)(&lt;span class="synConstant"&gt;1&lt;/span&gt;-a3)&#10;&#10;&lt;span class="synComment"&gt;// c_tempをc0へ合成&lt;/span&gt;&#10;cd=c0*a_temp+c_temp&#10;=&lt;span class="synIdentifier"&gt;c0&lt;/span&gt;(&lt;span class="synConstant"&gt;1&lt;/span&gt;-a1)(&lt;span class="synConstant"&gt;1&lt;/span&gt;-a2)(&lt;span class="synConstant"&gt;1&lt;/span&gt;-a3)+( c3+(c2+&lt;span class="synIdentifier"&gt;c1&lt;/span&gt;(&lt;span class="synConstant"&gt;1&lt;/span&gt;-a2))(&lt;span class="synConstant"&gt;1&lt;/span&gt;-a3) )&#10;=c3+(c2+(c1+&lt;span class="synIdentifier"&gt;c0&lt;/span&gt;(&lt;span class="synConstant"&gt;1&lt;/span&gt;-a1))(&lt;span class="synConstant"&gt;1&lt;/span&gt;-a2))(&lt;span class="synConstant"&gt;1&lt;/span&gt;-a3)&#10;&lt;/pre&gt;&#10;&lt;p&gt;c0直接合成とc_tmpを介した合成で式が一致した&lt;/p&gt;&#10;&lt;p&gt;アルファブレンドと加算合成が任意の数と順序で混在していても, 別バッファ半透明の結果は直接描画半透明と一致する(ﾟ∀ﾟ)&lt;/p&gt;&#10;&lt;p&gt;(だいぶ前の記事を整理)&lt;blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"&gt;&lt;p lang="ja" dir="ltr"&gt;cs=c3+(c2+(c1+c0(1-a1))(1-a2))(1-a3)&lt;br&gt;as=(1-a0)(1-a1)(1-a2)(1-a3)&lt;br&gt;&lt;br&gt;c0=0, a0=1とすると&lt;br&gt;cs_=c3+(c2+c1(1-a2))(1-a3)&lt;br&gt;as_=(1-a1)(1-a2)(1-a3)&lt;br&gt;&lt;br&gt;cdへの合成&lt;br&gt;c=cd*as_+cs_&lt;br&gt;=cd(1-a1)(1-a2)(1-a3)+( c3+(c2+c1(1-a2))(1-a3) )&lt;br&gt;=c3+(c2+(c1+cd(1-a1))(1-a2))(1-a3)&lt;br&gt;&lt;br&gt;で最初の式でc0=cdとした場合と一致&lt;/p&gt;&amp;mdash; なが (@nagakagachi) &lt;a href="https://twitter.com/nagakagachi/status/1468969836424609795?ref_src=twsrc%5Etfw"&gt;2021年12月9日&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt; &lt;br /&gt;&#10;&lt;br /&gt;&#10;&lt;br /&gt;&#10;&lt;/p&gt;&#10;&lt;/div&gt;</description></item><item><title>ProjectRoot直下のShadersディレクトリをShaderIncludePathに追加するだけのPlugin [UE4]</title><link>https://nagakagachi.github.io/entry/2021/08/18/083000/</link><pubDate>Wed, 18 Aug 2021 08:30:00 +0900</pubDate><guid>https://nagakagachi.github.io/entry/2021/08/18/083000/</guid><description>&lt;ul class="table-of-contents"&gt;&#10;&lt;li&gt;&lt;a href="#これはなに"&gt;これはなに&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#置き場所"&gt;置き場所&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#使い方"&gt;使い方&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#エラーメッセージ"&gt;エラーメッセージ&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#参考資料"&gt;参考資料&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="これはなに"&gt;これはなに&lt;/h3&gt;&#10;&lt;p&gt;プロジェクトルート/Shaders をUEのShaderIncludePathに自動追加する&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3"&gt;プラグイン&lt;/a&gt;.&lt;br /&gt;&#10;&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/UE4"&gt;UE4&lt;/a&gt;.25辺りからマテリアルのCustomノードで Include File Paths を指定して外部シェーダファイルをインクルードして利用できるようになったが,インクルードパスの設定が面倒だったので勉強ついでに自分用自動化&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3"&gt;プラグイン&lt;/a&gt;を作成した.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="置き場所"&gt;置き場所&lt;/h3&gt;&#10;&lt;p&gt;&lt;iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fnagakagachi%2Fue4%2Ftree%2Fmaster%2FPlugin%2FNglShaderIncludePlugin" title="ue4/Plugin/NglShaderIncludePlugin at master · nagakagachi/ue4" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"&gt;&lt;/iframe&gt;&lt;cite class="hatena-citation"&gt;&lt;a href="https://github.com/nagakagachi/ue4/tree/master/Plugin/NglShaderIncludePlugin"&gt;github.com&lt;/a&gt;&lt;/cite&gt;&lt;br /&gt;&#10;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="使い方"&gt;使い方&lt;/h3&gt;&#10;&lt;p&gt;1. &lt;b&gt;zipを解凍してできたNglShaderIncludePluginを ProjectRoot/Plugins にコピー.&lt;/b&gt;&lt;br /&gt;&#10;2. &lt;b&gt;ProjectRoot/Shaders &lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8"&gt;ディレクト&lt;/a&gt;リにCustomノードで使いたい ush を配置.&lt;/b&gt;&lt;/p&gt;&#10;&lt;pre class="code c++" data-lang="c++" data-unlink&gt;// テストで用意した IncludeTest.ush というファイル&#10;#pragma once&#10;float3 Func00()&#10;{&#10; return float3(1.0, 0.0, 0.0);&#10;}&lt;/pre&gt;&lt;p&gt;3. &lt;b&gt;マテリアルのCustomノードの Include File Paths に "/Project/filename.ush" を入力.&lt;/b&gt;&lt;/p&gt;&#10;&lt;figure class="figure-image figure-image-fotolife" title="Customノード例"&gt;&lt;span itemscope itemtype="http://schema.org/Photograph"&gt;&lt;img src="images/6f671447c4dd4e8b946a6de2ed046a4bd43542906b659231433e4b9ef528501e.png" alt="f:id:nagakagachi:20210818012316p:plain" width="1039" height="876" loading="lazy" title="" class="hatena-fotolife" itemprop="image"&gt;&lt;/span&gt;&lt;figcaption&gt;Customノード例&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;4. &lt;b&gt;Customノードでインクルードしたushの関数などが利用できるようになる. &lt;/b&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="エラーメッセージ"&gt;エラーメッセージ&lt;/h3&gt;&#10;&lt;p&gt;UEプロジェクト起動時に Shaders &lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8"&gt;ディレクト&lt;/a&gt;リが存在しないと以下のような警告がログに出力されるので&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8"&gt;ディレクト&lt;/a&gt;リを作成するように.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;LogTemp: Warning: [FNglShaderIncludePluginModule] directory [ProjectRoot/Shaders] does not exist.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;&lt;span itemscope itemtype="http://schema.org/Photograph"&gt;&lt;img src="images/39be8a695b54791eb55ea1e611245b63bc991cc35fac0710945f927fd9ece0dc.png" alt="f:id:nagakagachi:20210818003947p:plain" width="1080" height="429" loading="lazy" title="" class="hatena-fotolife" itemprop="image"&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;</description></item><item><title>行優先と列優先のはなし(row-major, column-major)</title><link>https://nagakagachi.github.io/entry/2021/07/02/213944/</link><pubDate>Fri, 02 Jul 2021 21:39:44 +0900</pubDate><guid>https://nagakagachi.github.io/entry/2021/07/02/213944/</guid><description>&lt;p&gt;今ひとつ完全理解に至っていなかったので自分の言葉で残しておく&lt;br /&gt;&#10;間違ってたら&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/%CD%C5%C0%BA%A4%B5%A4%F3"&gt;妖精さん&lt;/a&gt;が直してくれる&lt;/p&gt;&lt;p&gt;(WEB上にたくさんある有用な記事を読んでわかる方は当記事をこれ以上読む必要は無い)&lt;br /&gt;&#10;&lt;a href="https://docs.microsoft.com/ja-jp/windows/win32/direct3dhlsl/dx-graphics-hlsl-per-component-math"&gt;Per-Component &amp;#x7B97;&amp;#x8853;&amp;#x6F14;&amp;#x7B97; - Win32 apps | Microsoft Learn&lt;/a&gt;&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="行列の要素と演算"&gt;行列の要素と演算&lt;/h3&gt;&#10;&lt;p&gt;行列の行と列の意味や行列要素の位置はrow-majorでもcolumn-majorでも変わることはない&lt;/p&gt;&#10;&lt;p&gt;行とは行列の横方向のラインであるし、列は縦方向のラインである&lt;/p&gt;&#10;&lt;p&gt;mat._11は1行目1列目の要素であり、mat._42は4行目2列目の要素である&lt;/p&gt;&#10;&lt;p&gt;行列とベクトルの乗算のルールもrow-majorでもcolumn-majorで変わることはない&lt;/p&gt;&#10;&lt;p&gt;(ただしHLSL等ではベクトルは演算の位置によって適宜列ベクトルや行ベクトルに読み替えられる)&lt;/p&gt;&#10;&lt;pre class="code c++" data-lang="c++" data-unlink&gt;V1 = M * V0; // Matrix4x4とVec4&lt;/pre&gt;&#10;&lt;p&gt;は&lt;/p&gt;&#10;&lt;pre class="code c++" data-lang="c++" data-unlink&gt;V1.x = M._11 * V0.x + M._12 * V0.y + M._13 * V0.y + M._14 * V0.w&#10;V1.y = M._21 * V0.x + M._22 * V0.y + M._23 * V0.y + M._24 * V0.w&#10;V1.z = M._31 * V0.x + M._32 * V0.y + M._33 * V0.y + M._34 * V0.w&#10;V1.w = M._41 * V0.x + M._42 * V0.y + M._43 * V0.y + M._44 * V0.w&lt;/pre&gt;&#10;&lt;p&gt;であり、&lt;/p&gt;&#10;&lt;pre class="code c++" data-lang="c++" data-unlink&gt;V1 = V0 * M; // Matrix4x4とVec4&lt;/pre&gt;&#10;&lt;p&gt;は&lt;/p&gt;&#10;&lt;pre class="code c++" data-lang="c++" data-unlink&gt;V1.x = M._11 * V0.x + M._21 * V0.y + M._31 * V0.y + M._41 * V0.w&#10;V1.y = M._12 * V0.x + M._22 * V0.y + M._32 * V0.y + M._42 * V0.w&#10;V1.z = M._13 * V0.x + M._23 * V0.y + M._33 * V0.y + M._43 * V0.w&#10;V1.w = M._14 * V0.x + M._24 * V0.y + M._34 * V0.y + M._44 * V0.w&lt;/pre&gt;&#10;&lt;p&gt;である&lt;/p&gt;&#10;&lt;/div&gt;</description></item></channel></rss>