yum-slop/modular_slang
write individual HLSL modules/libraries in slang
git clone https://git.yummers.dev/yum-slop/modular_slang
e11e40d
master
1#ifndef __EXAMPLE_INC 2#define __EXAMPLE_INC 3 4float3x3 inverse(float3x3 m) { 5 float det = 6 m._11 * (m._22 * m._33 - m._23 * m._32) - 7 m._12 * (m._21 * m._33 - m._23 * m._31) + 8 m._13 * (m._21 * m._32 - m._22 * m._31); 9 10 if (abs(det) < 1e-6) { 11 return float3x3( 12 1,0,0, 13 0,1,0, 14 0,0,1); 15 } 16 17 float invDet = 1.0f / det; 18 float3x3 inv; 19 20 inv._11 = (m._22 * m._33 - m._23 * m._32) * invDet; 21 inv._12 = (m._13 * m._32 - m._12 * m._33) * invDet; 22 inv._13 = (m._12 * m._23 - m._13 * m._22) * invDet; 23 inv._21 = (m._23 * m._31 - m._21 * m._33) * invDet; 24 inv._22 = (m._11 * m._33 - m._13 * m._31) * invDet; 25 inv._23 = (m._13 * m._21 - m._11 * m._23) * invDet; 26 inv._31 = (m._21 * m._32 - m._22 * m._31) * invDet; 27 inv._32 = (m._31 * m._12 - m._11 * m._32) * invDet; 28 inv._33 = (m._11 * m._22 - m._12 * m._21) * invDet; 29 30 return inv; 31} 32 33#define PI 3.14159265f 34 35[Differentiable] 36public float3 ex_deform(float3 xyz, no_diff float A, no_diff float k, no_diff float t) { 37 float x = xyz.x; 38 float y = xyz.y; 39 float z = xyz.z; 40 return float3( 41 x + sin(y * k) * 0.1, 42 y + sin(x * k * 4) * 0.5, 43 (z + sin(x * y * k * PI + t) * A) * (1.0 + sin(y * k) * sin(x * k)) 44 ); 45} 46 47// Deform a normal vector using the inverse transpose of the jacobian. 48public void ex_deform_normal(float3 xyz, inout float3 normal, inout float3 tangent, float A, float k, float t) { 49 // Compute jacobian using autodiff applied to basis vectors. 50 DifferentialPair<float3> dp_x = diffPair(xyz, float3(1, 0, 0)); 51 DifferentialPair<float3> dp_y = diffPair(xyz, float3(0, 1, 0)); 52 DifferentialPair<float3> dp_z = diffPair(xyz, float3(0, 0, 1)); 53 54 DifferentialPair<float3> dp_x_out = fwd_diff(ex_deform)(dp_x, A, k, t); 55 DifferentialPair<float3> dp_y_out = fwd_diff(ex_deform)(dp_y, A, k, t); 56 DifferentialPair<float3> dp_z_out = fwd_diff(ex_deform)(dp_z, A, k, t); 57 58 // Transform normal and tangent using jacobian 59 float3x3 jacobian = float3x3( 60 float3(dp_x_out.d.x, dp_y_out.d.x, dp_z_out.d.x), 61 float3(dp_x_out.d.y, dp_y_out.d.y, dp_z_out.d.y), 62 float3(dp_x_out.d.z, dp_y_out.d.z, dp_z_out.d.z) 63 ); 64 float3x3 itjac = inverse(transpose(jacobian)); 65 normal = normalize(mul(itjac, normal)); 66 tangent = normalize(mul(jacobian, tangent)); 67} 68 69#endif // __EXAMPLE_INC 70