Nao_uの日記 このページをアンテナに追加 RSSフィード

2019-10-30

Octahedral Impostors Octahedral Impostors - Nao_uの日記 を含むブックマーク はてなブックマーク - Octahedral Impostors - Nao_uの日記 Octahedral Impostors - Nao_uの日記 のブックマークコメント

//float3 UVtoOctahedron(float2 uv) 
vector2 uv;
uv.x = @P.x;
uv.y = @P.y;
{
    // Unpack the 0...1 range to the -1...1 unit square.
    vector position = set( (uv.x - 0.5f)*2.0, (uv.y - 0.5f)*2.0,0);                

    // "Lift" the middle of the square to +1 z, and let it fall off linearly
    // to z = 0 along the Manhattan metric diamond (absolute.x + absolute.y == 1),
    // and to z = -1 at the corners where position.x and .y are both = +-1.
    vector2 absolute;
    absolute.x = abs(position.x);
    absolute.y = abs(position.y);
    
    position.z = 1.0f - absolute.x - absolute.y;

    // "Tuck in" the corners by reflecting the xy position along the line y = 1 - x
    // (in quadrant 1), and its mirrored image in the other quadrants.
    if(position.z < 0) {
        vector2 f2 = set(1.0f - absolute.y, 1.0f - absolute.x);
        position.x = sign(position.x) * f2.x;
        position.y = sign(position.y) * f2.y;
    }

    @P.x = position.x;
    @P.y = position.y;
    @P.z = position.z;
    v@absolute = absolute;
}
float2 VectortoOctahedron( float3 N )
{
	N /= dot( 1.0, abs(N) );
	if( N.z <= 0 )
	{
		N.xy = ( 1 - abs(N.yx) ) * ( N.xy >= 0 ? 1.0 : -1.0 );
	}
	return N.xy;
}

float2 VectortoHemiOctahedron( float3 N )
{
	N.xy /= dot( 1.0, abs(N) );
	return float2( N.x + N.y, N.x - N.y );
}

float3 OctahedronToVector( float2 Oct )
{
	float3 N = float3( Oct, 1.0 - dot( 1.0, abs(Oct) ) );
	if( N.z < 0 )
	{
		N.xy = ( 1 - abs(N.yx) ) * ( N.xy >= 0 ? 1.0 : -1.0 );
	}
	return normalize(N);
}

float3 HemiOctahedronToVector( float2 Oct )
{
	Oct = float2( Oct.x + Oct.y, Oct.x - Oct.y ) *0.5;
	float3 N = float3( Oct, 1 - dot( 1.0, abs(Oct) ) );
	return normalize(N);
}

inline void OctaImpostorVertex( inout float4 vertex, inout float3 normal, inout float4 uvsFrame1, inout float4 uvsFrame2, inout float4 uvsFrame3, inout float4 octaFrame, inout float4 viewPos )
{
	// Inputs
	float2 uvOffset = _AI_SizeOffset.zw;
	float parallax = -_Parallax; // check sign later
	float UVscale = _ImpostorSize;
	float framesXY = _Frames;
	float prevFrame = framesXY - 1;
	float3 fractions = 1.0 / float3( framesXY, prevFrame, UVscale );
	float fractionsFrame = fractions.x;
	float fractionsPrevFrame = fractions.y;
	float fractionsUVscale = fractions.z;

	// Basic data
	float3 worldOrigin = 0;
	float4 perspective = float4( 0, 0, 0, 1 );
	// if there is no perspective we offset world origin with a 5000 view dir vector, otherwise we use the original world position
	if( UNITY_MATRIX_P[ 3 ][ 3 ] == 1 ) 
	{
		perspective = float4( 0, 0, 5000, 0 );
		worldOrigin = ai_ObjectToWorld._m03_m13_m23;
	}
	float3 worldCameraPos = worldOrigin + mul( UNITY_MATRIX_I_V, perspective ).xyz;

	float3 objectCameraPosition = mul( ai_WorldToObject, float4( worldCameraPos, 1 ) ).xyz - _Offset.xyz; //ray origin
	float3 objectCameraDirection = normalize( objectCameraPosition );

	// Create orthogonal vectors to define the billboard
	float3 upVector = float3( 0,1,0 );
	float3 objectHorizontalVector = normalize( cross( objectCameraDirection, upVector ) );
	float3 objectVerticalVector = cross( objectHorizontalVector, objectCameraDirection );

	// Billboard
	float2 uvExpansion = vertex.xy;
	float3 billboard = objectHorizontalVector * uvExpansion.x + objectVerticalVector * uvExpansion.y;

	float3 localDir = billboard - objectCameraPosition; // ray direction

	// Octahedron Frame
	#ifdef _HEMI_ON
		objectCameraDirection.y = max(0.001, objectCameraDirection.y);
		float2 frameOcta = VectortoHemiOctahedron( objectCameraDirection.xzy ) * 0.5 + 0.5;
	#else
		float2 frameOcta = VectortoOctahedron( objectCameraDirection.xzy ) * 0.5 + 0.5;
	#endif

	// Setup for octahedron
	float2 prevOctaFrame = frameOcta * prevFrame;
	float2 baseOctaFrame = floor( prevOctaFrame );
	float2 fractionOctaFrame = ( baseOctaFrame * fractionsFrame );

	// Octa 1
	float2 octaFrame1 = ( baseOctaFrame * fractionsPrevFrame ) * 2.0 - 1.0;
	#ifdef _HEMI_ON
		float3 octa1WorldY = HemiOctahedronToVector( octaFrame1 ).xzy;
	#else
		float3 octa1WorldY = OctahedronToVector( octaFrame1 ).xzy;
	#endif

	float3 octa1LocalY;
	float2 uvFrame1;
	RayPlaneIntersectionUV( octa1WorldY, objectCameraPosition, localDir, /*inout*/ uvFrame1, /*inout*/ octa1LocalY );

	float2 uvParallax1 = octa1LocalY.xy * fractionsFrame * parallax;
	uvFrame1 = ( uvFrame1 * fractionsUVscale + 0.5 ) * fractionsFrame + fractionOctaFrame;
	uvsFrame1 = float4( uvParallax1, uvFrame1) - float4( 0, 0, uvOffset );

	// Octa 2
	float2 fractPrevOctaFrame = frac( prevOctaFrame );
	float2 cornerDifference = lerp( float2( 0,1 ) , float2( 1,0 ) , saturate( ceil( ( fractPrevOctaFrame.x - fractPrevOctaFrame.y ) ) ));
	float2 octaFrame2 = ( ( baseOctaFrame + cornerDifference ) * fractionsPrevFrame ) * 2.0 - 1.0;
	#ifdef _HEMI_ON
		float3 octa2WorldY = HemiOctahedronToVector( octaFrame2 ).xzy;
	#else
		float3 octa2WorldY = OctahedronToVector( octaFrame2 ).xzy;
	#endif

	float3 octa2LocalY;
	float2 uvFrame2;
	RayPlaneIntersectionUV( octa2WorldY, objectCameraPosition, localDir, /*inout*/ uvFrame2, /*inout*/ octa2LocalY );

	float2 uvParallax2 = octa2LocalY.xy * fractionsFrame * parallax;
	uvFrame2 = ( uvFrame2 * fractionsUVscale + 0.5 ) * fractionsFrame + ( ( cornerDifference * fractionsFrame ) + fractionOctaFrame );
	uvsFrame2 = float4( uvParallax2, uvFrame2) - float4( 0, 0, uvOffset );

	// Octa 3
	float2 octaFrame3 = ( ( baseOctaFrame + 1 ) * fractionsPrevFrame  ) * 2.0 - 1.0;
	#ifdef _HEMI_ON
		float3 octa3WorldY = HemiOctahedronToVector( octaFrame3 ).xzy;
	#else
		float3 octa3WorldY = OctahedronToVector( octaFrame3 ).xzy;
	#endif

	float3 octa3LocalY;
	float2 uvFrame3;
	RayPlaneIntersectionUV( octa3WorldY, objectCameraPosition, localDir, /*inout*/ uvFrame3, /*inout*/ octa3LocalY );

	float2 uvParallax3 = octa3LocalY.xy * fractionsFrame * parallax;
	uvFrame3 = ( uvFrame3 * fractionsUVscale + 0.5 ) * fractionsFrame + ( fractionOctaFrame + fractionsFrame );
	uvsFrame3 = float4( uvParallax3, uvFrame3) - float4( 0, 0, uvOffset );

	// maybe remove this?
	octaFrame = 0;
	octaFrame.xy = prevOctaFrame;
	#if AI_CLIP_NEIGHBOURS_FRAMES
		octaFrame.zw = fractionOctaFrame;
	#endif

	vertex.xyz = billboard + _Offset.xyz;
	normal.xyz = objectCameraDirection;

	// view pos
	viewPos = 0;
	#ifdef AI_RENDERPIPELINE
		viewPos.xyz = TransformWorldToView( TransformObjectToWorld( vertex.xyz ) );
	#else
		viewPos.xyz = UnityObjectToViewPos( vertex.xyz );
	#endif

	#ifdef EFFECT_HUE_VARIATION
		float hueVariationAmount = frac( ai_ObjectToWorld[0].w + ai_ObjectToWorld[1].w + ai_ObjectToWorld[2].w);
		viewPos.w = saturate(hueVariationAmount * _HueVariation.a);
	#endif
}

inline void OctaImpostorFragment( inout SurfaceOutputStandardSpecular o, out float4 clipPos, out float3 worldPos, float4 uvsFrame1, float4 uvsFrame2, float4 uvsFrame3, float4 octaFrame, float4 interpViewPos )
{
	float depthBias = -1.0;
	float textureBias = _TextureBias;

	// Octa1
	float4 parallaxSample1 = tex2Dbias( _Normals, float4( uvsFrame1.zw, 0, depthBias) );
	float2 parallax1 = ( ( 0.5 - parallaxSample1.a ) * uvsFrame1.xy ) + uvsFrame1.zw;
	float4 albedo1 = tex2Dbias( _Albedo, float4( parallax1, 0, textureBias) );
	float4 normals1 = tex2Dbias( _Normals, float4( parallax1, 0, textureBias) );
	float4 mask1 = tex2Dbias( _Emission, float4( parallax1, 0, textureBias) );
	float4 spec1 = tex2Dbias( _Specular, float4( parallax1, 0, textureBias) );

	// Octa2
	float4 parallaxSample2 = tex2Dbias( _Normals, float4( uvsFrame2.zw, 0, depthBias) );
	float2 parallax2 = ( ( 0.5 - parallaxSample2.a ) * uvsFrame2.xy ) + uvsFrame2.zw;
	float4 albedo2 = tex2Dbias( _Albedo, float4( parallax2, 0, textureBias) );
	float4 normals2 = tex2Dbias( _Normals, float4( parallax2, 0, textureBias) );
	float4 mask2 = tex2Dbias( _Emission, float4( parallax2, 0, textureBias) );
	float4 spec2 = tex2Dbias( _Specular, float4( parallax2, 0, textureBias) );

	// Octa3
	float4 parallaxSample3 = tex2Dbias( _Normals, float4( uvsFrame3.zw, 0, depthBias) );
	float2 parallax3 = ( ( 0.5 - parallaxSample3.a ) * uvsFrame3.xy ) + uvsFrame3.zw;
	float4 albedo3 = tex2Dbias( _Albedo, float4( parallax3, 0, textureBias) );
	float4 normals3 = tex2Dbias( _Normals, float4( parallax3, 0, textureBias) );
	float4 mask3 = tex2Dbias( _Emission, float4( parallax3, 0, textureBias) );
	float4 spec3 = tex2Dbias( _Specular, float4( parallax3, 0, textureBias) );

	// Weights
	float2 fraction = frac( octaFrame.xy );
	float2 invFraction = 1 - fraction;
	float3 weights;
	weights.x = min( invFraction.x, invFraction.y );
	weights.y = abs( fraction.x - fraction.y );
	weights.z = min( fraction.x, fraction.y );

	// Blends
	float4 blendedAlbedo = albedo1 * weights.x + albedo2 * weights.y + albedo3 * weights.z;
	float4 blendedNormal = normals1 * weights.x  + normals2 * weights.y + normals3 * weights.z;
	float4 blendedMask = mask1 * weights.x  + mask2 * weights.y + mask3 * weights.z;
	float4 blendedSpec = spec1 * weights.x  + spec2 * weights.y + spec3 * weights.z;

	float3 localNormal = blendedNormal.rgb * 2.0 - 1.0;
	float3 worldNormal = normalize( mul( (float3x3)ai_ObjectToWorld, localNormal ) );

	float3 viewPos = interpViewPos.xyz;
	float depthOffset = ( ( parallaxSample1.a * weights.x + parallaxSample2.a * weights.y + parallaxSample3.a * weights.z ) - 0.5 /** 2.0 - 1.0*/ ) /** 0.5*/ * _DepthSize * length( ai_ObjectToWorld[ 2 ].xyz );
	
	#if !defined(AI_RENDERPIPELINE) // no SRP
		#if defined(SHADOWS_DEPTH)
			if( unity_LightShadowBias.y == 1.0 ) // get only the shadowcaster, this is a hack
			{
				viewPos.z += depthOffset * _AI_ShadowView;
				viewPos.z += -_AI_ShadowBias;
			}
			else // else add offset normally
			{
				viewPos.z += depthOffset;
			}
		#else // else add offset normally
			viewPos.z += depthOffset;
		#endif
	#elif defined(AI_RENDERPIPELINE) // SRP
		#if ( defined(SHADERPASS) && (SHADERPASS == SHADERPASS_SHADOWS) ) || defined(UNITY_PASS_SHADOWCASTER)
			viewPos.z += depthOffset * _AI_ShadowView;
			viewPos.z += -_AI_ShadowBias;
		#else // else add offset normally
			viewPos.z += depthOffset;
		#endif
	#endif

	worldPos = mul( UNITY_MATRIX_I_V, float4( viewPos.xyz, 1 ) ).xyz;
	clipPos = mul( UNITY_MATRIX_P, float4( viewPos, 1 ) );
	
	#if !defined(AI_RENDERPIPELINE) // no SRP
		#if defined(SHADOWS_DEPTH)
			clipPos = UnityApplyLinearShadowBias( clipPos );
		#endif
	#elif defined(AI_RENDERPIPELINE) // SRP
		#if defined(UNITY_PASS_SHADOWCASTER) && !defined(SHADERPASS)
			#if UNITY_REVERSED_Z
				clipPos.z = min( clipPos.z, clipPos.w * UNITY_NEAR_CLIP_VALUE );
			#else
				clipPos.z = max( clipPos.z, clipPos.w * UNITY_NEAR_CLIP_VALUE );
			#endif
		#endif
	#endif
	
	clipPos.xyz /= clipPos.w;
	
	if( UNITY_NEAR_CLIP_VALUE < 0 )
		clipPos = clipPos * 0.5 + 0.5;

	#ifdef EFFECT_HUE_VARIATION
		half3 shiftedColor = lerp(blendedAlbedo.rgb, _HueVariation.rgb, interpViewPos.w);
		half maxBase = max(blendedAlbedo.r, max(blendedAlbedo.g, blendedAlbedo.b));
		half newMaxBase = max(shiftedColor.r, max(shiftedColor.g, shiftedColor.b));
		maxBase /= newMaxBase;
		maxBase = maxBase * 0.5f + 0.5f;
		shiftedColor.rgb *= maxBase;
		blendedAlbedo.rgb = saturate(shiftedColor);
	#endif
	
	#if AI_CLIP_NEIGHBOURS_FRAMES
		float t = ceil( fraction.x - fraction.y );
		float4 cornerDifference = float4( t, 1 - t, 1, 1 );

		float2 step_1 = ( parallax1 - octaFrame.zw ) * _Frames;
		float4 step23 = ( float4( parallax2, parallax3 ) -  octaFrame.zwzw ) * _Frames - cornerDifference;

		step_1 = step_1 * (1-step_1);
		step23 = step23 * (1-step23);

		float3 steps;
		steps.x = step_1.x * step_1.y;
		steps.y = step23.x * step23.y;
		steps.z = step23.z * step23.w;
		steps = step(-steps, 0);
	
		float final = dot( steps, weights );

		clip( final - 0.5 );
	#endif
		
	o.Albedo = blendedAlbedo.rgb;
	o.Normal = worldNormal;
	o.Emission = blendedMask.rgb;
	o.Specular = blendedSpec.rgb;
	o.Smoothness = blendedSpec.a;
	o.Occlusion = blendedMask.a;
	o.Alpha = ( blendedAlbedo.a - _ClipMask );
	clip( o.Alpha );
}

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20191030

2019-10-22

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20191022

2019-10-20

[]OBBの一番長い軸を取得する方法 OBBの一番長い軸を取得する方法 - Nao_uの日記 を含むブックマーク はてなブックマーク - OBBの一番長い軸を取得する方法 - Nao_uの日記 OBBの一番長い軸を取得する方法 - Nao_uの日記 のブックマークコメント

https://www.sidefx.com/forum/topic/31983/?page=1#post-149134

  • boundノードで0BBが作れる
  • バンディングボックスのxyz軸のなかで一番長いものを残す

f:id:Nao_u:20191020205653p:image

長軸で分割するには、下記wrangleで長軸を取り出してresamleしてvoronoi

vector p0 = point(1,"P",0);

vector p1 = point(1,"P",1);

vector p2 = point(1,"P",2);

vector p3 = point(1,"P",3);

vector np0,np1;

if( length(p0-p1) > length(p1-p2)){

np0 = (p0+p3)*0.5;

np1 = (p1+p2)*0.5;

}else{

np0 = (p0+p1)*0.5;

np1 = (p2+p3)*0.5;

}

addpoint(0,np0);

addpoint(0,np1);

int prim = addprim(geoself(), "polyline");

addvertex(geoself(), prim, 0);

addvertex(geoself(), prim, 1);


[] 直線を分割している不要なエッジの削除  直線を分割している不要なエッジの削除 - Nao_uの日記 を含むブックマーク はてなブックマーク -  直線を分割している不要なエッジの削除 - Nao_uの日記  直線を分割している不要なエッジの削除 - Nao_uの日記 のブックマークコメント

https://gamecgben.blogspot.com/2018/02/houdini.html

FacetのRemove Inline Points、distanceで調整

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20191020

2019-10-13

Noise Lab (3D) Noise Lab (3D)  - Nao_uの日記 を含むブックマーク はてなブックマーク - Noise Lab (3D)  - Nao_uの日記 Noise Lab (3D)  - Nao_uの日記 のブックマークコメント

// Grab from https://www.shadertoy.com/view/4djSRW

#define MOD3 vec3(.1031,.11369,.13787)

//#define MOD3 vec3(443.8975,397.2973, 491.1871)

float hash31(vec3 p3)

{

p3 = fract(p3 * MOD3);

p3 += dot(p3, p3.yzx + 19.19);

return -1.0 + 2.0 * fract((p3.x + p3.y) * p3.z);

}

こんなシンプルなコードで3Dのノイズが返せてる

x = fract((p3.x + p3.y) * p3.z;

y = fract((p3.y + p3.z) * p3.x;

z = fract((p3.z + p3.x) * p3.y;

にしたら3次元化できる

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20191013

2019-09-16

Oculus Mediumの技術ブログ Oculus Mediumの技術ブログ - Nao_uの日記 を含むブックマーク はてなブックマーク - Oculus Mediumの技術ブログ - Nao_uの日記 Oculus Mediumの技術ブログ - Nao_uの日記 のブックマークコメント

Oculus Mediumの技術ブログの解説パね~。MediumってSigned Distance Fieldでモデル表現して、Transvoxelっていうマーチンキューブの亜種でメッシュ化して描画してるんだってよ。SDFをそのままレイマーチングで描画する手もあったけど、パフォーマンスの問題でやめたらしい

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20190916

2019-09-15

Unity2018/2019における最適化事情 Unity2018/2019における最適化事情 - Nao_uの日記 を含むブックマーク はてなブックマーク - Unity2018/2019における最適化事情 - Nao_uの日記 Unity2018/2019における最適化事情 - Nao_uの日記 のブックマークコメント

カオス

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20190915

2019-09-12

Unityではじめるオープンワールド入門 エンジニア編 Unityではじめるオープンワールド入門 エンジニア編 - Nao_uの日記 を含むブックマーク はてなブックマーク - Unityではじめるオープンワールド入門 エンジニア編 - Nao_uの日記 Unityではじめるオープンワールド入門 エンジニア編 - Nao_uの日記 のブックマークコメント

http://cedec.cesa.or.jp/2019/session/detail/s5ceb8b3b98c9d

これ自前で実装するの…

Just Cause 4: Physics Postmortem/ジャストコーズ4: 物理ポストモーテム Just Cause 4: Physics Postmortem/ジャストコーズ4: 物理ポストモーテム - Nao_uの日記 を含むブックマーク はてなブックマーク - Just Cause 4: Physics Postmortem/ジャストコーズ4: 物理ポストモーテム - Nao_uの日記 Just Cause 4: Physics Postmortem/ジャストコーズ4: 物理ポストモーテム - Nao_uの日記 のブックマークコメント

http://cedec.cesa.or.jp/2019/session/detail/s5cecf4cec3b5a

PC版でも物理は常に33msで計算して補間表示


ディープラーニングによる画像処理を実機側で高速に動かし、活用する技術 ディープラーニングによる画像処理を実機側で高速に動かし、活用する技術 - Nao_uの日記 を含むブックマーク はてなブックマーク - ディープラーニングによる画像処理を実機側で高速に動かし、活用する技術 - Nao_uの日記 ディープラーニングによる画像処理を実機側で高速に動かし、活用する技術 - Nao_uの日記 のブックマークコメント

http://cedec.cesa.or.jp/2019/session/detail/s5c9a015dea39f

Tensorflow Lite

DirectX12 を使用したシェーダー上への独自ニューラルネットワーク構築と描画品質向上のためのリアルタイムレンダリングへの応用 DirectX12 を使用したシェーダー上への独自ニューラルネットワーク構築と描画品質向上のためのリアルタイムレンダリングへの応用 - Nao_uの日記 を含むブックマーク はてなブックマーク - DirectX12 を使用したシェーダー上への独自ニューラルネットワーク構築と描画品質向上のためのリアルタイムレンダリングへの応用 - Nao_uの日記 DirectX12 を使用したシェーダー上への独自ニューラルネットワーク構築と描画品質向上のためのリアルタイムレンダリングへの応用 - Nao_uの日記 のブックマークコメント

http://cedec.cesa.or.jp/2019/session/detail/s5c906cc0259d8

DirectML

DirectX Raytracingを用いたライトベイカーの実装について DirectX Raytracingを用いたライトベイカーの実装について - Nao_uの日記 を含むブックマーク はてなブックマーク - DirectX Raytracingを用いたライトベイカーの実装について - Nao_uの日記 DirectX Raytracingを用いたライトベイカーの実装について - Nao_uの日記 のブックマークコメント

http://cedec.cesa.or.jp/2019/session/detail/s5c77a9646f7d3

5Gでゲームはどう変わる?~そろそろ気にしておきたい5G最前線~ 5Gでゲームはどう変わる?~そろそろ気にしておきたい5G最前線~ - Nao_uの日記 を含むブックマーク はてなブックマーク - 5Gでゲームはどう変わる?~そろそろ気にしておきたい5G最前線~ - Nao_uの日記 5Gでゲームはどう変わる?~そろそろ気にしておきたい5G最前線~ - Nao_uの日記 のブックマークコメント

http://cedec.cesa.or.jp/2019/session/detail/s5cbe7e6470aea

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20190912

2019-09-11

『大乱闘スマッシュブラザーズ SPECIAL』~大規模開発を支えた 開発環境の整備と運用 『大乱闘スマッシュブラザーズ SPECIAL』~大規模開発を支えた 開発環境の整備と運用 - Nao_uの日記 を含むブックマーク はてなブックマーク - 『大乱闘スマッシュブラザーズ SPECIAL』~大規模開発を支えた 開発環境の整備と運用 - Nao_uの日記 『大乱闘スマッシュブラザーズ SPECIAL』~大規模開発を支えた 開発環境の整備と運用 - Nao_uの日記 のブックマークコメント

https://cedec.cesa.or.jp/2019/session/detail/s5c9b5851a5fe3

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20190911

2019-09-10

★『Tales of ARISE』におけるレンダリング技術と高速化 ★『Tales of ARISE』におけるレンダリング技術と高速化 - Nao_uの日記 を含むブックマーク はてなブックマーク - ★『Tales of ARISE』におけるレンダリング技術と高速化 - Nao_uの日記 ★『Tales of ARISE』におけるレンダリング技術と高速化 - Nao_uの日記 のブックマークコメント

https://cedec.cesa.or.jp/2019/session/detail/s5c9c5bc2d3123

雲のレイマーチ、ライト方向だけ先に計算して3Dテクスチャに格納

半透明を縮小バッファに描くが、エッジだけマスクを作ってフル解像度で再度描画してる。

業界最先端のVFX制作の現場とSPARKGEARの最新機能について 業界最先端のVFX制作の現場とSPARKGEARの最新機能について - Nao_uの日記 を含むブックマーク はてなブックマーク - 業界最先端のVFX制作の現場とSPARKGEARの最新機能について - Nao_uの日記 業界最先端のVFX制作の現場とSPARKGEARの最新機能について - Nao_uの日記 のブックマークコメント

https://cedec.cesa.or.jp/2019/session/detail/s5ce49dab14dc6

GPU最適化:シェーダ実行の高速化手法 GPU最適化:シェーダ実行の高速化手法 - Nao_uの日記 を含むブックマーク はてなブックマーク - GPU最適化:シェーダ実行の高速化手法 - Nao_uの日記 GPU最適化:シェーダ実行の高速化手法 - Nao_uの日記 のブックマークコメント

https://cedec.cesa.or.jp/2019/session/detail/s5c9e9e51afd59

『大乱闘スマッシュブラザーズ SPECIAL』~膨大なアセットのビルド時間&容量との戦い 『大乱闘スマッシュブラザーズ SPECIAL』~膨大なアセットのビルド時間&容量との戦い - Nao_uの日記 を含むブックマーク はてなブックマーク - 『大乱闘スマッシュブラザーズ SPECIAL』~膨大なアセットのビルド時間&容量との戦い - Nao_uの日記 『大乱闘スマッシュブラザーズ SPECIAL』~膨大なアセットのビルド時間&容量との戦い - Nao_uの日記 のブックマークコメント

https://cedec.cesa.or.jp/2019/session/detail/s5c9b0f38387a7

リアルタイムレイトレーシングの導入と最適化事例 リアルタイムレイトレーシングの導入と最適化事例 - Nao_uの日記 を含むブックマーク はてなブックマーク - リアルタイムレイトレーシングの導入と最適化事例 - Nao_uの日記 リアルタイムレイトレーシングの導入と最適化事例 - Nao_uの日記 のブックマークコメント

https://cedec.cesa.or.jp/2019/session/detail/s5c9d78b0e6f2b

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20190910

2019-09-07

2019-09-07 - Nao_uの日記 を含むブックマーク 2019-09-07 - Nao_uの日記 のブックマークコメント

https://cedec.cesa.or.jp/2019/session/detail/s5c9f6c908d5b7

  • 影、AO、SSR,レイマーチ雲、大気散乱、ボリューメトリックフォグなど全部入り
  • 17:20 ボリューメトリックフォグによる空島の地形に沿った近距離雲
    • メッシュで作成した雲を濃度マップとしてボリューム化して3Dノイズと合成

エースコンバット7における”空の革新”について エースコンバット7における”空の革新”について - Nao_uの日記 を含むブックマーク はてなブックマーク - エースコンバット7における”空の革新”について - Nao_uの日記 エースコンバット7における”空の革新”について - Nao_uの日記 のブックマークコメント

https://cedec.cesa.or.jp/2019/session/detail/s5c9cb6579df11

  • ミー散乱、雲底、雲頂など雲の基礎知識
  • TrueSky採用、パイロットに雲の特性を聞いて反映
  • ジオメトリ→TureSky→半透明の順で描画
    • 大気のミー散乱、ハイトフォグを調整
  • ミッション4ではシンガポールヘイズを再現、隣国の野焼きで黄色くなる
    • リニアに保管できるので日の出などが作れる
  • 雲の上下の高さとボリュームの幅で調整
  • 雲の量を変えるとアンビエントが変わる
  • 雲の上下の密度バランスで全体の形状を設定、上を濃くすると迷路っぽくなる
  • 夏のモコモコした雲→仏の薄い雲をパラメータ
  • 順方法、逆方向の産卵、アンビエント、太陽光の減衰率、ゴッド令などのパラメータで高原計算
  • エッジのパラメータは重要だがアーティファクトも出やすい。この辺は拡張している
  • 雲の配置を2Dテクスチャで設定できる拡張
    • 赤:雲を増やす 緑:減らす 青:そのままにする
  • 半透明合成用のTranslusency Modifireは自前追加したらしい…
  • ボクセルを視線に向くようにスライスすることで四角いアーティファクトが消せる
  • 様々な改善により、雲が占めるGPUコストが全体の3〜4割くらいに抑えられた

エースコンバット7 VRが実現したエースパイロット体験のひみつ エースコンバット7 VRが実現したエースパイロット体験のひみつ - Nao_uの日記 を含むブックマーク はてなブックマーク - エースコンバット7 VRが実現したエースパイロット体験のひみつ - Nao_uの日記 エースコンバット7 VRが実現したエースパイロット体験のひみつ - Nao_uの日記 のブックマークコメント

  • 作ったリソースを捨てることを前提に、イテレーションを上げることを重視
  • 離陸前の視線誘導、僚機を追うなど自動移動時に方向転換先を予測できるように
  • レーダーや機体の向きなどのUIをコクピットに統合することで実在感や没入感が上がる
  • ギャラクシアン3のゲーム開始前の導入と同じような文法で、入り口で機体を盛り上げる、ゲームが始まってからは酔い防止で守りに入る

レイ・トレーシングのデータ構造を極める! レイ・トレーシングのデータ構造を極める! - Nao_uの日記 を含むブックマーク はてなブックマーク - レイ・トレーシングのデータ構造を極める! - Nao_uの日記 レイ・トレーシングのデータ構造を極める! - Nao_uの日記 のブックマークコメント

https://cedec.cesa.or.jp/2019/session/detail/s5c63bce679db2

  • ほぼ全てのレンダラがBVHを使用(Bounding Volume Hertrlcy)
    • First-Hit 最初に当たった
    • Any-Hit 当たるかどうかだけ調べる(AOや影で使う)
    • Multi-Hit 原点から近い順に全ての接触を調べる(半透明で使う)

「強い」を作るだけが能じゃない!ディープラーニングで3Dアクションゲームの敵AIを作ってみた 「強い」を作るだけが能じゃない!ディープラーニングで3Dアクションゲームの敵AIを作ってみた - Nao_uの日記 を含むブックマーク はてなブックマーク - 「強い」を作るだけが能じゃない!ディープラーニングで3Dアクションゲームの敵AIを作ってみた - Nao_uの日記 「強い」を作るだけが能じゃない!ディープラーニングで3Dアクションゲームの敵AIを作ってみた - Nao_uの日記 のブックマークコメント

https://cedec.cesa.or.jp/2019/session/detail/s5c8f2a755dbc1

  • 自分と敵の相対位置やプレイヤーとの距離など97個のパラメータを与えて学習
  • いて欲しい適正な距離や、やって欲しい行動に報酬を与えることで個性を与えて望む形に学習させていく
  • 行動を補正したい時には再学習させるのではなく、追加で報酬を与えてコントロール(手移動でやってもいい?)
  • プレイヤーと敵、どちらか片方はちゃんとしたAIにしないと学習が進まない
  • 特定の連続攻撃が欲しいならそういう行動をセットにしておく
  • シチュエーションごとに学習が必要なので、複雑なステージで戦わせたいならそこで学習する必要がある
  • 保証ができないのと確認方法が課題

プロシージャルゲームコンテンツ制作ブートキャンプ 2019 Part 1 バリエーション生成 プロシージャルゲームコンテンツ制作ブートキャンプ 2019 Part 1 バリエーション生成 - Nao_uの日記 を含むブックマーク はてなブックマーク - プロシージャルゲームコンテンツ制作ブートキャンプ 2019 Part 1 バリエーション生成 - Nao_uの日記 プロシージャルゲームコンテンツ制作ブートキャンプ 2019 Part 1 バリエーション生成 - Nao_uの日記 のブックマークコメント

https://cedec.cesa.or.jp/2019/session/detail/s5c9c3b18b187c

  • 三分割、特殊等分割にボタンを追加して作業フローを簡略化
  • 種子の発芽シミュレーションの話
  • Pythonの使い所の話

プロシージャルゲームコンテンツ制作ブートキャンプ 2019 Part 2 機械学習 プロシージャルゲームコンテンツ制作ブートキャンプ 2019 Part 2 機械学習 - Nao_uの日記 を含むブックマーク はてなブックマーク - プロシージャルゲームコンテンツ制作ブートキャンプ 2019 Part 2 機械学習 - Nao_uの日記 プロシージャルゲームコンテンツ制作ブートキャンプ 2019 Part 2 機械学習 - Nao_uの日記 のブックマークコメント

https://cedec.cesa.or.jp/2019/session/detail/s5c9c3c8c9a39d

  • 機械学習の話
  • 建築の話

質疑:

  • pythonの情報ソースは?
    • no more retake
  • 背景はどう作ってる?
    • 今回のでもは河川+6角形でボロの意分割
    • 実際製品では、最短のルート検索から求められる合理的な道を用意してそこに面した正面を
トラックバック - http://game.g.hatena.ne.jp/Nao_u/20190907

2019-08-03

ゲーム部屋の整備 ゲーム部屋の整備 - Nao_uの日記 を含むブックマーク はてなブックマーク - ゲーム部屋の整備 - Nao_uの日記 ゲーム部屋の整備 - Nao_uの日記 のブックマークコメント

https://twitter.com/Nao_u_/status/1157630140442017792

奥さんと子供が帰省中なので滞ってたゲーム部屋の整備を再開。作業の過程でやっぱりエイリアンソルジャー最高!、とかクレタクはDC版が音楽も操作も一番安定してて楽しい、とか遊んでると何も進まない


MD版幽遊白書、一人で遊ぶなら裏技の1対3ハンデ戦がちょうどよく頑張らないと勝てない難度で面白いんだけど、4人対戦の楽しさには遠く及ばない。学生の頃に夜な夜な対戦してた時間はもう戻ってこないので、対戦ゲームの楽しさってほんと一期一会だなぁ、と。


クレタクはあと一人届けたらAWESOMEランクに届くところで集中力が切れて高速道路で対向車を避けれずタイムオーバー。クレタク2はまともな移植版がないのでDC実機でしか遊べないんだけど、マップが複雑すぎてまったく覚えてないのでほとんど新作を遊ぶ感覚になってた


ワイルドトラックス、車体とタイヤの間にバネ入った不思議なドリフト感で、フレームレートの低さを心の目で補完できれば今遊んでも十分楽しい挙動だった。FPS視点だとカーブで車体がちゃんとロールしたりなど四輪個別に物理計算してる最初のレースゲームだったりするのかも


海腹川背も操作はだいたい手が覚えてたけど、天井振り子から狙った場所にルアーをつける操作が安定せず、最終面でロケットジャンプに失敗して死亡。このゲームはフレーム単位のタイミングがシビアな操作が必要になるので、テレビの遅延があると一気に感覚が狂いそう


海腹川背を遊んでた頃はまだ20世紀だったので、こんな丁寧な攻略サイトもない時代だった。オタマがいるルートは倒すのに時間がかかるしその先のイシダイが安定せず心が折れるので、いつもほぼ最短クリアルートのみ遊んでた。カニやカツオが動いてる所は自力では見た事がない…

(link: http://umiharakawase.the-ninja.jp/newpage3.html) umiharakawase.the-ninja.jp/newpage3.html


DC版のセガラリー2はあまりいい印象がなく、もう10年以上起動してなかった。改めてプレイすると基本60fpsなのに頻繁に30fpsに処理落ちするせいで走りに集中できないのがだいぶストレスに。サターン版の1が30fpsでも気にならないのは解像度も低いし最初からそういうものだと割り切って遊べるからかな?


DCのガンコンが出てきたのにハウスオブザデッド2がどこを探しても見つからないので注文した。タイピングオブザデッドはディスクはあるけどキーボードが見つからず。子供の頃から自己流でキーボードを叩いてて、タッチタイピングできるようになったのはこのゲームで練習したおかげなので感謝してる

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20190803

2019-07-31

SIGGRAPH2019 Phasor noise - shadertoy links SIGGRAPH2019 Phasor noise - shadertoy links - Nao_uの日記 を含むブックマーク はてなブックマーク - SIGGRAPH2019 Phasor noise - shadertoy links - Nao_uの日記 SIGGRAPH2019 Phasor noise - shadertoy links - Nao_uの日記 のブックマークコメント

フェーザーは電気回路の分野でサイン波を複素数で表現する手法。フーリエ変換の性質を持つ。

フェーザーノイズはガボールノイズを強度と変調正弦波成分に分離し再定式化したもの。コントラストの高いパターンを生成できる。

`Gabor Noise(x)= I(x)sin(φ(x))`

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20190731

2019-07-28

Unity公式のHoudini HDAを使って、Unity用のPointCache(.pcache)やVectorField(.vf)を出力する Unity公式のHoudini HDAを使って、Unity用のPointCache(.pcache)やVectorField(.vf)を出力する - Nao_uの日記 を含むブックマーク はてなブックマーク - Unity公式のHoudini HDAを使って、Unity用のPointCache(.pcache)やVectorField(.vf)を出力する - Nao_uの日記 Unity公式のHoudini HDAを使って、Unity用のPointCache(.pcache)やVectorField(.vf)を出力する - Nao_uの日記 のブックマークコメント

【Unity】UnityへFGAをインポートしてVisual Effect GraphのVectorFieldとして使う方法 【Unity】UnityへFGAをインポートしてVisual Effect GraphのVectorFieldとして使う方法 - Nao_uの日記 を含むブックマーク はてなブックマーク - 【Unity】UnityへFGAをインポートしてVisual Effect GraphのVectorFieldとして使う方法 - Nao_uの日記 【Unity】UnityへFGAをインポートしてVisual Effect GraphのVectorFieldとして使う方法 - Nao_uの日記 のブックマークコメント

HoudiniでVectorField(.fga)を作成する方法(サンプルプロジェクト付き) HoudiniでVectorField(.fga)を作成する方法(サンプルプロジェクト付き) - Nao_uの日記 を含むブックマーク はてなブックマーク - HoudiniでVectorField(.fga)を作成する方法(サンプルプロジェクト付き) - Nao_uの日記 HoudiniでVectorField(.fga)を作成する方法(サンプルプロジェクト付き) - Nao_uの日記 のブックマークコメント

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20190728

2019-06-08

Houdiniで交差点を含む複雑な道路を作るチュートリアル Houdiniで交差点を含む複雑な道路を作るチュートリアル - Nao_uの日記 を含むブックマーク はてなブックマーク - Houdiniで交差点を含む複雑な道路を作るチュートリアル - Nao_uの日記 Houdiniで交差点を含む複雑な道路を作るチュートリアル - Nao_uの日記 のブックマークコメント

https://dokaitutorials.com/complex-roads-in-houdini-1/

道路以外にも市街地やビルの生成の動画もあった

Houdini:Spare Input Houdini:Spare Input - Nao_uの日記 を含むブックマーク はてなブックマーク - Houdini:Spare Input - Nao_uの日記 Houdini:Spare Input - Nao_uの日記 のブックマークコメント

http://nomoreretake.net/2018/08/18/houdini_spareinput/

他のノードのパラメータを参照する方法。コンパイルブロック向けに追加されたっぽいが、それ以外の場面でも使えて、エクスプレッションの記述をシンプルにできる。こんなのがあるとは知らなかった

Houdini Twitterリンク Houdini Twitterリンク - Nao_uの日記 を含むブックマーク はてなブックマーク - Houdini Twitterリンク - Nao_uの日記 Houdini Twitterリンク - Nao_uの日記 のブックマークコメント

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20190608