Yaminabe

¤é¤¯¤¬¤­¤Ö¤í¤°

¤Æ¤¹¤È¡§Yaminabe¤Á¤ã¤ó¤ÏÀ¸¤Þ¤ì¤¿¤Ð¤«¤ê¤Î¥Ö¥í¥°¤Ç¤¹¡¡¤ß¤ó¤Ê¤ÇÃç¤è¤¯»È¤Ã¤Æ¤Í

¥«¥Æ¥´¥ê¡§ Unity3d

 

Á°²ó¤«¤é¤Þ¤¿¹¹¿·¤Î»þ´Ö¤¬¤¢¤¤¤Æ¤·¤Þ¤¤¤Þ¤·¤¿¤¬ ¸«¤ËÍè¤Æ¤¯¤À¤µ¤Ã¤Æ¤ëÊý¡¹¤¢¤ê¤¬¤È¤¦¤´¤¶¤¤¤Þ¤¹¡£

Çï¼ê¥³¥á¥ó¥È夤¤Æ¤ë¤Î¤Ç¤¹¤¬ ¤ªÊÖ»ö¤â½ÐÍè¤Ê¤¯¤Æ¿½¤·Ìõ¤Ê¤¤¤Ç¤¹¡£

Àè½µ °ìÆü¤Û¤É¶õ¤­»þ´Ö¤¬¤¢¤Ã¤¿¤Î¤Ç¥¨¥Õ¥§¥¯¥ÈÍÑ¥·¥§¡¼¥À¥µ¥ó¥×¥ë¤òºîÀ®¤·¤Æ¤ß¤Þ¤·¤¿

¥Ù¡¼¥¹¤ÏPaticleAdditive.shader ¤Ç¤¹¤¬ÍÍ¡¹¤Ê¥·¥§¡¼¥À¤Ë¤â±þÍѤ¬¸ú¤­¤½¤¦¤Ê¤â¤Î¤òµÍ¤á¹þ¤ó¤Ç¤ß¤¿´¶¤¸¤Ç¤¹

¥¨¥Õ¥§¥¯¥ÈºîÀ®»þ¤Ë ²èÌÌÆâ¤Ç²è¼ÁÄ´À°¤¬¤Ç¤­¤ë¤ÈÈó¾ï¤Ëºî¶È¤¬´Êά²½¤Ç¤­¤ë¤Î¤Ç¤½¤¦¤·¤¿µ¡Ç½¤¬¥á¥¤¥ó¤Ç¤¹¤Í

º£²ó¤Î¥·¥§¡¼¥À¡¼¤Ï¿µ¡Ç½¤ÊÈ¿ÌÌ ¼ã´³½Å¤¿¤á¤Ê¥³¡¼¥É¤À¤È»×¤¤¤Þ¤¹¤¬ ¤¢¤¯¤Þ¤Ç¥µ¥ó¥×¥ë¤Ê¤Î¤Ç

ÂçÎÌÉÁ²è¤¹¤ë¥Ñ¡¼¥Æ¥£¥¯¥ë¥¨¥Õ¥§¥¯¥È¤ä¥¹¥¯¥ê¡¼¥ó¤ËÂФ·¤ÆÂ礭¤ÊÌÌÀѤò¤È¤ëÍÑÅӤξì¹ç¤òÁÛÄꤷ¤Æ¤­¤Þ¤»¤ó

¼ÂÁõ¤¹¤ë¤È¤­¤Ë¤Ï ɬÍפ˱þ¤¸¤ÆÌ¤»ÈÍѤʵ¡Ç½¤ò¥³¥á¥ó¥È¥¢¥¦¥È¤¹¤ë¤Ê¤É¤·¤ÆºÇŬ²½¤ò¤·¤Æ¤¯¤À¤µ¤¤¡£

 

 

¥Ç¥Ð¥Ã¥°¤â¤¢¤Þ¤ê¤Ç¤­¤Æ¤¤¤Ê¤¤¤Î¤Ç·¿ÉÕ¤±¤Î¤ª¤«¤·¤¤Éôʬ¤â¤¢¤ë¤«¤Ê¤È¤Ï»×¤¤¤Þ¤¹¤¬ ¤Ê¤Ë¤Ö¤ó»þ´Ö¤¬¤¿¤ê¤Ê¤¤¤Î¤Çµ¤¤Å¤¤¤¿Êý¤Ï¤´»ØÅ¦¤¯¤À¤µ¤¤¡£

¡ÊÍ×Ìó¡§ ¤Ê¤ë¤Ù¤¯¤¸¤ê¤­¤Ç¤¬¤ó¤Ð¤Ã¤Æ¤ß¤Æ¤Û¤·¤¤¤Ê¤¡¡Ë

 

¢£"Particles/~MultiPurpose"

Shader "Particles/~MultiPurpose" {
Properties {

_TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)
_MainTex ("Particle Texture", 2D) = "white" {}
_InvFade ("Soft Particles Factor", Range(0.01,3.0)) = 1.0

_RotateSpeed ("RotateSpeed", Float) = 0.0


_ColorIndices ("ColorIndices Texture", 2D) = "white" {}
_SelectColorIndices("SelectColorIndices", Range(0.0,1.0)) = 1.0

_SliceColor ("Slice Color", Color) = (0.5,0.5,0.5,0.5)
_SliceGuide ("Slice Guide (RGB)", 2D) = "white" {}
_SliceEdge ("Slice Edge (RGB)", 2D) = "Gray" {}
_SliceAmount ("Slice Amount", Range(-1.2, 1.2)) = 0.5


_Flowmap("Flowmap", 2D) = "black" {}
_FlowAmount("Flow Amount", Range(-2.0, 2.0)) = 0.0

_MaskTex ("Mask Texture", 2D) = "white" {}

_VertexFlowTex ("VertexFlow Texture ", 2D) = "white" {}
_VertexFlowAmount ("VertexFlow Amount", Range(0, 10.0)) = 0.0

_CC_Bright("CC_Bright", Range(0.0,2.0)) = 0.5
_CC_Saturate("CC_Saturate", Range(0.0,1.0)) = 0.5
_CC_Contrast("CC_Contrast", Range(0.0,3.0)) = 1.2

_CC_Hue("CC_Hue", Range(-10.0,10.0)) = 0.5
_CC_Saturation("CC_Saturation", Range(0.0,1.0)) = 0.8
_CC_Luminosity("CC_Luminosity", Range(0.0,2.0)) = 0.6
}

Category {

Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
Blend One OneMinusSrcAlpha
ColorMask RGB
Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,1) }
BindChannels {
Bind "Color", color
Bind "Vertex", vertex
Bind "TexCoord", texcoord
}

// ---- Fragment program cards
SubShader {
Pass {

CGPROGRAM

#pragma glsl
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#pragma multi_compile_particles
#pragma target 4.0
#include "UnityCG.cginc"

sampler2D _MainTex;

float _RotateSpeed;
float4x4 pulsateMatrix ;

sampler2D _ColorIndices;
float _SelectColorIndices;

fixed4 _SliceColor ;

sampler2D _SliceGuide;
sampler2D _SliceEdge;
float _SliceAmount;

sampler2D _Flowmap;
float _FlowAmount;

sampler2D _MaskTex;
sampler2D _VertexFlowTex;
float4 _VertexFlowTex_ST;
float _VertexFlowAmount;


float _CC_Bright;
float _CC_Saturate;
float _CC_Contrast;

float _CC_Hue;
float _CC_Saturation;
float _CC_Luminosity;


fixed4 _TintColor;



struct appdata_t {
float4 vertex : POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
};

struct v2f {
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
#ifdef SOFTPARTICLES_ON
float4 projPos : TEXCOORD1;
#endif
float2 texcoord_orig : TEXCOORD2;
};

float4 _MainTex_ST;


float2 Rotator(float2 UV)
{
float sine = sin(_Time*_RotateSpeed);
float cosine = cos(_Time*_RotateSpeed);

pulsateMatrix._m00 = pulsateMatrix._m11 = cosine;
pulsateMatrix._m10 = -sine;
pulsateMatrix._m01 = sine;
float4 tempUV = float4(UV.x-0.5,UV.y-0.5,0,0);
float4 temp = mul(pulsateMatrix,tempUV);
UV.x = temp.x+0.5;
UV.y = temp.y+0.5;
return UV;
}

float3 ContrastSaturationBrightness(float3 color, float brt, float sat, float con)
{

float AvgLumR = 0.5;
float AvgLumG = 0.5;
float AvgLumB = 0.5;

float3 LumCoeff = float3(0.2125, 0.7154, 0.0721);

float3 AvgLumin = float3(AvgLumR, AvgLumG, AvgLumB);
float3 brtColor = color * brt;
float intensityf = dot(brtColor, LumCoeff);
float3 intensity = float3(intensityf, intensityf, intensityf);
float3 satColor = lerp(intensity, brtColor, sat);
float3 conColor = lerp(AvgLumin, satColor, con);
return conColor;
}

float3 RGBToHSL(float3 color)
{
float3 hsl; // init to 0 to avoid warnings ? (and reverse if + remove first part)

float fmin = min(min(color.r, color.g), color.b); //Min. value of RGB
float fmax = max(max(color.r, color.g), color.b); //Max. value of RGB
float delta = fmax - fmin; //Delta RGB value

hsl.z = (fmax + fmin) / 2.0; // Luminance

if (delta == 0.0) //This is a gray, no chroma...
{
hsl.x = 0.0; // Hue
hsl.y = 0.0; // Saturation
}
else //Chromatic data...
{
if (hsl.z < 0.5)
hsl.y = delta / (fmax + fmin); // Saturation
else
hsl.y = delta / (2.0 - fmax - fmin); // Saturation

float deltaR = (((fmax - color.r) / 6.0) + (delta / 2.0)) / delta;
float deltaG = (((fmax - color.g) / 6.0) + (delta / 2.0)) / delta;
float deltaB = (((fmax - color.b) / 6.0) + (delta / 2.0)) / delta;

if (color.r == fmax )
hsl.x = deltaB - deltaG; // Hue
else if (color.g == fmax)
hsl.x = (1.0 / 3.0) + deltaR - deltaB; // Hue
else if (color.b == fmax)
hsl.x = (2.0 / 3.0) + deltaG - deltaR; // Hue

if (hsl.x < 0.0)
hsl.x += 1.0; // Hue
else if (hsl.x > 1.0)
hsl.x -= 1.0; // Hue
}

return hsl;
}

float HueToRGB(float f1, float f2, float hue)
{
if (hue < 0.0)
hue += 1.0;
else if (hue > 1.0)
hue -= 1.0;
float res;
if ((6.0 * hue) < 1.0)
res = f1 + (f2 - f1) * 6.0 * hue;
else if ((2.0 * hue) < 1.0)
res = f2;
else if ((3.0 * hue) < 2.0)
res = f1 + (f2 - f1) * ((2.0 / 3.0) - hue) * 6.0;
else
res = f1;
return res;
}

float3 HSLToRGB(float3 hsl)
{
float3 rgb;

if (hsl.y == 0.0)
rgb = float3(hsl.z, hsl.z, hsl.z); // Luminance
else
{
float f2;

if (hsl.z < 0.5)
f2 = hsl.z * (1.0 + hsl.y);
else
f2 = (hsl.z + hsl.y) - (hsl.y * hsl.z);

float f1 = 2.0 * hsl.z - f2;

rgb.r = HueToRGB(f1, f2, hsl.x + (1.0/3.0));
rgb.g = HueToRGB(f1, f2, hsl.x);
rgb.b= HueToRGB(f1, f2, hsl.x - (1.0/3.0));
}

return rgb;
}





v2f vert (appdata_t v)
{
v2f o;


o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);


#ifdef SOFTPARTICLES_ON
o.projPos = ComputeScreenPos (o.vertex);
COMPUTE_EYEDEPTH(o.projPos.z);
#endif

o.color = v.color;

o.texcoord_orig = Rotator( v.texcoord.xy);
o.texcoord = Rotator( v.texcoord);
o.texcoord = TRANSFORM_TEX( o.texcoord,_MainTex);

half2 VertexFlowUV¡¡= TRANSFORM_TEX( v.texcoord, _VertexFlowTex);
half3 VertexFlowVec = tex2Dlod(_VertexFlowTex, float4(VertexFlowUV.xy,0,0)).rgb * 2.0-1.0;

o.vertex.xyz += VertexFlowVec.xyz * _VertexFlowAmount;


return o;

}



sampler2D _CameraDepthTexture;
float _InvFade;





fixed4 frag (v2f i) : COLOR
{
#ifdef SOFTPARTICLES_ON
float sceneZ = LinearEyeDepth (UNITY_SAMPLE_DEPTH(
tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos))));
float partZ = i.projPos.z;
float fade = saturate (_InvFade * (sceneZ-partZ));
i.color *= fade;
#endif




////FlowMap////////////////////////////////////////////////////////////

half2 FlowtexUV = tex2D( _Flowmap,i.texcoord_orig).rg * 2.0-1.0;

half2 texUV;

texUV.x =clamp( ( i.texcoord_orig.x *2.0 -1.0)+ (FlowtexUV.x *_FlowAmount ),-1,1);
texUV.y =clamp( ( i.texcoord_orig.y *2.0 -1.0)+ (FlowtexUV.y *_FlowAmount ),-1,1);

texUV.x =( texUV.x +1.0)/2.0*_MainTex_ST.x +_MainTex_ST.z;
texUV.y =( texUV.y +1.0)/2.0*_MainTex_ST.y +_MainTex_ST.w;


// Mask///////////////////////////////////////////////////////////////////////
fixed4 tex = tex2D(_MainTex, texUV);

float MaskVal;
half4 MaskColor=half4(1,1,1,1);


MaskColor = tex2D ( _MaskTex,i.texcoord_orig);

tex.a =MaskColor.a ;


fixed4 col;



// ColorIndices/////////////////////////////////////////////////////


half2 ColorIndicesUV ;

ColorIndicesUV.x = tex.r;
ColorIndicesUV.y =1.0-_SelectColorIndices ;

fixed4 ColorIndices = tex2D(_ColorIndices, ColorIndicesUV );


col.rgb =_TintColor.rgb * ColorIndices.rgb * tex.rgb * i.color.rgb * 2.0f;


// Dissolve with Alpha channel/////////////////////////////////////////


float AbsSliceAmount = abs(_SliceAmount );

clip(tex2D (_SliceGuide, i.texcoord_orig).rgb - AbsSliceAmount );

half2 SliceEdgeUV;

SliceEdgeUV.x = (tex2D (_SliceGuide, i.texcoord_orig).r -AbsSliceAmount );
SliceEdgeUV.y = 0.5;

fixed3 EdgeColor = _SliceColor* tex2D (_SliceEdge, SliceEdgeUV).rgb* 1.8;

if (_SliceAmount >0.1 )
col.rgb += EdgeColor.rgb;
else if (_SliceAmount < -0.1 )
col.rgb *= 1- EdgeColor.rgb*0.5;




// ColorCollect /////////////////////////////////////////////////////////////////////

col.rgb= ContrastSaturationBrightness(col.rgb, _CC_Bright, _CC_Saturate, _CC_Contrast);

float3 HSL = RGBToHSL(col.rgb);

HSL.r *= _CC_Hue;
HSL.g *= _CC_Saturation;
HSL.b *= _CC_Luminosity;

col.rgb = HSLToRGB(HSL);

//////////////////////////////////////////////////////////////////////////////////////


col.a = (1 - tex.a) * (_TintColor.a * i.color.a * 2.0f) ;


return col;



}
ENDCG


}
}

// ---- Dual texture cards
SubShader {
Pass {
SetTexture [_MainTex] {
constantColor [_TintColor]
combine constant * texture, constant * primary DOUBLE
}
SetTexture [_MainTex] {
combine previous * primary DOUBLE, one - texture * previous
}
}
}

// ---- Single texture cards (does not do color tint)
SubShader {
Pass {
SetTexture [_MainTex] {
combine texture * primary DOUBLE, one - texture * primary
}
}
}
}
}


shader_slot

 

 

¡üColor_Indices

image1

¥«¥é¡¼¤ÎRÀ®Ê¬¤Î¿ôÃÍ £°~£±¤ËÂФ·¤Æ ¥Æ¥¯¥¹¥Á¥ã¤Î¥«¥é¡¼¤òUVÀ®Ê¬¤ÎUÊý¸þ¤Î¥«¥é¡¼¤ò³ä¤êÅö¤Æ¤Þ¤¹

¥Æ¥¯¥¹¥Á¥ã¥µ¥¤¥º¤É¤Î¤è¤¦¤Ê¤â¤Î¤ò»ÈÍѤ·¤Æ¤âÎɤ¤¤Î¤Ç¤¹¤¬ R¥Á¥ã¥ó¥Í¥ë¤Î¥«¥é¡¼¤Ï£²£µ£¶³¬Ä´¤Ê¤Î¤Ç ¥¤¥ó¥Ç¥Ã¥¯¥¹¥«¥é¡¼¥Æ¥¯¥¹¥Á¥ã¤ÎUÊý¸þ¤ÏºÇÂç256¤Þ¤Ç¤Ç¤¹

Ϣ³¤Ç¥«¥é¡¼¥¢¥Ë¥á¡¼¥·¥ç¥ó¤µ¤»¤¿¤¤¾ì¹ç¤ÏVÊý¸þ¤Ë¥«¥é¡¼¥Ð¡¼¤òʤ٤ÆUV¤Î¥¢¥Ë¥á¡¼¥·¥ç¥ó¤ò¤¹¤ë¤Ê¤É¤Î¤è¤¦¤Ë»ÈÍѤ·¤Þ¤¹

¥Æ¥¯¥¹¥Á¥ã¤Î¥¤¥ó¥Ý¡¼¥ÈÀßÄê¤ÇwrapMode ¤òClamp»ØÄꤷ¤Þ¤¹ Repeat¤Î¤Þ¤Þ¤Ç¤¹¤È¥Æ¥¯¥¹¥Á¥ã¤Îü¤Ç¥«¥é¡¼¤¬Î٤Υԥ¯¥»¥ë¡Ê¤¿¤È¤¨¤Ð¥Æ¥¯¥¹¥Á¥ã¤ÎUºÇÂç¤Î¤È¤­UºÇ¾®¤Î¥«¥é¡¼¡Ë¤«¤é¿¯¿©¤µ¤ì¤Æ¤·¤Þ¤¤¤Þ¤¹¤Î¤ÇÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£

 

image5

 

 

¡üDissolve_Filter

image2


Dissolve¥¢¥ë¥Õ¥¡Ãͤζ­³¦¤Ë¥°¥é¥Ç¡¼¥·¥ç¥ó¤¬¤«¤«¤ë¤è¤¦¤Ë¤·¤Æ¤¢¤ê¤Þ¤¹ ¥¹¥é¥¤¥À¡¼¤òÃæ¿´¤«¤é±¦¤Ë¤º¤é¤¹¤È²Ã»» º¸¤Ë¤º¤é¤¹¤È¾è»»¤Ç¥°¥é¥Ç¡¼¥·¥ç¥ó¤Ï¥Æ¥¯¥¹¥Á¥ã¤Ç¥³¥ó¥È¥í¡¼¥ë¤·¤Æ¤¤¤Þ¤¹¡£ º¸Â¦¤¬³°¡Ê¥¢¥ë¥Õ¥¡ÃͤÎÄ㤤Êý¡Ë¤Î£±Dɽ¸½¤Ç¤¹¤Î¤ÇVÊý¸þ¤Î¥µ¥¤¥º¤Ï¤¤¤¯¤Ä¤Ç¤â¹½¤¤¤Þ¤»¤ó

clip(tex2D (_SliceGuide, i.texcoord_orig).rgb - AbsSliceAmount );

¥«¥Ã¥È¥¢¥¦¥È¥¢¥ë¥Õ¥¡¤Î ¤·¤­¤¤ÃÍ»ØÄê¤ÏClip´Ø¿ô¤òÍѤ¤¤Æ¤¤¤Þ¤¹¤¬ ¥°¥é¥Õ¥£¥Ã¥¯¥«¡¼¥É¡Ê¥â¥Ð¥¤¥ë¤Ê¤É¡Ë¤Ë¤è¤Ã¤Æ¤Ï»ÈÍѤǤ­¤Ê¤¤¤³¤È¤¬¤¢¤ë¤è¤¦¤Ç¤¹¡£ ¤½¤Î¾ì¹ç¤ÏAlphaTest ¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£

 Unity - ShaderLab syntax- Alpha testing

 

 

Êä­¡ä

¥·¥§¡¼¥ÀÆâ¤ÇifÌ¿Îá¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£ ¥·¥§¡¼¥À¡¼¤Ç if ~else¹½Ê¸¤Ï»ÈÍѤǤ­¤Þ¤¹¤¬ ifÌ¿Îá¤Ï¼Â¹Ô®ÅÙ¤¬¤¢¤Þ¤êÁ᤯¤¢¤ê¤Þ¤»¤ó¡£ ¡ÊÍýͳ¤Ï¡Ö SIMD ¡×¤Ç¸¡º÷¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡Ë

¥Ô¥¯¥»¥ë¥·¥§¡¼¥À¡Ê¥Õ¥é¥°¥á¥ó¥È¥·¥§¡¼¥À¡Ë¤Çʬ´ô½èÍý¤ò¤ª¤³¤Ê¤¦¤È¥¹¥¯¥ê¡¼¥óɽ¼¨¥Ô¥¯¥»¥ëʬ¤À¤±Ê¬´ôÌ¿Îá¤Î½èÍý¤ò¤¹¤ëɬÍפ¬¤¢¤ê¥·¥§¡¼¥À¼«ÂΤ¬¤È¤Æ¤â½Å¤¯¤Ê¤ê¤Þ¤¹¡£¤½¤Î¾ì¹çShadowGun¤Î¥µ¥ó¥×¥ë¤Ë¸«¤é¤ì¤ë¤è¤¦¤Ë ĺÅÀ¥·¥§¡¼¥À¤Ë·×»»Éôʬ¤ò°Üư¤·¤Æ¤·¤Þ¤¦ÊýË¡¤¬¤Þ¤º¤Ò¤È¤Ä¤ÎÊýË¡¤Ç¤¹¡£ ¡ÊĺÅÀ¥·¥§¡¼¥À¤ÏĺÅÀ¿ôʬ¤À¤±·×»»¤¬¹Ô¤ï¤ì¤Þ¤¹¤¬ ¥Ô¥¯¥»¥ë¥·¥§¡¼¥À¤Ï¥Ô¥¯¥»¥ë¿ôʬ¤À¤±¤Î·×»»Î̤ˤʤ뤿¤á¡Ë

 

¤½¤Î¤Û¤« ifÌ¿Îá¤ò ɸ½à¤Î¥·¥§¡¼¥À¡¼´Ø¿ô¤ÇÃÖ¤­´¹¤¨¤Æ¤·¤Þ¤¦¤³¤È¤ÇºÇŬ²½¤ò¤Ï¤«¤ëÊýË¡¤â¤¢¤ê¤Þ¤¹

Î㣱¡Ë

¤³¤ì¢­¤ò

if  (distance > _Value) { cfinal = c2; } 
else cfinal = c;

 

¤³¤Î¢­¤è¤¦¤Ë

v = max(0,sign(distance  -  _Value))  
cfinal = lerp(c, c2, v);

Èæ³Ó¤·¤¿¤¤£²¤Ä¤ÎÃͤκ¹Ê¬¤òsign¤Ç¡ÊÉé or 0 or Àµ¡Ë ¤ò¡Ê¡Ý£± or £° or £±¡Ë¤ÎÃͤËÊÑ´¹¤·¤Æ

max¤Ç£°¤«£±¤ÎÃÍ¤Ë¤Þ¤È¤á¤Æ leap¡Êa, b, val¡Ë ¡Öval=0¤Î¤È¤­a val=b¤Î¤È¤­b ¤ò¤È¤ë´Ø¿ô¡× ¤ò»ÈÍѤ·¤Æ

Ãͤò³ä¤êÉÕ¤±¤Þ¤¹

¢¨ £ö¤Ï£°¤Þ¤¿¤Ï£±¤ò¤È¤ë¥Ö¡¼¥ê¥¢¥ó·¿ÁêÅö¤ÎÃͤò¤È¤ì¤Ð¤è¤¤¤Î¤Ç int¡¢uint·¿¤Ê¤É¤ÇÂåÍѤ·¤Þ¤¹

 

Î㣲¡Ë

fixed mixFactor = saturate(1 - ((distance - _ColorDecay) / _FadeDistance + 1) * 0.5);

cfinal = lerp(c, c2, mixFactor);

 

Îã¤Î¤è¤¦¤Ë ·×»»¤ÎÃͤòsaturate()¤ò»ÈÍѤ·¤ÆÃͤò0~£±¤ÎÈϰϤˤ¿¤¿¤ó¤Ç¤·¤Þ¤¦¤è¤¦¤Ë¤¹¤ì¤Ð¤è¤¤¤«¤È»×¤¤¤Þ¤¹

shader if else performance - Unity Answers

SIMD - Wikipedia, the free encyclopedia

 

¡üFlowMap_Filter

image3

FlowMap¤È¤¤¤¦¥Æ¥¯¥¹¥Á¥ã¤òÍѤ¤¤Æ¿åÌ̤ʤɤò¥¢¥Ë¥á¡¼¥·¥ç¥ó¤µ¤»¤ëÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£

¹Í¤¨Êý¤ÏNormalMap¤È¾¯¤·»÷¤Æ¤¤¤Þ¤¹¤¬ NormalMap¤¬¥«¥é¡¼¥Ç¡¼¥¿¤ò»ÈÍѤ·¤ÆË¡Àþ¤Î·¹¤­¤ò

Í¿¤¨¤ë¤Î¤ËÂФ·¤ÆFlowMap¤Ï¥Æ¥¯¥¹¥Á¥ãUVºÂɸ¤ËÊѰ̤òÍ¿¤¨¤Þ¤¹¡£


¾Ü¤·¤¯¤Ï¥ê¥ó¥¯Àè¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤
https://www.dropbox.com/s/ii2x077vj64lyhl/Water%20Flow%20For%20UDK.pdf

image8 flowsheet1

 


float2 flowmap = tex2D( _FlowMap, uv ).rg * 2.0 - 1.0;

¥Æ¥¯¥¹¥Á¥ã¤Î¥¢¥ó¥Ñ¥Ã¥¯²½¤Ï¤³¤Î¤è¤¦¤Ê¼°¤Ç¹Ô¤ï¤ì¤Þ¤¹
flowmap¥Æ¥¯¥¹¥Á¥ã¤«¤é£ò¤È£ç¤ÎÀ®Ê¬¤òÆÉ¤ß¤À¤·¤Æ ¥«¥é¡¼¤ÎÃÍ0~£±¤ÎÈϰϤò -1~1¤Ë³ÈÄ¥¤·¤Æ¤¤¤Þ¤¹¡£
¥Æ¥¯¥¹¥Á¥ãÃæ¿´¤«¤é¥Ù¥¯¥È¥ëUVÊý¸þ¤Ë-1 ~ +1 ¤È¤Ê¤ë¤è¤¦¤Ë²Ã¹©¤·¤¿¤Û¤¦¤¬»È¤¤¾¡¼ê¤¬Îɤ¤¤Î¤Ç

image9


¤³¤Î¤è¤¦¤Ê·Á¤Î¼°¡ÊÆÍÁ³¿ôÃͤòÁý¸º¤·»Ï¤á¤ë¡Ë¤¬½Ð¤Æ¤­¤¿¤é ÃͤòÄ´À°¤·¤Æ¤¤¤ëÉôʬ¤À¤È¹Í¤¨¤Æ¤¤¤¤¤«¤È»×¤¤¤Þ¤¹¡£ ¿ʬ


¤½¤Î¾ ¿åÌ̤òɽ¸½¤¹¤ë¾ì¹çFlowMap¤ò»ÈÍѤ·¤ÆNormalMap¤Î¹çÀ®¤Ê¤É²Ã¹©¤ò¤ª¤³¤Ê¤¦¾ì¹ç¤Ë¤Ï°Ê²¼¤Î¤è¤¦¤Êµ­½Ò

ALGOholic ? A Coder's Blog - Another Flow Field Editor Update

 

    phase0 = cycleOffset * 0.5 + FlowOffset0;

    phase1 = cycleOffset * 0.5 + FlowOffset1;

    float3 norm0 = tex2D(NormTex0, (Uv * ¥¿¥¤¥ê¥ó¥°¿ô) + flowmap * phase0);

    float3 norm1 = tex2D(NormTex1, (Uv * ¥¿¥¤¥ê¥ó¥°¿ô) + flowmap * phase1);

VFX_Flowmap

º¸Â¦FlowMap¤ò»ÈÍѤ·¤Æ Leap0»þ¡Ê¥Æ¥¯¥¹¥Á¥ã¤Þ¤Þ¡Ë¡§Leap1¡Ê¥ª¥Õ¥»¥Ã¥ÈÊѰ̣±£°£°¡ó¡Ë




 

 

¡üVertexModify

FlowMap2

º£²ó¤Ï¥Æ¥¯¥¹¥Á¥ã¤ÎÃͤò»ÈÍѤ·¤Æ¥á¥Ã¥·¥åĺÅÀ¤ò¥¢¥Ë¥á¡¼¥·¥ç¥ó¤µ¤»¤Æ¤¤¤Þ¤¹

ĺÅÀ¤Î¥¢¥Ë¥á¡¼¥·¥ç¥ó¤òÀ©¸æ¤·¤Æ¤¤¤ë¤Î¤Ï¤³¤Î¹Ô¤Ç¤¹

half2  VertexFlowUV= TRANSFORM_TEX( v.texcoord,  _VertexFlowTex);

half3  VertexFlowVec = tex2Dlod (_VertexFlowTex, float4(VertexFlowUV.xy,0,0)).rgb * 2.0-1.0;

 

o.vertex.xyz += VertexFlowVec.xyz * _VertexFlowAmount;

TRANSFORM_TEX ¤Ï¥Æ¥¯¥¹¥Á¥ãUV¤ÎÃͤò   _VertexFlowTex_ST  ¤ÇÀßÄꤵ¤ì¤ëÃͤËUV¥¿¥¤¥ê¥ó¥°ÃͤÈ

¥ª¥Õ¥»¥Ã¥È¤òºÆ·×»»¤µ¤»¤ëUnity¤Î¥Þ¥¯¥í´Ø¿ô¤Ç¤¹¡£

¥·¥§¡¼¥À¤Ë float4 ¡É¥Æ¥¯¥¹¥Á¥ã̾¡É_ST  ¤Èµ­½Ò¤¹¤ë¤³¤È¤Ç¥·¥§¡¼¥À¼Â¹Ô»þ¤ËÃͤ¬µ¢¤Ã¤Æ¤­¤Þ¤¹

¥Æ¥¯¥¹¥Á¥ã¥¹¥í¥Ã¥È¤È µ¢¤Ã¤Æ¤¯¤ëÃͤδط¸¤Ï²¼¿Þ¤Î¤È¤ª¤ê¤Ç¤¹

image4

¡É¥Æ¥¯¥¹¥Á¥ã̾¡É_ST .xy           =   TilingÃÍ UVÊý¸þ¤Î¥¿¥¤¥ê¥ó¥°¿ô

¡É¥Æ¥¯¥¹¥Á¥ã̾¡É_ST .wz          = OffsetÃÍ UVÊý¸þ¤Î¥ª¥Õ¥»¥Ã¥ÈÃÍ

UV.xy = TRANSFORM_TEX ( v.texcoord,  _MainTex );

¤³¤ì¤ò¥Þ¥¯¥í¤ò»ÈÍѤ·¤Ê¤¤¤Çµ­½Ò¤¹¤ë¤È

UV.x  =  v.texcoord.x  * _MainTex_ST.x +_MainTex_ST.z;
UV.y  =  v.texcoord.y  * _MainTex_ST.y +_MainTex_ST.w;

¤È¤Ê¤ê¤Þ¤¹¡£

 

vertex¥·¥§¡¼¥ÀÆâ¤Ç¥Æ¥¯¥¹¥Á¥ã¤ò»²¾È¤¹¤ë¾ì¹ç¤Ï tex2D ¤ÎÂå¤ï¤ê¤Ë tex2Dlod ¤ò»ÈÍѤ·¤Þ¤¹¡£

tex2Dlod¡Ê ¥Æ¥¯¥¹¥Á¥ã, float4¡ÊUÃÍ, VÃÍ, 0, w ¡á¡Ê lod ÃͤλØÄ꣰~£· ¡Ë¡Ë

¤³¤ì¤Ï ¥Æ¥¯¥¹¥Á¥ãlod¤ÎÃͤ¬depthÃ͡ʥ«¥á¥é¤«¤é¤Îµ÷Î¥¡Ë¤Ë¤è¤Ã¤Æ·èÄꤵ¤ì¤ë¤¿¤á depthÃͤ¬vertex¥·¥§¡¼¥À¤Ç¥á¥Ã¥·¥å¤Î¥½¡¼¥È¤¬²ò·è¤µ¤ì¤ÆPixel¥·¥§¡¼¥À¤Ë¥Ç¡¼¥¿¤¬ÅϤë¤È¤­¤Ë·×»»¤¬¹Ô¤ï¤ì¤ë¤Î¤Ç vertex¥·¥§¡¼¥ÀÆâ¤Ç¤Ïlod¤Î¼«Æ°³ä¤êÅö¤Æ¤¬½ÐÍè¤Ê¤¯¤Ê¤ê ľÀÜlodÃͤò»ØÄꤷ¤Æ¤¢¤²¤ëɬÍפ¬¤¢¤ë¤«¤é¤Ç¤¹¡£

¢¨ Tex2Dlod´Ø¿ô¤Ï¤È¤Æ¤âÌòΩ¤Ä¤Î¤Çº£¸å¤â¤È¤ê¤¢¤²¤Æ¤¤¤¯Í½Äê¡£

image7

ºÇ¸å¤Ë ĺÅÀ¥Ç¡¼¥¿£ø£ù£ú¤Ë¥«¥é¡¼¥Ç¡¼¥¿¤ò-1~+1ÈϰϤ˲ù©¤·¤¿¤â¤Î¤ò²Ã»»¤·¤Þ¤¹ ÊѲ½Î¨¤ò¥³¥ó¥È¥í¡¼¥ë¤Ç¤­¤ë¤è¤¦¤Ë

_VertexFlowAmount ¤È¤·¤Æ³Ý¤±¤Æ¤¢¤²¤Þ¤¹¡£

 

o.vertex.xyz += VertexFlowVec.xyz * _VertexFlowAmount;

 

ĺÅÀ¥¢¥Ë¥á¡¼¥·¥ç¥ó¤È¤¤¤¦¤È»°³Ñ´Ø¿ô¤ò»ÈÍѤ·¤¿¤â¤Î¤¬Â¿¤¤¤Ç¤¹¤¬ ¥Æ¥¯¥¹¥Á¥ã¥Ç¡¼¥¿¤ò»ÈÍѤ·¤¿¥¢¥Ë¥á¡¼¥·¥ç¥ó¤Ï

¥Æ¥¯¥¹¥Á¥ã¥Ç¡¼¥¿¤ò¸Æ¤Ó½Ð¤·¤Æ´Êñ¤Ê·×»»¤ò¹Ô¤¦¤À¤±¤Ê¤Î¤Ç½Å¤¿¤¤»°³Ñ´Ø¿ô¤Û¤ÉÉé²Ù¤â¤Ê¤¯Ê£»¨¤Ê¥¢¥Ë¥á¡¼¥·¥ç¥ó¤â¸«¤¿Ìܤǥ³¥ó¥È¥í¡¼¥ë¤Ç¤­¤ë¤Î¤Ç±þÍѤ¬¤¢¤ê¤½¤¦¤Ç¤¹¡£ ¤Û¤«¤Ë¤Ï¥¹¥¯¥ê¥×¥È¤ËÉÔ´·¤ì¤Ê¥Ç¥¶¥¤¥Ê¡¼¤Ë¤È¤Ã¤Æ¤â¥Æ¥¯¥¹¥Á¥ã¤òÆþ¤ìÂØ¤¨¤ë¤À¤±¤Ç°·¤¤¤ä¤¹¤¤¤È¤¤¤¦¥á¥ê¥Ã¥È¤â¤¢¤ë¤È»×¤¤¤Þ¤¹¡£

 

 

¡üCOLOR_Collect_Filter

¤ª¤Þ¤±µ¡Ç½  ¿§Ä´À°µ¡Ç½¤Ç¤¹ ¥Í¥Ã¥È¤Ç¸ø³«¤µ¤ì¤Æ¤¤¤¿¥Õ¥©¥È¥·¥ç¥Ã¥×¤Îµ¡Ç½¤ò¥·¥§¡¼¥À¤Çµ­½Ò¤·¤¿´Ø¿ô¤ò

¤½¤Î¤Þ¤Þ»ÈÍѤ·¤Æ¤¢¤ê¤Þ¤¹¡£

¤½¤Î¾¥«¥é¡¼¥³¥ó¥È¥í¡¼¥ë¤Î¥·¥§¡¼¥À¡¼¥µ¥ó¥×¥ë¤ÏnVidia¤Î¸ø¼°¥µ¥¤¥È¤ò»²¾È¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£

NVIDIA Shader Library

¡ÖBright ¤È Luminosity¡×¡ÖSaturate ¤È Saturation¡×¤ÎÊÑ¿ô¤¬¥À¥Ö¤Ã¤Æ¤¤¤ë¤Î¤Ç¤¹¤¬ ¤É¤Á¤é¤«ÊÒÊý¤·¤«¼ÂÁõ¤·¤Ê¤¤¤È ¥³¥ó¥È¥í¡¼¥ë¤¬Æñ¤·¤«¤Ã¤¿¤¿¤á ξÊýµ­½Ò¤·¤Æ¤¢¤ê¤Þ¤¹¡£¡ÊÄ´À°¤Ë¤¢¤Þ¤ê»þ´Ö¤â³Ý¤±¤¿¤¯¤Ê¤«¤Ã¤¿¤â¤Î¤Ç..¡Ë

Bright ¤È Contrast ¤Ï¾å¤²²á¤®¤ë¤È¿§Èô¤Ó¤·¤Þ¤¹¤Î¤Ç Saturate¤ò²¼¤²¤Æ¥Ð¥é¥ó¥¹¤òÀ°¤¨¤Æ¤ë¤ÈÎɤ¤¤è¤¦¤Êµ¤¤¬¤·¤Þ¤¹¡£ Contrast¤Ï¥¢¥ë¥Õ¥¡Éôʬ¤Î¥«¥é¡¼¤¬»ý¤Á¾å¤¬¤ê¤¹¤®¤òËɤ°¤Î¤ËÍ­¸ú¤Ç¤¹¡£

¥«¥é¡¼¥»¡¼¥ÕŪ¤Ê°ÂÁ´ÁõÃÖ¤ò¤Ä¤±¤Æ¤âÎɤ¤¤Î¤Ç¤¹¤¬ ¥¨¥Ç¥£¥¿¤Ë¤¯¤»¤¬¤¢¤ë¤È»È¤¤¤Ë¤¯¤¯¤Ê¤ë¤Î¤Ç¼«Í³¤Ë¥«¥¹¥¿¥Þ¥¤¥º¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£

 

CC_Bright :ÌÀÅÙ CC_Saturate  :ºÌÅÙ CC_Contrast   :¥³¥ó¥È¥é¥¹¥È


CC_Hue :¿§Áê CC_Saturation  :ºÌÅÙ£² CC_Luminosity  :ÌÀÅÙ£²

image10

 

¢£¥Æ¥¯¥¹¥Á¥ã¤Î¥¢¥Ë¥á¡¼¥·¥ç¥ó

²áµîµ­»ö¤òÆÉ¤ó¤Ç¤¤¤¿¤À¤¯¤«¥ê¥ó¥¯Àè¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤

Animating Tiled texture - Unify Community Wiki

 

 

¢£¥·¥§¡¼¥À¡¼¤Ë´Ø¤¹¤ë¤½¤Î¤Û¤«¤Î¤ªÏÃ

 

¢£Unity Shaders and Effects Cookbook [KindleÈÇ]

Kenneth Lammers (Ãø)

Unity Shaders and Effects Cookbook

 

³Æ½ê¤ÇÈó¾ï¤Ëɾ²Á¤Î¹â¤¤Ëܽñ ±Ñ¸ìÈǤǤ¹¤±¤É¥³¡¼¥ÉÉôʬ¤À¤±¤Ê¤¬¤á¤Æ¤â ¤ï¤ê¤Èʬ¤«¤ê¤ä¤¹¤¤¤Î¤Ç¤Ï¤Ê¤¤¤«¤Ê¤È»×¤¤¤Þ¤·¤¿ ¥ê¥ó¥¯À袭 ¤ÎWiki¤â¹ç¤ï¤»¤ÆÆÉ¤à¤È Íý²ò¤¬¿¼¤Þ¤ë¤«¤â¤·¤ì¤Þ¤»¤ó

Cg Programming-Unity - Wikibooks, open books for an open world

¤è¤¯¥ê¥ó¥¯¤µ¤ì¤Æ¤¤¤ëGL¥Ð¡¼¥¸¥ç¥ó¤Ç¤Ï¤Ê¤¯CG¥Ð¡¼¥¸¥ç¥ó¤Î¤Û¤¦¤Ç¤¹¤Í¡££³D¥½¥Õ¥È¤Ç³«È¯¤¹¤ë¾ì¹çºÇ¶á¤À¤ÈCGFX¤ËÂбþ¤·¤Æ¤¤¤ë¤³¤È¤¬Â¿¤¤¤Î¤Ç CGFX¤Ë»÷¤¿CG¤Ç¥·¥§¡¼¥À¡¼¤ò½ñ¤¤¤Æ¤ª¤¯¤È¤¤¤í¤¤¤íĽ¤ê¤Þ¤¹¡£

 

 

¢£Shader Forge - A visual, node-based shader editor plugin for Unity

Shader Forge - A visual, node-based shader editor

¸½ºß³«È¯Ãæ¤é¤·¤­ ¥Õ¥ê¡¼¡©¤Î¥Î¡¼¥É¥Ù¡¼¥¹¥·¥§¡¼¥À¡¼¥¨¥Ç¥£¥¿¡¼¡£ ¥í¡¼¥É¥Þ¥Ã¥×¤ò¸«¤ë¤È¤Þ¤À¤³¤ì¤«¤é¤Î¤è¤¦¤Ç¤¹¤¬UIɽ¼¨¤¬UDK¤Î¥Þ¥Æ¥ê¥¢¥ë¥¨¥Ç¥£¥¿¡¼¤Ë»÷¤¿´¶¤¸¤Ç¥¢¥¤¥³¥óɽ¼¨¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤Î¤Ï¤ï¤«¤ê¤ä¤¹¤¯¤ÆGood¤Ç¤¹¡£

¤¿¤À¸«¤¿ÌܤδÊÊØ¤µ¤È΢ʢ¤Ë ¥Î¡¼¥É¥Ù¡¼¥¹·¿¤Ã¤ÆÊ£»¨¤Ê¥·¥§¡¼¥À¤¬ºî¤ê¤Ë¤¯¤¤¤ó¤Ç¤¹¤è¤Í ÅǤ¤¤Æ¤¯¤ë¥³¡¼¥É¤ò¼ÂÁõ¤Ç¤­¤ë¤Þ¤ÇºÇŬ²½¤¹¤ë¤Î¤¬°ì¶ìÏ«¤À¤Ã¤¿¤ê¤·¤Æ º£¤Î¤È¤³¤í¥Æ¥­¥¹¥È¥¨¥Ç¥£¥¿¤·¤«¤Ä¤«¤Ã¤Æ¤Ê¤«¤Ã¤¿¤ê£÷ ¤¤¤¤¤â¤Î¤Ë¤Ê¤ë¤È¤¤¤¤¤Ê

 

¢£»²¾È¥ê¥ó¥¯¤Ê¤É

View Profile- TheJamsh - Epic Games Forums

How Do You Make a Flow Map- [Archive] - Polycount Forum

Flow Map Painting Script - Early Alpha - Polycount Forum

 

 

ParticleTest

https://dl.dropboxusercontent.com/u/18978109/ParticleTest/ParticleTest.html

 

 

¤º¤¤¤Ö¤ó¤È¹¹¿·¤Î´Ö¤¬³«¤¤¤Æ¤·¤Þ¤¤¡¡¤ªÂÔ¤Á¤¤¤¿¤À¤¤¤¿Êý¤Ë¤Ï¿½¤·Ìõ¤Ê¤¤¤Ç¤¹¡£

 

º£²ó¤ÏDX11¤ò»ÈÍѤ·¤¿¥Ñ¡¼¥Æ¥£¥¯¥ëÉÁ²è¤Î¥µ¥ó¥×¥ë¤òµ­»ö¤Ë¤·¤Æ¤ß¤Þ¤·¤¿¡£¡¡

ºÇ¶áÏÃÂê¤Î¡©GPGPU¥³¥ó¥Ô¥å¡¼¥Æ¥£¥ó¥°¡¡¤Þ¤À¸«¤ÌPS4¤ä¤éXBOXOne¤È¤¤¤Ã¤¿¼¡À¤Â嵡¤Ê¤É¤Ç¼çÎϤˤʤë¤Ç¤¢¤í¤¦GPU¤ò»ÈÍѤ·¤¿·×»»¤Ç¤¹¤Í¡£

GPGPU ¡ÊÈÆÍÑÌÜŪ¤ÎGPU·×»»½èÍý¡Ë¤Ï¥·¥§¡¼¥À¡¼¥×¥í¥°¥é¥à¤ò»ÈÍѤ·¤¿¡¡ÉÁ²è¤ò´Þ¤à¿ÍÑÅӤʷ׻»½èÍý¤Î¤³¤È¤Ç¤¹¡£

GPU¤ÎÉâÆ°ÅÀ¾¯¿ô·×»»¤Ë¶¯¤¤ÅÀ¤ä¥Þ¥ë¥Á¥¹¥ì¥Ã¥ÉÂбþ¤Ê¤É¤ÎÍøÅÀ¤òÀ¸¤«¤·¤ÆCPU¤Î½èÍýÉé²Ù¤ò·Ú¸º¤¹¤ë¤³¤È¤Ç

¼Â¹Ô®ÅÙ¤ò¸þ¾å¤µ¤»¤ë¤³¤È¤¬¼ç´ã¤Ç¤¹¡£

 

¤¤¤Þ¤Î¤È¤³¤íDX11¤ò¥µ¥Ý¡¼¥È¤·¤¿²ÈÄíÍÑPC¤¬»Ô¾ì¤Ë¹­¤¯¹Ô¤­ÅϤë¤Î¤Ï2ǯ¼å¤«¤Ê¤¢¤È¸«ÀѤâ¤Ã¤Æ¤¤¤ë¤Î¤Ç¤¹¤¬¡¢¡¡³«È¯´ü´Ö¤ò¹Í¤¨¤ë¤È

¤½¤í¤½¤íÊÙ¶¯¤·¤Æ¤ª¤«¤Ê¤¤¤ÈÃÖ¤¤¤Æ¤±¤Ü¤ê¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¤¤½¤¦¤Ê¤Î¤Ç¡¢¤³¤ì¤òµ¡²ñ¤ËÊÙ¶¯¤·¤Æ¤ß¤Æ¤Ï¤¤¤«¤¬¤Ç¤·¤ç¤¦¡£

 

º£²ó¤Î¥µ¥ó¥×¥ë¤Î¼Â¹Ô¿ôÃͤϥΡ¼¥ÈPC¤Ç¡¡¡ÊCorei7-2630¡Ê2Ghz)¡¡GeforceGT540M¡Ë¡¡

¥Ñ¡¼¥Æ¥£¥¯¥ë¿ô70Ëü¤Ç¡¡70FPSÁ°¸å¤Ç¤·¤¿¡¡Ä¾ÀÜVRAM¤Ë¥Ç¡¼¥¿¤ò½ñ¤­¹þ¤à¤Î¤Ç¥É¥í¡¼¥³¡¼¥ë¤Ï£±¤Ç¤¹¡£

¥¹¥Ú¥Ã¥¯¤Ï´Ä¶­¤Ë¤è¤Ã¤Æ¤«¤Ê¤êº¹¤¬½Ð¤ë¤È»×¤¤¤Þ¤¹¤Î¤Ç¡¢¤½¤ì¤¾¤ì¤Î´Ä¶­¤Ë¹ç¤ï¤»¤ÆºÇŬÃͤòÀßÄꤷ¤Æ¤¯¤À¤µ¤¤¡£

 

µ­»öÆâ¥ê¥ó¥¯Àè¤Ë¥³¥ó¥Ô¥å¡¼¥È¥·¥§¡¼¥À¤ò»ÈÍѤ·¤¿¥Ñ¡¼¥Æ¥£¥¯¥ë¥ì¥ó¥À¥ê¥ó¥°¤Î¥µ¥ó¥×¥ë¤È ¼Â¹Ô½èÍý®ÅÙ¤ÎÈæ³Óɽ¤¬·ÇºÜ¤µ¤ì¤Æ¤¤¤Þ¤¹¤¬¡¢¥³¥ó¥Ô¥å¡¼¥È¥·¥§¡¼¥À¤ò»ÈÍѤ¹¤ì¤Ð¤Ê¤ó¤Ç¤â¹â®¤Ë½èÍý¤Ç¤­¤ë¤«¤È¤¤¤¦¤È¤½¤¦¤¤¤¦¤ï¤±¤Ç¤â¤Ê¤¯ ¥³¥ó¥Ô¥å¡¼¥È¥·¥§¡¼¥À¤Ë¸þ¤¤¤¿½èÍý¤ä¥Ç¡¼¥¿¹½Â¤¤ò¹©Éפ¹¤ë¤³¤È¤Ç½èÍý®Å٤θþ¾å¤¬´üÂԤǤ­¤ë¤È¤¤¤¦¤³¤È¤ß¤¿¤¤¤Ç¤¹¤Í

GDC¤Ê¤É¤Çȯɽ¤µ¤ì¤Æ¤¤¤ëÆâÍÆ¤Ç¤Ï ήÂη׻»¡¢ÊªÍý±é»»¡¢¥¹¥­¥ó¥·¥§¡¼¥Ç¥£¥ó¥°¡¢¥Ý¥¹¥È¥¨¥Õ¥§¥¯¥È¡¢AI ¤Ê¤É

ÉÁ²è½èÍý¤Î¹â®²½°Ê³°¤Ë¤â¥³¥ó¥Ô¥å¡¼¥È¥·¥§¡¼¥À¤ò»ÈÍѤ·¤¿ÍÍ¡¹¤ÊÍÑÅÓ¤¬¤¢¤ê¤½¤¦¤Ç¤¹¡£

 

¤Á¤Ê¤ß¤Ë¥³¥ó¥Ô¥å¡¼¥È¥·¥§¡¼¥À¤âGPU¤Î¥·¥§¡¼¥À¤Ê¤Î¤Ç¥·¥§¡¼¥ÀÍÑ´Ø¿ô¤·¤«ÍѰդµ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¡¡É¬Íפʴؿô¤Ï¼«ºî¤¹¤ë¤«¥é¥¤¥Ö¥é¥ê¤òήÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£

DirectX11̤¥µ¥Ý¡¼¥È¤ÎGPU¤Ç¥·¥§¡¼¥À¤Ë·×»»¤µ¤»¤¿¤¤¾ì¹ç¤Ï¥³¥ó¥Ô¥å¡¼¥È¥·¥§¡¼¥À¤Î·×»»Éôʬ¤ò¥ì¥ó¥À¥ê¥ó¥°ÍѤΥ·¥§¡¼¥À¤Ë°Ü¿¢¤·¤Æ¡¡¥Ð¥Ã¥Õ¥¡¥á¥â¥ê¤ÎÂå¤ï¤ê¤Ë¥Æ¥¯¥¹¥Á¥ã¤ò¥á¥â¥êÂå¤ï¤ê¤Ë»È¤¦¤³¤È¤ÇGPU¤Ç·×»»¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¾ì¹ç¥Ù¥¯¥È¥ëxyzw¤ò¡¡¥«¥é¡¼rgba¡¡¤ÈÃÖ¤­´¹¤¨¤Æ·×»»¤µ¤»¤Æ¤¯¤À¤µ¤¤¡£¡¡¥Þ¥ë¥Á¥¹¥ì¥Ã¥É·×»»¤Î²¸·Ã¤Ï¸º¤Ã¤Æ¤·¤Þ¤¤¤Þ¤¹¤¬GPU¤Ç¤Î·×»»¤Ï½½Ê¬Â®¤¤¤Î¤ÇCPU·×»»¤Ç¼Â¹Ô®Å٤Υͥ寤ˤʤꤽ¤¦¤ÊÉé²Ù¤Î·Ú¸º¤¬´üÂԤǤ­¤Þ¤¹¡£

 

º£¸å¤ÎŸ˾¤È¤·¤Æ¤Ï¡¡¥é¥¤¥Õ¡¢¥³¥ê¥¸¥ç¥ó¡¢½ÅÎÏ¡¢¥Õ¥©¡¼¥¹¡¢¥Î¥¤¥º¡Ê¥«¡¼¥ë¥Î¥¤¥º¡¢SPH¡¢FFT¡¡¤Ê¤É¡Ë¤Î¥Ñ¥é¥á¡¼¥¿¤ò¼ÂÁõ¤·¤Æ¤¤¤¯¤³¤È¤Ç¡¡¥Ñ¡¼¥Æ¥£¥¯¥ë¥·¥¹¥Æ¥à¤È¤·¤Æ¼ÂÍÑŪ¤Ê¤â¤Î¤Ë¤Ê¤ë¤Î¤Ç¤Ï¤Ê¤¤¤«¤È»×¤¤¤Þ¤¹¡£

 

 

¤È¤¤¤¦¤³¤È¤Ç¤½¤ì¤¾¤ì¹©Éפ·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¤Ê¡¡¡¡¡¡¡¦¡¦¡¦¤È¤¤¤¦Åꤲ¤Ã¤Ñ¤Ê¤·¡Ê¾Ð¡¡

 

¢£º£²ó»²¹Í¤Ë¤·¤¿¥ê¥ó¥¯

Compute Shaders

Unity 4.0¡§ Compute Shader¤ò»È¤Ã¤Æ¤ß¤ë 

DirectX¤ÎÏà Âè108²ó - ¤â¤ó¤·¤ç¤ÎÁã·ê

Compute Shader Overview (Windows)

¤Û¤«¤Ë¤â»²¹Í¤Ë¤·¤¿¤È¤³¤í¤¬¤¢¤Ã¤¿¤Î¤Ç¤¹¤¬ ¤¤¤Ä¤Î´Ö¤Ë¤«¤Î¥ê¥ó¥¯ÀÚ¤ì¤ÇÄÉÀפǤ­¤Þ¤»¤ó¤Ç¤·¤¿¡£

¤Ê¤Î¤ÇÉÔÌÀ¤ÊÅÀ¤¬¤¢¤ì¤Ð¤Û¤«¤Î¾Ü¤·¤¤¥µ¥¤¥È¤µ¤ó¤òõ¤¹¤« ¤³¤Îµ­»ö¤Î¥³¥á¥ó¥ÈÍó¤Ë¼ÁÌä¤òÅꤲ¤Æ¤¯¤À¤µ¤¤¡£

 

 

¢¨¥¹¥¯¥ê¥×¥È̾¤¬°ã¤Ã¤Æ¤¤¤Þ¤¹¤¬¡¡¥¤¥ó¥¹¥Ú¥¯¥¿¡¼¤Ø¤ÎÀßÃ֤Ϥ³¤Î²èÁü¤ò»²¹Í¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£

inspector

 

 

¢£¥ì¥ó¥À¥ê¥ó¥°¥·¥§¡¼¥À¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡

 

[maxvertexcount(4)] // ¥¸¥ª¥á¥È¥ê¥·¥§¡¼¥À¤Ç»ÈÍѤ¹¤ëĺÅÀ¿ô¤ò»ØÄê ¡ä º£²ó¤Ï£´ÄºÅÀ¤Ê¤Î¤Ç£´¤ò»ØÄê
void geom (point vs_out input[1], inout TriangleStream outStream)
{


gs_out output;

float4 corLoc = mul(UNITY_MATRIX_MVP, input[0].pos);

// ¥Ñ¡¼¥Æ¥£¥¯¥ëºÂɸ¥Ç¡¼¥¿¤òMVP¡Ê¥Ó¥å¡¼ºÂɸ¡Ë¤ËÊÑ´¹ 

 

output.pos = corLoc + float4(-dx, dy,0,0);

output.uv=float2(0,0);
output.col = input[0].col;

outStream.Append (output);

// output.pos ¡ácorLoc¡Ê¥Ñ¡¼¥Æ¥£¥¯¥ë¥·¥¹¥Æ¥àÃæ¿´ºÂɸ¡Ë + float4¡Ê¥Ñ¡¼¥Æ¥£¥¯¥ëĺÅÀ º¸¾å¡Ë;

// output.uv ¡á float2(UVºÂɸ º¸¾å¡Ë;

// output.col ¡á input[0].col¡¨¡ÊĺÅÀ¥«¥é¡¼ º¸¾å¡Ë;

// outStream.Append (output);     //¥¹¥È¥ê¡¼¥à¤Ë£±ÄºÅÀʬ¤Î¥Ç¡¼¥¿¤ò½ÐÎÏ

 

//°Ê²¼ ±¦¾å¡¢º¸²¼¡¢±¦²¼¤Î½ç¤Ë ¥¹¥È¥ê¡¼¥à¤Ë½ÐÎÏ     ¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä

 

outStream.RestartStrip(); // ¥Ó¥ë¥Ü¡¼¥É¥á¥Ã¥·¥å¤ÎÉÁ²è


}

 

¥ì¥ó¥À¥ê¥ó¥°ÍѤΥ·¥§¡¼¥À¤ÏÄ̾ï¤Î¥·¥§¡¼¥À¤ÈÊѤï¤ê¤Þ¤»¤ó¤¬¹â®ÉÁ²è¤Î¤¿¤á¤ËÊѹ¹ÅÀ¤¬¤¢¤ê¤Þ¤¹

¡ü¥¸¥ª¥á¥È¥ê¥·¥§¡¼¥À¡¼¤Î»ÈÍÑ

¡üStructuredBuffer¤Î»ÈÍÑ

 

¥¸¥ª¥á¥È¥ê¥·¥§¡¼¥À¤Ï¥·¥§¡¼¥À¤ò»ÈÍѤ·¤ÆGPUÆâ¤Ç¥á¥Ã¥·¥å¤òÉÁ²è¤¹¤ë¤¿¤á¤Î¥·¥§¡¼¥À¤Ç¤¹¡£

ÂçÎ̤Υá¥Ã¥·¥å¤ÎĺÅÀ¥Ç¡¼¥¿¤òGPU¦¤ËÁ÷¤ë¤Î¤Ï½èÍý¸úΨ¤¬°­¤¤¤¿¤á¡¡¡¡¥Ñ¡¼¥Æ¥£¥¯¥ë¤ÎºÂɸ¥Ç¡¼¥¿¡Ê¥»¥ó¥¿¡¼ºÂɸ¡Ë ¤ä¥«¥é¡¼¥Ç¡¼¥¿¤Ê¤É¤ÎºÇ¾®¸Â¤Î¥Ç¡¼¥¿¤ò¥¢¥Ã¥×¥Ç¡¼¥È¤·¤Æ¥¸¥ª¥á¥È¥ê¥·¥§¡¼¥À¤Ç¥á¥Ã¥·¥å²½¤¹¤ë¤³¤È¤Ç½èÍý®Å٤θþ¾å¤ò¤¹¤ë¤³¤È¤¬´üÂÔ½ÐÍè¤Þ¤¹¡£¡¡¡¡¡¡ ¤Á¤Ê¤ß¤Ë¥¸¥ª¥á¥È¥ê¥·¥§¡¼¥À¤Ç°ìÅÙ¤ËÉÁ²è¤Ç¤­¤ëĺÅÀ¿ô¤Ï256¤Ç¤¹¡£

¡ü¤µ¤é¤ËStructuredBuffer¡Ê¥·¥§¡¼¥À¥â¥Ç¥ë5¡ËÆÉ¤ß½ñ¤­¤¬²Äǽ¤Ê¥Ð¥Ã¥Õ¥¡¡£¤ò »ÈÍѤ¹¤ë¤³¤È¤ÇCPU¡ÝGPU´Ö¤Ç¤Î¥Ç¡¼¥¿¤ä¤ê¤È¤ê¤¹¤ë»þ¥¹¥¯¥ê¥×¥È¤«¤é¹â®¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤¹¡£

¥·¥§¡¼¥À¡¼¥â¥Ç¥ë4¤Ë¤â cbuffer¡Ê¥³¥ó¥¹¥¿¥ó¥È¥Ð¥Ã¥Õ¥¡¡Ë¡¢tbuffer¡Ê¥Æ¥¯¥¹¥Á¥ã¥Ð¥Ã¥Õ¥¡¡Ë¤È¤¤¤¦»÷¤¿¤è¤¦¤Ê¥Ð¥Ã¥Õ¥¡¤¬

¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤¿¤Î¤Ç¤¹¤¬ ¥·¥§¡¼¥À¥â¥Ç¥ë5¤«¤éStructuredBuffer¤Ç¤½¤ì¤é¤ò¤Þ¤È¤á¤Æ°·¤¦¤³¤È¤¬¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿¤è¤¦¤Ç¤¹¡£

¹½Â¤ÂΤǤâÄê¿ô¤Ç¤â¤¤¤±¤ë¤Î¤Çº£¸å¤Ï¥³¥ì¤ò»È¤Ã¤Æ¤È¤¤¤¦¤³¤È¤Ê¤Î¤«¤Ê¡©¡¡

 

 

¢¨¡¡º£²ó¤Î¥µ¥ó¥×¥ë¤Ç¤Ï¥«¥á¥éÊý¸þ¤Ë¥Ó¥ë¥Ü¡¼¥É¤Î¥Õ¥§¡¼¥¹Ì̤ò¸þ¤±¤ë½èÍý¤ò¾Êά¤·¤Æ¤¢¤ê¤Þ¤¹

 

 

 

¢£¥³¥ó¥Ô¥å¡¼¥È¥·¥§¡¼¥À¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡

RWStructuredBuffer posBuffer : register(u0);

¥¹¥ì¥Ã¥É¤Ïº£²ó¤ÎÎã¤À¤È £±¼¡¸µÇÛÎó¤ò»ÈÍѤ¹¤ë¤Î¤Ç ¥¹¥ì¥Ã¥ÉID ¤Ïuint3·¿¤Ç ID.xyz¤Î¤¦¤Á¤Î£±¼¡¸µ¤ÎÍ×ÁÇID.x¤Ç»ØÄꤷ¤Þ¤¹

 

 

#pragma kernel CSMain

RWStructuredBuffer posBuffer : register(u0);

[numthreads(10,1,1)]
void CSMain (uint3 id : SV_DispatchThreadID)
{

¤³¤³¤Ç·×»»

¡ã¥¹¥ì¥Ã¥ÉID¤Ï £±¼¡¸µÇÛÎó¤ò»ÈÍѤ¹¤ë¾ì¹ç id.xyz ¤Î¤¦¤Á id.x ¤Ç»ØÄꤹ¤ë Îã¡§ posBuffer[id.x]¡ä
}

 

¼Â¹Ô¥«¡¼¥Í¥ë¤ÎÀë¸À¡¡¡¡¡¡#pragma kernel CSMain

¥¹¥¯¥ê¥×¥È¤«¤é¥³¥ó¥Ô¥å¡¼¥È¥·¥§¡¼¥À¤Î¥«¡¼¥Í¥ë¤Ë¼Â¹Ô¤ò»ØÄꤹ¤ë»þ¤Ë̾Á°¤ò»ØÄꤷ¤Þ¤¹

 

RWStructuredBuffer posBuffer : register(u0);

¹½Â¤ÂΤ¬»ÈÍѲÄǽ¤ÊÆÉ¤ß½ñ¤­²Äǽ¤Ê¥Ð¥Ã¥Õ¥¡¡¼

¥ê¥Õ¥¡¥ì¥ó¥¹¤Ë¤è¤ë¤È¡¡register ¡Ê¡Ë¤Ï¾Êά²Äǽ¤È¤¤¤¦²òÀ⤬¤µ¤ì¤Æ¤¤¤¿¤Î¤Ç¤¹¤¬¡¡¤Á¤ç¤Ã¤ÈÀµ³Î¤Ë¤Ï¤ï¤«¤ê¤Þ¤»¤ó

 

[numthreads(10,1,1)]
void CSMain (uint3 id : SV_DispatchThreadID)

numthreads ¤¬ Compute Shader 1²óʬ¤Î¥¹¥ì¥Ã¥É¤Î°ÕÌ£¤Ç¤¹¡£
¤³¤ÎÎã¤À¤È10*1*1¡¡=10¥¹¥ì¥Ã¥É¡¡¡¡¿ôÃͤϼ«Í³¤Ë³ä¤êÉÕ¤±¤é¤ì¤Þ¤¹¤¬·×»»Í×ÁǤΥ¹¥¿¥¤¥ë¤Ë±þ¤¸¤Æ

1¼¡¸µ¤«¤é3¼¡¸µ¤Þ¤Ç¤ÎID¤Ë¥¢¥¯¥»¥¹¤·¤ä¤¹¤¤¥µ¥¤¥º¤ò³ä¤êÉÕ¤±¤ë¤È¥¢¥¯¥»¥¹¤¬ÊØÍø¤Ç¤¹¡£¡¡

º£²ó¤Î¾ì¹ç¤Ï¤ï¤«¤ê¤ä¤¹¤¯1¼¡¸µÇÛÎó¤Ë¤·¤Æ¤¢¤ê¤Þ¤¹¡£

ºÇÂ祹¥ì¥Ã¥É¿ô¤Ï¥·¥§¡¼¥À¥Ð¡¼¥¸¥ç¥ó4.0¤Ç786¡¢¥·¥§¡¼¥À¥Ð¡¼¥¸¥ç¥ó5.0¤Ç1024¤È¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£

¥·¥§¡¼¥À¥Ð¡¼¥¸¥ç¥ó4.0¤Ç¤Ï£ú¤¬£±¤·¤«¤È¤ì¤Ê¤¤ÅÀ¤Ëµ¤¤ò¤Ä¤±¤Æ¤¯¤À¤µ¤¤¡£


Compute Shader Maximum Z Maximum Threads (X*Y*Z)
cs_4_x 1 768
cs_5_0 64 1024

¢¨¥¹¥ì¥Ã¥ÉºÇÂç¿ô¤Ï¤¢¤¯¤Þ¤ÇÌܰ¤Τ褦¤Ç ´Ä¶­¤Ë¤è¤Ã¤Æ¤Ïưºî¤·¤Ê¤¤»ö¤¬¤¢¤ë¤è¤¦¤Ç¤¹¡£ GPU¤ÎÀ­Ç½¤Ê¤Î¤«¥á¡¼¥«¡¼¤Ë¤è¤ëº¹°Û¤Ê¤Î¤«¸¶°ø¤¬ÆÃÄê¤Ç¤­¤Æ¤¤¤Þ¤»¤ó¤¬¡¢Æ°ºî¤¬°ÂÄꤷ¤Ê¤¤¾ì¹ç¤Ï¥¹¥ì¥Ã¥É¤Î¿ô¤ò¾¯¤Ê¤á¤ËÀßÄꤹ¤ë¤³¤È¤Ç²þÁ±¤¹¤ë¾ì¹ç¤¬¤¢¤ë¤è¤¦¤Ç¤¹¡£

 

void CSMain (uint3 id : SV_DispatchThreadID)

¤Û¤«¤Ë¤â¥¹¥ì¥Ã¥É¤Î°ú¿ô¤Ï

¡¡SV_GroupIndex, ¡¡SV_DispatchThreadID, ¡¡SV_GroupThreadID, ¡¡SV_GroupID

¤Ê¤É¤ÎÃͤòÀßÄê½ÐÍè¤Þ¤¹¡£

 

¤½¤ì¤¾¤ì¤ÎÃͤδط¸¤Ï°Ê²¼¤Î¤È¤ª¤ê


Illustration of a single thread within a thread group of 50 threads

SV_GroupThreadID  SV_GroupID SV_DispatchThreadID SV_GroupIndex
x, y, z x', y', z' x'*X+x, y'*Y+y, z'*Y+z z*X*Y+y*X+x

 

DX£±£±¥×¥í¥°¥é¥à¤Î¾ÜºÙ¤Ïµ­»öÆâ¥ê¥ó¥¯Àè¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤

 

 

 

¥¹¥¯¥ê¥×¥ÈÉô¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡

¥«¥á¥é¤Ë¥»¥Ã¥È¤·¤Æ»ÈÍѤ¹¤ë¥¹¥¯¥ê¥×¥È¤Î¾ì¹ç¡¡´ðËܤϥ¤¥á¡¼¥¸¥¨¥Õ¥§¥¯¥È¤Î¥¹¥¯¥ê¥×¥È¤ÈƱ¤¸¥¹¥¿¥¤¥ë¤Ë¤Ê¤ê¤Þ¤¹¡£

 

¡üStart( )¥á¥½¥Ã¥ÉÆâ¤Ç

particleBuffer = new ComputeBuffer(particleCount, 12);
particleBuffer.SetData(particleLocations);


ComputeBuffer¤Î½é´ü²½¤ò¹Ô¤¤¤Þ¤¹¡¡

ComputeBuffer (ÇÛÎóÁ´ÂΤοô : int, ÇÛÎó¸Ä¡¹¤Î¥µ¥¤¥º : int, type : ComputeBufferType)

º£²ó¤Ï»ÈÍѤ·¤Æ¤¤¤Þ¤»¤ó¤¬3ÈÖÌܤΰú¿ô¤Ï¥Ð¥Ã¥Õ¥¡¥¿¥¤¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£

SetData()¤ò»ÈÍѤ·¤Æ¡¡ComputeBuffer¤Ë¥¹¥¯¥ê¥×¥È¦¤Î½é´ü²½¤·¤¿ÇÛÎó¤ò¥»¥Ã¥È¤·¤Þ¤¹¡£

 


¡üUpdate( )¥á¥½¥Ã¥ÉÆâ¤Ç

cs.SetBuffer (cs.FindKernel ("CSMain"), "PosBuffer", ParticleBuffer);
cs.Dispatch (cs.FindKernel ("CSMain"), particleCount, 1, 1);

 

¥¹¥¯¥ê¥×¥ÈÃæ¤Îcs¤ÏComputeShader¤òÀßÄꤹ¤ëºÝ¤Ë¼«Í³¤Ë̾Á°¤ò³ä¤ê¿¶¤ì¤Þ¤¹¤Î¤Ç

public ComputeShader cs;

¤ÈÀë¸À¤·¤Æ¥¹¥¯¥ê¥×¥È¤¬¾éĹ¤Ë¤Ê¤é¤Ê¤¤¤è¤¦¤Ê̾Á°¤ò¤Ä¤±¤Þ¤¹

cs.SetBuffer (cs.FindKernel ("CSMain"), "PosBuffer", ParticleBuffer);

¡¡¡¡FindKernel ("CSMain")¡¡¤ÏComputeShaderÆâ¤Ç¡É#pragma kernel CSMain¡É¤È¤·¤ÆÀë¸À¤·¤¿Ì¾Á°¤Î¥«¡¼¥Í¥ë¤ò

¡¡¡¡Ãµ¤·¤ÆComputeShader¤Î¥Ð¥Ã¥Õ¥¡¤Ë¥¹¥¯¥ê¥×¥È¤ÇÀßÄꤷ¤¿¥Ð¥Ã¥Õ¥¡¤ò¥»¥Ã¥È¤·¤Þ¤¹¡£

¡¡¡¡¤¹¤Ù¤Æ¤Î¥Ç¡¼¥¿¤ò¥»¥Ã¥È¤·½ª¤¨¤¿¤éDispatch( ) ¤ò»ÈÍѤ·¤Æ¥¹¥ì¥Ã¥É·×»»¤ò³«»Ï¤µ¤»¤Þ¤¹¡£

 

void Dispatch(   UINT¡¡x ,   UINT y ,   UINT z );

¡¡¡¡°ú¿ô¤Ïuint¡Êint¡Ë·¿¤Ç¡¡ComputeShader¤Ç·×»»¤µ¤»¤ë¥¹¥ì¥Ã¥É¤Î¼¡¿ô¤Ë¤¢¤ï¤»¤Æ¤¯¤À¤µ¤¤

 

 

¡üOnRenderImage()¥á¥½¥Ã¥ÉÆâ¤Ç

mat.SetBuffer("particleBuffer", particleBuffer);

Graphics.DrawProcedural (MeshTopology.Triangles, particleCount);

mat¤Ï¥ì¥ó¥À¥ê¥ó¥°¤Ë»ÈÍѤ¹¤ë¥·¥§¡¼¥À¤ò¼¨¤·¤Þ¤¹¡¡ComputeShader¤Ç·×»»¤µ¤ì¤¿·ë²Ì¤ò

¥ì¥ó¥À¥ê¥ó¥°ÍѤΥ·¥§¡¼¥À¤Ë¥»¥Ã¥È¤·¤Þ¤¹¡£

 

DrawProcedural (  MeshTopology.Type    , particleCount  );

 

MeshTopology.Type  ¤Ë¤ÏÉÁ²è¥¹¥¿¥¤¥ë¤òÀßÄꤷ¤Þ¤¹¡¡Triangles | Quads¡¡| Lines¡¡| LineStrip¡¡| Points

¤Ê¤É¤Î¼ïÎब¤¢¤ê¤Þ¤¹¤¬¡¢¡¡º£²ó¤Ï¥·¥§¡¼¥À¦¤Ç¥¸¥ª¥á¥È¥ê¥·¥§¡¼¥À¤ò»ÈÍѤ·¤Æ¥á¥Ã¥·¥åÉÁ²è¤¹¤ë¤¿¤á

ÉÁ²è¤¹¤ë²ó¿ô¡ÊparticleCount  ¡á¡¡¥Ñ¡¼¥Æ¥£¥¯¥ë¿ô¡Ë¤À¤±¹ç¤Ã¤Æ¤¤¤ì¤Ð²¿¤ò»ØÄꤷ¤Æ¤â¤è¤¤¤Ç¤¹¡£

DrawProcedural ¡Ê¡¡¡ËÌ¿Îá¤Ï¡¡ÄºÅÀ¥Ç¡¼¥¿¤òGPU¤Î¤ËžÁ÷¤»¤º¤ËľÀÜVRAM¤ËÉÁ²è¤¹¤ëÌ¿Îá¤Ç¤¹¡¡Îà»÷¤ÎÌ¿Îá

DrawProceduralIndirect(¡¡)¤È¤Î°ã¤¤¤Ï

DrawProceduralIndirect(¡¡)¤ÏGPU¦¤«¤é¤Î¥³¡¼¥ë¥Ð¥Ã¥¯¤¬Ìµ¤¤ÅÀ¤Ç¤¹¡£¡Ê¤Ä¤Þ¤ê¥Ç¡¼¥¿¤ÎºÆÍøÍÑÉԲġË

 

 

 

 

¢£¥³¥ó¥Ô¥å¡¼¥È¥·¥§¡¼¥À»ÈÍÑ»þ¤Î¥Ç¡¼¥¿¤Îή¤ì¤ò°Ê²¼¤Î¿Þ¤Ë¼¨¤·¤Þ¤¹

¥³¥ó¥Ô¥å¡¼¥È¥·¥§¡¼¥À

 

 

¢£ ¡ÈParticleController_Sample.cs

using UnityEngine;
using System.Collections;
using System.Threading;



public class ParticleController_Sample : MonoBehaviour {


public Texture2D particleTexture;

public Shader shader;
private Material mat;

public float PScale = 1.0f;

public ComputeShader cs;

public int particleCount = 1000;
public Transform OriginLocation;


private Vector3[] particleLocations;
private Vector3[] particleColors;
private Vector3[] particleVelocities;

private ComputeBuffer particleBuffer;
private ComputeBuffer particleColorBuffer;
private ComputeBuffer velocityBuffer;




Thread csThread;


void Start()
{

particleLocations = new Vector3[particleCount];
particleColors = new Vector3[particleCount];
particleVelocities = new Vector3[particleCount];


for (int i = 0; i < particleCount; i++)
{

particleLocations[i] = OriginLocation.position + Random.insideUnitSphere;
particleVelocities[i] = Random.insideUnitSphere;
particleColors[i] = new Vector3(Random.value,Random.value,Random.value);


}

particleBuffer = new ComputeBuffer(particleCount, 12);
particleBuffer.SetData(particleLocations);

velocityBuffer= new ComputeBuffer(particleCount, 12);
velocityBuffer.SetData (particleVelocities);

particleColorBuffer = new ComputeBuffer(particleCount, 12);
particleColorBuffer.SetData (particleColors);





mat = new Material(shader);
mat.hideFlags = HideFlags.HideAndDontSave;

mat.SetTexture ("_Sprite", particleTexture);
mat.SetFloat ("Size", PScale );

}

private void ReleaseResources()
{
csThread.Abort ();

particleBuffer.Release ();
particleColorBuffer.Release ();
velocityBuffer.Release ();

Object.DestroyImmediate (mat);
}

void OnDisable()
{
ReleaseResources ();
}


void Update()
{


cs.SetFloat ("Time",Time.timeSinceLevelLoad);
cs.SetVector ("Origin", OriginLocation.position);

cs.SetBuffer (cs.FindKernel ("CSMain"), "colBuffer", particleColorBuffer);
cs.SetBuffer (cs.FindKernel ("CSMain"), "posBuffer", particleBuffer);
cs.SetBuffer (cs.FindKernel ("CSMain"), "velBuffer", velocityBuffer);

cs.Dispatch (cs.FindKernel ("CSMain"), particleCount, 1, 1);

}

void OnRenderImage(RenderTexture src, RenderTexture dst)
{


Graphics.Blit( src, dst);

mat.SetBuffer("particleBuffer", particleBuffer);
mat.SetBuffer("particleColor", particleColorBuffer);
mat.SetPass (0);

Graphics.DrawProcedural(MeshTopology.Triangles, particleCount);




}
}


 

¢£ ¡Écompute_sample.compute¡É



#pragma kernel CSMain




RWStructuredBuffer posBuffer : register(u0);
RWStructuredBuffer velBuffer : register(u1);
RWStructuredBuffer colBuffer : register(u2);



float Time;
float4 Origin;
float PI = 3.1415926;



[numthreads(16,1,1)]
void CSMain (uint3 id : SV_DispatchThreadID)
{

uint Tid = id.x;

colBuffer[Tid ].r = 0.1;
colBuffer[Tid ].g =1.0;
colBuffer[Tid ].b = 0.4;

float3 NewPos;


NewPos.x = Origin.x + (sin(Time/10.0 * Tid ) ) * 30;
NewPos.y = Origin.y + (cos((Time/10.0+PI ) * Tid ) ) *30;
NewPos.z = Origin.z + (cos(Time /10.0 * Tid ) )*30;



velBuffer[Tid ].x = NewPos.x - posBuffer[Tid ].x;
velBuffer[Tid ].y = NewPos.y - posBuffer[Tid ].y;
velBuffer[Tid ].z = NewPos.z - posBuffer[Tid ].z;


posBuffer[Tid ].x += velBuffer[Tid ].x / 40;
posBuffer[Tid ].y += velBuffer[Tid ].y / 40;
posBuffer[Tid ].z += velBuffer[Tid ].z / 40;

}



 

¢£ ¡ÈRenderParticles.shader¡É

Shader "Custom/RenderParticles" {
Properties {
_Sprite ("Sprite", 2D) = "white" {}
}

SubShader {
Pass{
ZWrite Off ZTest Always Cull Off Fog { Mode Off }
Blend SrcAlpha One



CGPROGRAM
#pragma target 5.0

#pragma vertex vert
#pragma geometry geom
#pragma fragment frag

#include "UnityCG.cginc"

StructuredBuffer particleBuffer;
StructuredBuffer particleColor;

float Size = 0.3f;

   sampler2D _Sprite;

struct vs_out {
float4 pos : SV_POSITION;
float4 col : COLOR;
};

vs_out vert (uint id : SV_VertexID)
{
vs_out o;
o.pos =mul(_Object2World, float4(particleBuffer[id], 1.0f));
o.col = float4(particleColor[id], 1.0f);
return o;
}

struct gs_out {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
float4 col : COLOR;
};

[maxvertexcount(4)]
void geom (point vs_out input[1], inout TriangleStream outStream)
{


float dx = Size;
float dy = Size * _ScreenParams.x / _ScreenParams.y;
gs_out output;


float4 corLoc = mul(UNITY_MATRIX_MVP, input[0].pos);

output.pos = corLoc + float4(-dx, dy,0,0); output.uv=float2(0,0);
output.col = input[0].col; outStream.Append (output);
output.pos = corLoc + float4( dx, dy,0,0); output.uv=float2(1,0);
output.col = input[0].col; outStream.Append (output);
output.pos = corLoc + float4(-dx,-dy,0,0); output.uv=float2(0,1);
output.col = input[0].col; outStream.Append (output);
output.pos = corLoc + float4( dx,-dy,0,0); output.uv=float2(1,1);
output.col = input[0].col; outStream.Append (output);

outStream.RestartStrip();
}



fixed4 frag (gs_out i ) : COLOR0
{
fixed4 col = tex2D(_Sprite, i.uv);
col.a = 0.8f;
col *= i.col;
return col;
}

ENDCG

}
}

Fallback Off
}

 

°Å¹æ²½¤Ë¤Ä¤¤¤Æ¤Î¸¡º÷¤¬¤¢¤ê¤Þ¤·¤¿¤Î¤Ç ¤¤¤¯¤Ä¤«¥µ¥ó¥×¥ë¤ò·ÇºÜ¤·¤Þ¤·¤¿¡£

 

°Å¹æ²½¤Î´ðËÜŪ¤Ê¤ä¤êÊý¤Ç¤¹¤¬Å¬Åö¤Êʸ»úÎ󥯡¼¥Ö¥ë¤òºîÀ®¤·¤Æ ÆÈ¼«¤Î¤ä¤êÊý¤Çʸ»úÎóÁàºî¤ò¤¹¤ë¤³¤È¤Ç°Å¹æ²½¤ò¤ª¤³¤Ê¤¤¤Þ¤¹¡£

¤È¤¤¤¦¤Î¤Ç¤Ï¥¤¥á¡¼¥¸¤¬Í¯¤«¤Ê¤¤¤È»×¤¤¤Þ¤¹¤Î¤Ç ¥µ¥ó¥×¥ë¥³¡¼¥É¤ò¤¤¤¯¤Ä¤«Ãê½Ð¤·¤Æ¤ß¤Þ¤·¤¿¡£

¥»¡¼¥Ö¥Ç¡¼¥¿¤Ê¤É¤òPlayerPrefs¤Ê¤É¤ËÊݸ¤·¤¿¤¤¾ì¹ç ´Êñ¤ËÃæ¤¬¸«¤ì¤Æ¤·¤Þ¤¦¤Î¤ÇÆñÆÉ²½¤¹¤ëɬÍפ¬½Ð¤ÆÍè¤ë¤«¤È»×¤¤¤Þ¤¹¡£ PlayerPrefs °Å¹æ²½¤Î¥µ¥ó¥×¥ë¤Ï´Êñ¤Ê¥Æ¡¼¥Ö¥ëºîÀ®¤Ë¤è¤ë°Å¹æ²½¤Ç¤¹¡£

MD5°Å¹æ²½¤Ï¥Í¥Ã¥È¾å¤Ç¹­¤¯»ÈÍѤµ¤ì¤Æ¤¤¤ë°Å¹æ²½¤Ç¤¹ ¡Ê´Êñ¤Ç¤Ï¤Ê¤¤¤Ç¤¹¤¬²òÀϤǤ­¤Ê¤¯¤Ï¤Ê¤¤¡Ë

AES°Å¹æ²½¤ÏºÇ¶á¤è¤¯Ì¾Á°¤Îµó¤¬¤ëTOR¤Ë¤â»ÈÍѤµ¤ì¤Æ¤¤¤ë°Å¹æ²½µ»½Ñ¤Ç¤¹¡£

 

¢£PlayerPrefs °Å¹æ²½¤Î¥µ¥ó¥×¥ë

 

http://forum.unity3d.com/threads/26437-PlayerPrefs-Encryption

¡ü»ÈÍÑÊýË¡

void Start () {

// this array should be filled before you can use EncryptedPlayerPrefs :

EncryptedPlayerPrefs.keys=new string[5];

EncryptedPlayerPrefs.keys[0]="23Wrudre";

EncryptedPlayerPrefs.keys[1]="SP9DupHa";

EncryptedPlayerPrefs.keys[2]="frA5rAS3";

EncryptedPlayerPrefs.keys[3]="tHat2epr";

EncryptedPlayerPrefs.keys[4]="jaw3eDAs";



EncryptedPlayerPrefs.SetString("test_string", "Hello World");

Debug.Log(EncryptedPlayerPrefs.GetString("test_string", "default"));



EncryptedPlayerPrefs.SetInt("test_int", 500);

Debug.Log(EncryptedPlayerPrefs.GetInt("test_int", -1));



EncryptedPlayerPrefs.SetFloat("test_float", 500.456);

Debug.Log(EncryptedPlayerPrefs.GetFloat("test_float", -1f));

}

¡ü¥á¥½¥Ã¥É¤ÎËÜÂÎ

using UnityEngine;

using System.Collections;

using System.Security.Cryptography;

using System.Text;



public class EncryptedPlayerPrefs {



// Encrypted PlayerPrefs

// Written by Sven Magnus

// MD5 code by Matthew Wegner (from [url]http://www.unifycommunity.com/wiki/index.php?title=MD5[/url])





// Modify this key in this file :

private static string privateKey="9ETrEsWaFRach3gexaDr";



// Add some values to this array before using EncryptedPlayerPrefs

public static string[] keys;





public static string Md5(string strToEncrypt) {

UTF8Encoding ue = new UTF8Encoding();

byte[] bytes = ue.GetBytes(strToEncrypt);



MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();

byte[] hashBytes = md5.ComputeHash(bytes);



string hashString = "";



for (int i = 0; i < hashBytes.Length; i++) {

hashString += System.Convert.ToString(hashBytes[i], 16).PadLeft(2, '0');

}



return hashString.PadLeft(32, '0');

}



public static void SaveEncryption(string key, string type, string value) {

int keyIndex = (int)Mathf.Floor(Random.value * keys.Length);

string secretKey = keys[keyIndex];

string check = Md5(type + "_" + privateKey + "_" + secretKey + "_" + value);

PlayerPrefs.SetString(key + "_encryption_check", check);

PlayerPrefs.SetInt(key + "_used_key", keyIndex);

}



public static bool CheckEncryption(string key, string type, string value) {

int keyIndex = PlayerPrefs.GetInt(key + "_used_key");

string secretKey = keys[keyIndex];

string check = Md5(type + "_" + privateKey + "_" + secretKey + "_" + value);

if(!PlayerPrefs.HasKey(key + "_encryption_check")) return false;

string storedCheck = PlayerPrefs.GetString(key + "_encryption_check");

return storedCheck == check;

}



public static void SetInt(string key, int value) {

PlayerPrefs.SetInt(key, value);

SaveEncryption(key, "int", value.ToString());

}



public static void SetFloat(string key, float value) {

PlayerPrefs.SetFloat(key, value);

SaveEncryption(key, "float", Mathf.Floor(value*1000).ToString());

}



public static void SetString(string key, string value) {

PlayerPrefs.SetString(key, value);

SaveEncryption(key, "string", value);

}



public static int GetInt(string key) {

return GetInt(key, 0);

}



public static float GetFloat(string key) {

return GetFloat(key, 0f);

}



public static string GetString(string key) {

return GetString(key, "");

}



public static int GetInt(string key,int defaultValue) {

int value = PlayerPrefs.GetInt(key);

if(!CheckEncryption(key, "int", value.ToString())) return defaultValue;

return value;

}



public static float GetFloat(string key, float defaultValue) {

float value = PlayerPrefs.GetFloat(key);

if(!CheckEncryption(key, "float", Mathf.Floor(value*1000).ToString())) return defaultValue;

return value;

}



public static string GetString(string key, string defaultValue) {

string value = PlayerPrefs.GetString(key);

if(!CheckEncryption(key, "string", value)) return defaultValue;

return value;

}



public static bool HasKey(string key) {

return PlayerPrefs.HasKey(key);

}



public static void DeleteKey(string key) {

PlayerPrefs.DeleteKey(key);

PlayerPrefs.DeleteKey(key + "_encryption_check");

PlayerPrefs.DeleteKey(key + "_used_key");

}



}

 

 

¢£MD5 °Å¹æ²½¤Î¥µ¥ó¥×¥ë                

 

¡üUnity¤Î¥Õ¥©¡¼¥é¥àWIki¤Î¥µ¥ó¥×¥ë

http://wiki.unity3d.com/index.php?title=MD5

public  string Md5Sum(string strToEncrypt)
{
System.Text.UTF8Encoding ue = new System.Text.UTF8Encoding();
byte[] bytes = ue.GetBytes(strToEncrypt);

// encrypt bytes
System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] hashBytes = md5.ComputeHash(bytes);

// Convert the encrypted bytes back to a string (base 16)
string hashString = "";

for (int i = 0; i < hashBytes.Length; i++)
{
hashString += System.Convert.ToString(hashBytes[i], 16).PadLeft(2, '0');
}

return hashString.PadLeft(32, '0');
}

 

¡üUnity¥Õ¥©¡¼¥é¥à¤Î¥µ¥ó¥×¥ë

http://forum.unity3d.com/threads/114688-Encryption-In-Unity-Programs

using UnityEngine;

using System.Collections;

using System.Security.Cryptography;

using System.Text;

using System;

using Org.BouncyCastle.Crypto;

using Org.BouncyCastle.Crypto.Paddings;

using Org.BouncyCastle.Crypto.Engines;

using Org.BouncyCastle.Crypto.Parameters;



public class Encoding : MonoBehaviour

{

public class BCEngine

{

private readonly Encoding _encoding;

private readonly IBlockCipher _blockCipher;

private PaddedBufferedBlockCipher _cipher;

private IBlockCipherPadding _padding;



public BCEngine(IBlockCipher blockCipher)

{

_blockCipher = blockCipher;

}



public void SetPadding(IBlockCipherPadding padding)

{

if(padding != null)

_padding = padding;

}



public string Encrypt(string plain, string key)

{

byte[] result = BouncyCastleCrypto(true, System.Text.Encoding.ASCII.GetBytes(plain), key);

return Convert.ToBase64String(result);

}



public string Decrypt(string cipher, string key)

{

byte[] result = BouncyCastleCrypto(false, Convert.FromBase64String(cipher), key);

return System.Text.Encoding.ASCII.GetString(result);

}



///

///

///


///

///

///

///

///





private byte[] BouncyCastleCrypto(bool forEncrypt, byte[] input, string key)

{

try

{

_cipher = _padding == null ? new PaddedBufferedBlockCipher(_blockCipher) : new PaddedBufferedBlockCipher(_blockCipher, _padding);

byte[] keyByte = System.Text.Encoding.ASCII.GetBytes(key);

_cipher.Init(forEncrypt, new KeyParameter(keyByte));

return _cipher.DoFinal(input);

}

catch (Org.BouncyCastle.Crypto.CryptoException ex)

{

throw new CryptoException(ex.ToString());

}

}



}



BCEngine bc = new BCEngine(new BlowfishEngine());



public string EncodePassword(string input, string salt = "$2a$13$AcDc1326./qZrrFpoXx0$")

{

return bc.Encrypt(input, salt);

}





public string CalculateMD5Hash(string input)

{

// step 1, calculate MD5 hash from input

MD5 md5 = System.Security.Cryptography.MD5.Create();

byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);

byte[] hash = md5.ComputeHash(inputBytes);



return Convert.ToBase64String(hash);

}

}

 

¢£AES°Å¹æ²½¤Î¥µ¥ó¥×¥ë

¡üC#¤Î¥µ¥ó¥×¥ë¤¤¤í¤¤¤í

http://stackoverflow.com/questions/273452/using-aes-encryption-in-c-sharp

http://www.gutgames.com/post/AES-Encryption-in-C.aspx

http://www.c-sharpcorner.com/UploadFile/ahsanshakir/EncryptFile12212006042816AM/EncryptFile.aspx

¤¢¤È¥³¥³¤é¤Ø¤ó¡©¢­

http://msdn.microsoft.com/en-us/library/53tyfkaw(v=vs.100).aspx

http://www.mono-project.com/Cryptography

 

¡üAsset¥Õ¥¡¥¤¥ë¤Î°Å¹æ²½¤Ë¼ÁÌä

http://answers.unity3d.com/questions/8855/how-to-encrypt-asset-bundles.html

¡üC#¥³¡¼¥É¤ÎÆñÆÉ²½¤Ë´Ø¤¹¤ë¥¹¥ì¥Ã¥É

http://forum.unity3d.com/threads/175054-Obfuscation-Community-requested



Unity¤Î¥Æ¥¯¥¹¥Á¥ã¥¢¥Ë¥á¡¼¥·¥ç¥ó¤Î²áµîµ­»ö¤Ë¥¢¥¯¥»¥¹¤¬Â¿¤¤¤Î¤Ç¤¹¤¬¡¢µ­»ö¤Î¾ðÊ󤬾¯¤·¸Å¤¤¤Î¤ÇÊä´°¤·¤Æ

¤ª¤­¤Þ¤¹¡£



¥Õ¥ê¡¼¥¹¥¯¥ê¥×¥È¤ò»ÈÍѤ·¤ÆÏ¢È֥ƥ¯¥¹¥Á¥ã¤ò°ìËç¤Î¥·¡¼¥È¤Ë¤Þ¤È¤á¤ë²Õ½ê¤Ç¤¹¤¬¥Õ¥©¥È¥·¥ç¥Ã¥×¤ËźÉդΥץ饰¥¤¥ó

¡Ö¥³¥ó¥¿¥¯¥È¥·¡¼¥È­¶¡×¤ÇƱ¤¸¤è¤¦¤Ë¥·¡¼¥ÈºîÀ®¤¬¤Ç¤­¤Þ¤¹¡£

¡Ö¥Õ¥¡¥¤¥ë¡×¢ª¡Ö¼«Æ°½èÍý¡×¢ª¡Ö¥³¥ó¥¿¥¯¥È¥·¡¼¥È­¶¡× ¤¬¤½¤ì¤Ç¤¹

¤¿¤À¤·CS4°Ê¹ß¤Ï¥³¥ó¥¿¥¯¥È¥·¡¼¥È­¶¤Î¥×¥é¥°¥¤¥ó¤¬ÉÕ°¤·¤Æ¤¤¤Þ¤»¤ó¡£

¥µ¥¤¥È¤«¤éľÀÜ¥À¥¦¥ó¥í¡¼¥É¤·¤Æ¼«Ê¬¤Ç¥¤¥ó¥¹¥È¡¼¥ë¤¹¤ëɬÍפ¬¤¢¤ë¤è¤¦¤Ç¤¹¡£



¡Ö¥³¥ó¥¿¥¯¥È¥·¡¼¥È­¶¡×¤Î¥À¥¦¥ó¥í¡¼¥ÉÀè ¢­

http://helpx.adobe.com/jp/photoshop/kb/234925.html

¥À¥¦¥ó¥í¡¼¥É¤È»ÈÍÑÊýË¡¤Ï¥Ó¥Ç¥ª±ÇÁü¤ò»²¹Í¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£





¤½¤ì¤È ¤´Â¸ÃΤ«¤â¤·¤ì¤Þ¤»¤ó¤¬ ¥¹¥×¥é¥¤¥È¤Î¥¢¥È¥é¥¹ºîÀ®¤ò¤¹¤ë "shoebox¡É

no title
























http://renderhjs.net/shoebox/

http://forum.unity3d.com/threads/113518-ShoeBox-2d-gamedev-tools Unity¥Õ¥©¡¼¥é¥à¤Î³ºÅöµ­»ö

adobeAir¤ò»ÈÍѤ·¤¿¥Ä¡¼¥ë¤Ç ¥¹¥×¥é¥¤¥È¤Î¥Ñ¥Ã¥­¥ó¥° ¤ä ¥Æ¥¯¥¹¥Á¥ã¤«¤é¤Î¥¹¥×¥é¥¤¥ÈÀÚ¤ê½Ð¤·

¥Æ¥¯¥¹¥Á¥ãºÂɸ¤Î¥ª¥Õ¥»¥Ã¥È¥Æ¡¼¥Ö¥ë½ñ¤­½Ð¤·¤Ê¤É¤ËÂбþ¤·¤¿¤¹¤°¤ì¤â¤Î¡£

¥¹¥¿¥ó¥É¥¢¥í¡¼¥ó¤Çưºî¤¹¤ë¤Î¤Ç¥Õ¥©¥È¥·¥ç¥Ã¥×¤ò»ý¤Ã¤Æ¤¤¤Ê¤¯¤Æ¤âÂç¾æÉס£







¤È¤¤¤¦¤³¤È¤Ç ¡¡¡¡¤¦¤Ë¤Ð¤Ê¥·¥ç¡¼¥Èµ­»ö¤Ç¤·¤¿¡£

¼¡²ó¤Ï¡¡Íè½µ¤«¤Ê¤¢¡¦¡¦

 

 

¤³¤ó¤Ë¤Á¤Ï º£²ó¤Ï¥Ñ¡¼¥Æ¥£¥¯¥ë¤Ê¤É¤Î¥¨¥Õ¥§¥¯¥ÈÍÑ¥·¥§¡¼¥À¡¼¤ò¥Æ¥¹¥È¤Ç½ñ¤¤¤Æ¤ß¤Þ¤·¤¿¡£

ư²è¤Ï¥¤¥á¡¼¥¸±ÇÁü ¥É¥ê¥­¥ã¥¹ÈÇ ÈÃÈ·¤Ç¤¹¡£

¥Ñ¡¼¥Æ¥£¥¯¥ë²Ã»»¡Êadditive¡Ë¥·¥§¡¼¥À¤ÏÌÀ¤ë¤¤Çطʤ˽Ťͤ¿»þ ñ½ã¤ËDst¥«¥é¡¼¡Ê¤³¤³¤Ç¤ÏÇØ·Ê¿§¤Î¤³¤È¡Ë

¤ËÂФ·¤Æ¥¹¥¯¥ê¡¼¥ó²Ã»»¤ò¹Ô¤¦¤¿¤á¥¨¥Õ¥§¥¯¥È¤ò½Å¤Í¤ë¤´¤È¤Ë¿§¤¬Çò¤¯Èô¤Ó¤Þ¤¹¡£¤¤¤ï¤æ¤ë¿Ä¤Î¤Ê¤¤¥¨¥Õ¥§¥¯¥È

¤È¤¤¤¦¤ä¤Ä¤Ç¤¹¡£ ¥·¡¼¥óÇØ·Ê¤ò°Å¤¯¤·¤¿¤ê¤È¤¤¤Ã¤¿¥²¡¼¥àÀ­¤Ë´Ø¤ï¤ëÉôʬ¤ÇÂкö¤ò¤·¤¿¤ê¤â¤¹¤ëÊýË¡¤â¤¢¤ë¤Î¤Ç¤¹¤¬

 

¤³¤ì¤ò²óÈò¤¹¤ë¤¿¤á¤Ë ¤è¤¯»È¤ï¤ì¤ë¼êË¡¤¬²Ã»»¥¨¥Õ¥§¥¯¥È¤Î¸å¤í¤Ë¾è»»¥Æ¥¯¥¹¥Á¥ã¤ò°ìËçÉߤ¯

ÊýË¡¤Ç¡¢¤Þ¤À¸ÇÄꥷ¥§¡¼¥À¤·¤«Ìµ¤«¤Ã¤¿PS2¤ä¥É¥ê¡¼¥à¥­¥ã¥¹¥È¤Î»þ´ü¤Î¥¨¥Õ¥§¥¯¥È¤Ï¤³¤Î¤ä¤êÊý¤¬ÍѤ¤¤é¤ì¤Æ¤¤¤Þ¤·¤¿¡£¡Ê¤³¤³¤ÇÈÃÈ·¤Îư²è¤Î¤É¤³¤Ç»È¤ï¤ì¤Æ¤¤¤ë¤«»²¾È¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡Ë

¤½¤Î¸å ¥×¥í¥°¥é¥Þ¥Ö¥ë¥·¥§¡¼¥À¡¼¤¬ÅëºÜ¤µ¤ì¤¿¼¡À¤Â嵡¤Ë¤Ê¤ë¤È ¾è»»¤È²Ã»»¤Î2¥Ñ¥¹¥·¥§¡¼¥À¡¼¤Ç¿§¤ÎÇò¤È¤Ó¤ò

ÍÞ¤¨¤ëÊýË¡¤¬»È¤ï¤ì¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤·¤¿¡£ º£²ó¤Î¥·¥§¡¼¥À¡¼¤Ï¤³¤Î£²¥Ñ¥¹¤Î¥Ñ¡¼¥Æ¥£¥¯¥ë¥·¥§¡¼¥À¤Ç¤¹¡£

 

Unity¤Ë¥Ó¥ë¥È¥¤¥ó¥·¥§¡¼¥À¡¼¤È¤·¤ÆÉÕ°¤·¤Æ¤¤¤ë¥Ñ¡¼¥Æ¥£¥¯¥ë¥·¥§¡¼¥À¡¼¤Ï¤ª¤ª¤Þ¤«¤Ë²Ã»»¡ÊAddiive)¤È¸º»»¡ÊMultiply)¡£

¤½¤Î¤Û¤«¤ËAdditiveMuitiply¤Î¤è¤¦¤Ê¼ïÎà¤â¤¢¤ê¤Þ¤¹ ¤³¤ì¤Ï1¥Ñ¥¹¤Ç¥Æ¥¯¥¹¥Á¥ã¤ÎÌÀÅÙ¤ò¸«¤ÆÇطʤȲû»¤¹¤ë¤â¤Î¤Ç¿§¤ÏÀµ³Î¤Ë¥Æ¥¯¥¹¥Á¥ã¤Î¿§¤òÈ¿±Ç¤·¤Þ¤¹¤¬°Å¤¤¿§¤ÎÉôʬ¤Ïɽ¼¨¤Ç¤­¤Þ¤»¤ó¡£

º£²ó¤Î¥·¥§¡¼¥À¤Ï¾è»»¤È²Ã»»¤ò½Å¤Í¤ÆÉ½¼¨¤¹¤ë¤¿¤á ¿§¤òÀµ³Îɽ¼¨¤¹¤ë¥Ñ¡¼¥Æ¥£¥¯¥ë¤È¤·¤Æ»ÈÍѤǤ­¤Þ¤¹¡£

¿Þfig1¤ò»²¾È

 

fig1:

AddMulti

¤µ¤é¤Ë

Ä̾ï¤Î¥Ó¥ë¥Ü¡¼¥É¥Æ¥¯¥¹¥Á¥ã¥·¥§¡¼¥À¤È¤·¤Æ¤âµ¡Ç½¤¹¤ë ¥¨¥Õ¥§¥¯¥ÈÍÑÅÓ¤ËÍÍ¡¹»ÈÍѽÐÍè¤ëÍøÊØÀ­¤¬¤¢¤ê¤Þ¤¹¡£

¿Þfig2¤ÎÄ̾亮¥§¡¼¥À¤ò»ÈÍѤ·¤¿¥Æ¥¯¥¹¥Á¥ã¥¤¥á¡¼¥¸¤¬±¦Â¦¤Ç º£²ó¤Î¥·¥§¡¼¥À¤ò»ÈÍѤ·¤¿¥¤¥á¡¼¥¸¤¬º¸Â¦¤Ç¤¹¡£

²Ã»»¤Ë¤è¤Ã¤Æ¥³¥ó¥È¥é¥¹¥È¤¬¶¯Ä´¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ Çúȯ¤Ê¤É¤Î¥Æ¥¯¥¹¥Á¥ã¤òÉÁ²è¤¹¤ë¤Î¤Ë¤â¸ú²Ì¤Ï¤¢¤ê¤½¤¦¤Ç¤¹¡£

¤µ¤é¤Ë¥°¥í¡¼¤Î¥¤¥á¡¼¥¸¥¨¥Õ¥§¥¯¥È¤òÈ碌¤ì¤Ð¥ê¥Ã¥Á¤Ê²èÁü¤¬ÆÀ¤é¤ì¤ë¤«¤È»×¤¤¤Þ¤¹¡£

fig2¡§

tekusutyaAdd

 

¥·¥§¡¼¥À¡¼¤Î¥³¡¼¥É "Custom/AddMultiply+.shader¡É

Shader "Custom/AddMultiply+" {

Properties {
_TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)
_MainTex ("Particle Texture", 2D) = "white" {}
_InvFade ("Soft Particles Factor", Range(0.01,3.0)) = 1.0
_Contrast("Contrast Factor", Range(0.5,1.0)) = 0.1
}


CGINCLUDE

#pragma exclude_renderers gles
#pragma target 3.0
#pragma vertex vert
#pragma fragmentoption ARB_precision_hint_fastest
#pragma multi_compile_particles
#include "UnityCG.cginc"


struct appdata_t {
float4 vertex : POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
};

struct v2f {
float4 vertex : POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
#ifdef SOFTPARTICLES_ON
float4 projPos : TEXCOORD1;
#endif
};

float4 _MainTex_ST;

v2f vert (appdata_t v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
#ifdef SOFTPARTICLES_ON
o.projPos = ComputeScreenPos (o.vertex);
COMPUTE_EYEDEPTH(o.projPos.z);
#endif
o.color = v.color;
o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);

return o;
}

sampler2D _CameraDepthTexture;
float _InvFade;

sampler2D _MainTex;
fixed4 _TintColor;
float _Contrast;


float bias (float val, float b)
{
return (b>0) ? pow(abs(val),log(b) / log(0.5)) : 0;
}

float gain (float val, float g)
{
return 0.5 * ((val<0.5) ? bias(2.0*val, 1.0-g) : (2.0 - bias(2.0-2.0*val, 1.0-g)));
}


ENDCG


Category {
Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) }
BindChannels {
Bind "Color", color
Bind "Vertex", vertex
Bind "TexCoord", texcoord
}

SubShader {

Pass {

Blend Zero SrcColor

CGPROGRAM

#pragma fragment frag


fixed4 frag (v2f i) : COLOR
{
#ifdef SOFTPARTICLES_ON
float sceneZ = LinearEyeDepth (UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos))));
float partZ = i.projPos.z;
float fade = saturate (_InvFade * (sceneZ-partZ));
i.color.a *= fade;
#endif

half4 prev = i.color * tex2D(_MainTex, i.texcoord);

prev.r =gain( prev.r , _Contrast);
prev.g =gain( prev.g , _Contrast);
prev.b= gain( prev.b , _Contrast);

return lerp(half4(1,1,1,1), prev, prev.a);
}
ENDCG

SetTexture [_MainTex] {
combine texture * primary
}
SetTexture [_MainTex] {
constantColor (1,1,1,1)
combine previous lerp (previous) constant
}


}//pass



Pass {


Blend SrcAlpha One
AlphaTest Greater .01
ColorMask RGB


CGPROGRAM

#pragma fragment frag



fixed4 frag (v2f i) : COLOR
{
#ifdef SOFTPARTICLES_ON
float sceneZ = LinearEyeDepth (UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos))));
float partZ = i.projPos.z;
float fade = saturate (_InvFade * (sceneZ-partZ));
i.color.a *= fade;
#endif

fixed4 prev = 2.0f * i.color * _TintColor * tex2D(_MainTex, i.texcoord);

prev.r =gain( prev.r , _Contrast);
prev.g =gain( prev.g , _Contrast);
prev.b= gain( prev.b , _Contrast);

return prev;

}
ENDCG

SetTexture [_MainTex] {
constantColor [_TintColor]
combine constant * primary
}
SetTexture [_MainTex] {
combine texture * previous DOUBLE
}

}
}

}

}

 

¥·¥§¡¼¥À¡¼¤Î´ðËÜŪ¤Ê¹½Â¤¤Ï¥Ó¥ë¥È¥¤¥ó¥·¥§¡¼¥À¡¼¤Î¥½¡¼¥¹¥³¡¼¥É¡ØParticleAdd.shader¡Ù¡ØParticleMultiply.shader¡Ù

¤ò2¥Ñ¥¹¤ÇÎóµó¤·¤¿¤À¤±¤Ç¤¹¡£¥·¥§¡¼¥À¡¼¤Î¥Ñ¥¹¤Ï²¼¤Ë¹Ô¤¯¤Û¤É¥«¥á¥é¤«¤é¸«¤Æ¼êÁ°¤Ë¸þ¤«¤Ã¤Æ¾åÉÁ¤­¤µ¤ì¤Æ¤¤¤­¤Þ¤¹¡£

¡üUnity¤ÎShaderLab¤Ç¤ÏCg¥³¡¼¥É¤Îµ­½Ò¤ÏCGPROGRAM~ENDCG ´Ö¤È¤¤¤¦·è¤Þ¤ê¤¬¤¢¤ê¤Þ¤¹¤¬

Shader¤ÎÆâÉô¤Ç²¿ÅÙ¤«¸Æ¤Ó½Ð¤µ¤ì¤ëÊÑ¿ô¤ä´Ø¿ô¤òµ­½Ò¤¹¤ë¾ì¹ç¤ÏCGINCLUDE~ENDCG ¤ò»ÈÍѤ·¤Þ¤¹¡£

Cg¤Î¥é¥¤¥Ö¥é¥ê¤Î¥¤¥ó¥¯¥ë¡¼¥É#include¡ÉUnityCG.cginc¡É¤ä#pragma¤Î¥ª¥×¥·¥ç¥óÀßÄê¤Ê¤É¤âCGINCLUDEÆâ¤Ë

¤Þ¤È¤á¤Æµ­½Ò¤·¤Æ¤·¤Þ¤¤¤Þ¤¹¡£

 

¡ü#ifdef SOFTPARTICLE_ON ~#endif ¹Ô¤Ï¥½¥Õ¥È¥Ñ¡¼¥Æ¥£¥¯¥ë»ÈÍѤΥ֡¼¥ê¥¢¥óÃͤò¥Á¥§¥Ã¥¯¤·¤Æ¤¤¤Þ¤¹

¥½¥Õ¥È¥Ñ¡¼¥Æ¥£¥¯¥ë¤Ï¥ª¥Õ¥¹¥¯¥ê¡¼¥ó¥Ñ¡¼¥Æ¥£¥¯¥ë¤Ë´Ø¤¹¤ë²áµîµ­»ö¤Ç²òÀ⤷¤Æ¤¤¤Þ¤¹¤¬¿¼Å٥ƥ¯¥¹¥Á¥ã

¡ÊCameraDepthTexture)¤ÎÃͤò´ð¤Ë¥Ô¥¯¥»¥ë¥«¥é¡¼¤Î¥¢¥ë¥Õ¥¡ÃͤòÀßÄꤹ¤ë¤â¤Î¤Ç¤¹¡£

¤³¤Î¹Ô¤Ï¥·¥§¡¼¥ÀÆâ¤Ç2²ó¸Æ¤Ó½Ð¤µ¤ì¤Æ¤¤¤Þ¤¹¤¬ CGINCLUDEʸ¤ÎÃæ¤Ë¤Þ¤È¤á¤Æ¤·¤Þ¤Ã¤Æ¹½¤¤¤Þ¤»¤ó¡£

¢¨¤Á¤ç¤Ã¤È»þ´Ö¤¬¤Ê¤«¤Ã¤¿¤â¤Î¤Ç¼ê¤¬²ó¤ê¤Þ¤»¤ó¤Ç¤·¤¿

 

¡ü¥Æ¥¯¥¹¥Á¥ã¥«¥é¡¼¤Ë¥Ð¥¤¥¢¥¹ÃÍ¡Ê_Contrast)¤ò³Ý¤±¤Æ¿§¤ò»ý¤Á¾å¤²¤ë¤³¤È¤¬¤Ç¤­¤ë¤è¤¦¤Ë¤·¤Æ¤¢¤ê¤Þ¤¹¡£

Pow¡Ê¡Ë¤Ê¤É¤ò»ÈÍѤ·¤Æ¤â¤¦¤¹¤³¤·Ã»¤¤¥³¡¼¥É¤Ë¤â¤Ç¤­¤Þ¤¹¤¬¡¢Í½ÁÛ¤·¤Æ¤¤¤¿¿§Ì£¤Ë¤Ê¤é¤Ê¤«¤Ã¤¿¤Î¤Çbias()´Ø¿ô

¤òÀßÄꤷ¤Æ¤¤¤Þ¤¹¡£¤³¤³¤ÏºÇŬ²½¤·¤¿¤Û¤¦¤¬¤¤¤¤¤«¤â¤·¤ì¤Þ¤»¤ó¡£

 

ºÇ¸å¤Ë¤Ê¤ê¤Þ¤·¤¿¤¬Unity¤Ï¥Þ¥Æ¥ê¥¢¥ë¥¹¥í¥Ã¥È¤ÇÊ£¿ô¥Þ¥Æ¥ê¥¢¥ë¤ò»ØÄꤹ¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹¤Î¤Ç ¿Þfig3

¤Î¤è¤¦¤Ë¥Þ¥Æ¥ê¥¢¥ë¤ò2¤ÄÅÐÏ¿¤¹¤ë¤³¤È¤ÇƱ¤¸¤è¤¦¤Ê¸ú²Ì¤òÆÀ¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤¹¡£ Unity¤ÏÃμ±¤Î¤Ê¤¤¥æ¡¼¥¶¡¼¤Ë¤â

ÍÍ¡¹¤Ê²óÈòÊýË¡¤¬ÍѰդµ¤ì¤Æ¤¤¤Æ½õ¤«¤ê¤Þ¤¹¡£

¤³¤Î¤È¤­¤Ë¥·¥§¡¼¥À¡¼¥Ñ¥¹¤ÈƱÍͤ˾å¤ËÅÐÏ¿¤·¤¿¤â¤Î¤¬Àè¤ËÉÁ²è¤µ¤ì¤ë¤³¤È¤Ëµ¤¤ò¤Ä¤±¤Æ¤¯¤À¤µ¤¤¡£

fig3:

MaterialSlot

 

Êä­¡Ë

¥Þ¥Æ¥ê¥¢¥ë¤òÊ£¿ô»È¤¦¾ì¹ç Unity¤Î¥À¥¤¥Ê¥ß¥Ã¥¯¥Ð¥Ã¥Á¤¬Å¬ÍѤµ¤ì¤Ê¤¤¤¿¤á¥É¥í¡¼¥³¡¼¥ë¤ÏÅöÁ³¤Ç¤¹¤¬Ä̾ï¤ËÈæ¤Ù¤Æ2ÇÜȯÀ¸¤·¤Þ¤¹¡£ ¤â¤Á¤í¤óº£²ó¤Î¥·¥§¡¼¥À¡¼¤â2¥Ñ¥¹¤Ç¤¹¤Î¤Ç ¥É¥í¡¼¥³¡¼¥ë¡ß£²-¥À¥¤¥Ê¥ß¥Ã¥¯¥Ð¥Ã¥Á¡Ê´üÂÔ¤µ¤ì¤ë¥É¥í¡¼¥³¡¼¥ë¤Îºï¸º¡Ë ¤È¤Ê¤ë¤ï¤±¤Ç¤¹¤¬¡¢ ¤³¤ì¤ÏÆâ¡¤Î¥Ñ¡¼¥Æ¥£¥¯¥ë¥¨¥Ç¥£¥¿¤ò»ÈÍѤ¹¤ë¾ì¹ç¤ÎÃͤǤ¹¡£

¥Ñ¡¼¥Æ¥£¥¯¥ë¼«ÂÎ¤Î¥É¥í¡¼¥³¡¼¥ë¤ò¸º¤é¤¹Êý¸þ¤Ç´ö¤Ä¤«¹Í¤¨¤é¤ì¤ë¼êË¡¤¬¤¢¤ê¤Þ¤¹¡£

 

¡üGPU¥·¥§¡¼¥À¤Ç¥Ñ¡¼¥Æ¥£¥¯¥ë¤òÉÁ²è¤¹¤ëÊýË¡¡£ À¸À®¤µ¤ì¤¿¥Æ¥¯¥¹¥Á¥ã¤ò¥Õ¥ì¡¼¥à¥Ð¥Ã¥Õ¥¡¤ËŸ³«¤¹¤ë¤À¤±¤Ç¤¹¤Î¤Ç

¥Ñ¡¼¥Æ¥£¥¯¥ë¤¹¤Ù¤Æ¤ò1¥Ñ¥¹¤Ç¥ì¥ó¥À¥ê¥ó¥°¤¹¤ë¤Î¤ÈƱÅù¤Ç¤¹¡£ ¥Ñ¡¼¥Æ¥£¥¯¥ë¤Î·×»»¤âGPU¤Ç¹Ô¤Ê¤Ã¤Æ¤·¤Þ¤¦¤¿¤á

¹â®¤Ê¥Ñ¡¼¥Æ¥£¥¯¥ë¥ì¥ó¥À¥é¡¼¤¬½ñ¤±¤ë¤È»×¤¤¤Þ¤¹¡£

¡üSHURIKEN¤Ê¤É¥Ñ¡¼¥Æ¥£¥¯¥ë¥¨¥Ç¥£¥¿¡¼¤«¤éºÂɸ¥Ç¡¼¥¿¤À¤±¤ò¼èÆÀ¤·¤Æ¥·¥§¡¼¥À¡¼¤Ç°ìËç¤Î¥¹¥¯¥ê¡¼¥ó¥Æ¥¯¥¹¥Á¥ã¤Ë

¤Þ¤È¤á¤ÆÉÁ²è¤¹¤ëÊýË¡¡£ ¹Í¤¨Êý¤Ï¥¤¥á¡¼¥¸¥¨¥Õ¥§¥¯¥È¤Ë¶á¤¤¤Ç¤¹¡£¥¨¥Ç¥£¥¿¡¼¤ò¼«Á°¤ÇÍѰդ¹¤ë¼ê´Ö¤¬¤«¤«¤ê¤Þ¤»¤ó¡£

¡ü¥Ó¥ë¥Ü¡¼¥É¥Ý¥ê¥´¥ó¤Îɽ¼¨¤ò¹â®²½¤¹¤ëÊýË¡¡£ unity¤Î¥Õ¥©¡¼¥é¥à¤Ç¥Þ¥¤¥ó¥¯¥é¥Õ¥È¤Î¥Æ¥ó¥×¥ì¡¼¥È¤ò¼èÆÀ¤·¤¿Êý¤Ï¤ï¤«¤ë¤«¤È»×¤¤¤Þ¤¹¤¬

¥Ý¥ê¥´¥ó¥á¥Ã¥·¥å¥Ç¡¼¥¿¤ÏMeshRenderer¤Ë¥»¥Ã¥È¤µ¤ì¤¿¥á¥Ã¥·¥åÇÛÎó¤Ë¤è¤Ã¤ÆÉÁ²è¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

¥á¥Ã¥·¥åÉÁ²è¤Î¹â®²½¼êË¡¤È¤·¤Æ¤ÏÎ㤨¤ÐMeshMerger¥¹¥¯¥ê¥×¥È¤Ç¤ÏStart()»þ¤Ë¥â¥Ç¥ë¥á¥Ã¥·¥å¤ò°ì¤Ä¤ÎÇÛÎó¤Ë¤Þ¤È¤á¤ÆMeshRender¤ËžÁ÷¤·¤Æ¤¤¤Þ¤¹¡£

¤³¤ÎÊýË¡¤Ç¤Ïư¤­¤Î¤¢¤ë¥á¥Ã¥·¥å¥ª¥Ö¥¸¥§¥¯¥È¤òËè²óžÁ÷¤¹¤ë¤Î¤Ï¥³¥¹¥È¤¬¹â¤¤¤Î¤Ç¡¢Mesh ¥Ç¡¼¥¿¤Ë¥¤¥ó¥Ç¥Ã¥¯¥¹¤ò¤Ä¤±¤Æ´ÉÍý¤¹¤ë¤³¤È¤Ç ¥¤¥ó¥Ç¥Ã¥¯¥¹¤ËÏ¢¤Ê¤ë¥á¥Ã¥·¥å¥Ç¡¼¥¿¤Î¤ß¤òľÀÜÁàºî¤¹¤ë¤³¤È¤Ç®Å٤βþÁ±¤ò¤Ï¤«¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

¥á¥Ã¥·¥å¥Ç¡¼¥¿¤Î°ÜưÊÑ´¹¤ÏĺÅÀ¥Ç¡¼¥¿¤Ë¥È¥é¥ó¥¹¥Õ¥©¡¼¥à¤Î¥Þ¥È¥ê¥Ã¥¯¥¹ ¤òÄ̤¹¤À¤±¤Ç¤¹¡£

¤ª¤½¤é¤¯£²DGUI¤ÎºÇŬ²½¤Ë¤â¤³¤Î¤è¤¦¤Ê¤ä¤êÊý¤¬ÍѤ¤¤é¤ì¤Æ¤¤¤ë¤Î¤Ç¤Ï¤Ê¤¤¤Ç¤·¤ç¤¦¤«¡£

 

¤Ê¤É¤Ê¤ÉºÇŬ²½¼êË¡¤ÏÍÍ¡¹¤¢¤ë¤È»×¤ï¤ì¤Þ¤¹¤Î¤Ç ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î·ÁÂ֤˹ç¤ï¤»¤ÆÁªÂò¤¹¤ë¤È¹¬¤»¤«¤â¤·¤ì¤Þ¤»¤ó¡£

 

 

 

 

¤È¤¤¤¦¤ï¤±¤Ç¥¨¥Õ¥§¥¯¥È¤ËÊØÍø¤½¤¦¤Ê¥·¥§¡¼¥À¡¼¤ò½ñ¤¤¤Æ¤ß¤¿¤Î²ó¤Ç¤·¤¿¡£¥¨¥Õ¥§¥¯¥È¤ÎºîÀ®ÊýË¡¤Ï¤Þ¤¿¤¤¤º¤ì

¤ä¤Ã¤Æ¤¤¤³¤¦¤«¤È»×¤¤¤Þ¤¹¤¬ ¤È¤Ë¤«¤¯¤â»þ´Ö¤¬¤Ê¤¤¤Î¤Ç¤¤¤Ä¤Ë¤Ê¤ë¤ó¤Ç¤·¤ç¤¦¤Í¤§£÷

¤½¤ì¤«¤éÇØ·Ê´ØÏ¢¤Îµ­»ö¤Ç¤¹¤¬ ͽÄê¤ÎÇØ·Ê¥·¥§¡¼¥À¡¼¤ò¤¤¤í¤¤¤í¤È½ñ¤¤¤Æ¥Æ¥¹¥È¤·¤Æ¤¤¤ë´Ø·¸¤Ç¤Á¤ç¤Ã¤È»þ´Ö¤«¤«¤Ã¤Æ¤¤¤Þ¤¹¤¬ ¶á¤¤¤¦¤Á¤Ë¥¢¥Ã¥×¤·¤è¤¦¤È»×¤Ã¤Æ¤¤¤Þ¤¹¡£

¥·¥§¡¼¥À°Ê³°¤Ç¤â¼ÁÌ䤬¤¢¤ì¤Ð ¥³¥á¥ó¥È¤·¤Æ¤¤¤¿¤À¤±¤ì¤Ðʬ¤«¤ëÈϰϤDzóÅú¤·¤Æ¤¤¤­¤Þ¤¹¤Î¤Ç ¤´¼«Í³¤Ë¤É¤¦¤¾¡£

¤Ç¤Ï¤Þ¤¿


¡ÚÄɵ­¡Û

¡Ê13.¡¡12.12¡Ë¡¡´ØÏ¢µ­»ö¤ò¹¹¿·¤·¤Þ¤·¤¿
¤¦¤Ë¤Ð¤Ê¡¡¡Ê¥¨¥Õ¥§¥¯¥ÈÍѤΥ·¥§¡¼¥À¤Ë´Ø¤¹¤ë¥¢¥¤¥Ç¥¢£±¡Ü¡Ë
http://blog.livedoor.jp/akinow/archives/52389229.html

¤¦¤Ë¤Ð¤Ê¡¡¡Ê¥¨¥Õ¥§¥¯¥ÈÍѤΥ·¥§¡¼¥À¤Ë´Ø¤¹¤ë¥¢¥¤¥Ç¥¢£²¡Ë
http://blog.livedoor.jp/akinow/archives/52372883.html

¢¬¤³¤Î¥Ú¡¼¥¸¤Î¥È¥Ã¥×¥Ø