GOSUKE FACTORY

何かの記録

2020/10/30 - 
MSC
 NSR50 を作成中です。この系統のバイクは、あまりムラムラこないなぁ。


2020/10/26 - 
My Summer Car
置き換える前

My Summer Car
置き換えた後

My Summer Car

My Summer Car

MSC
 ひさびさに、My Summer Car で遊ぼうと何か面白いMODがあるかなと調べていたら、以前よりいじりやすくなっているようだったので、樹木やバイクの置換にチャレンジしてみました。

 樹木の方は、元が板ポリにでかいテクスチャを張ったものなので、ビジュアルの向上はいまひとつでした。まぁ、樹木の種類を合わせずに適当にテクスチャを作成してしまったせいでイマイチというのもありますが。ちゃんと樹木を3Dモデルにすれば、かなり見栄えが良くなりますが、1本1本、木を植えていく作業をすることになるのでとてもやる気にはなれないし、このゲームだと凄く重たくなりそうです。スクリプトつくって座標・向きなどを求めて一括で置換とかできそうな気もしますが、プログラミング的なものは苦手なので、スクリプトつくるのに結構時間がかかると思うとしんどい。うーん、そっち系は避けていたけど、すこし勉強してみるかなぁ。


 バイクの方はというと、大体うまくいけたので何かバイクを作成する予定です。モンキーか NSR50 あたりがいいかな?て事で、現在資料集め中です。年内リリースを目標で、がんばろう。今回はそれほど精密には作成しない予定なので、それ程時間はかからないと思う、というかそう思いたい。前回作成したVMAX(完成まで2年もかかってしまった!)のように、だらだらとしないように気をつけよう。

 問題点は、タイヤのコリジョンの設定やマテリアル・シェーダーとか、まだちゃんと理解できていないという事ですが、まぁなんとかなるでしょう。一番の問題は MSCLoader。これをちゃんと機能させる為に、ごちゃごちゃごちゃした文字列と格闘しなければならないと思うと、頭が痛くなってくる。



2020/09/22 - 
My Summer Car
ReShade オフ

My Summer Car
ReShade オン

My Summer Car
ReShade オフ

My Summer Car
ReShade オン

My Summer Car
ReShade オフ

My Summer Car
ReShade オン

MSC
 ReShade のバージョン 4.5 以降であれば、My Summer Car に Ambient Occlusion 等の効果が正しく適用されるようになりました。

  • 有効にした Shader
    • Comic
      •  ポリゴンのエッジや色相・彩度が変化している個所に線を描画する。
    • PPFXSSDO
      •  SSDO の追加
    • qUINT_MXAO
      •  SSAO の追加

プリセット
PreprocessorDefinitions=
Techniques=Comic,PPFXSSDO,MXAO
TechniqueSorting=Comic,PPFXSSDO,MXAO

[Comic.fx]
bUIChromaEdgesDebugLayer=1
bUIColorEdgesDebugLayer=1
bUIEnableDebugLayer=0
bUIMeshEdgesDebugLayer=1
bUIOutlinesDebugLayer=1
fUIChromaEdgesDetails=0.710000
fUIChromaEdgesDistanceFading=0.000000,1.000000,0.800000
fUIChromaEdgesStrength=1.000000,1.100000
fUIColor=0.000000,0.000000,0.000000
fUIColorEdgesDetails=0.700000
fUIColorEdgesDistanceFading=0.000000,1.000000,0.800000
fUIColorEdgesStrength=1.000000,1.000000
fUIEdgesLumaWeight=0.000000,1.000000,0.800000
fUIEdgesSaturationWeight=0.000000,1.000000,0.800000
fUIMeshEdgesDistanceFading=-1.000000,0.100000,0.800000
fUIMeshEdgesStrength=3.000000,3.000000
fUIOutlinesDistanceFading=0.000000,1.000000,0.800000
fUIOutlinesStrength=1.000000,1.000000
fUIOutlinesThreshold=1.000000
fUIOverlayColor=1.000000,0.000000,0.000000
fUIStrength=0.305000
iUIChromaEdgesType=1
iUIColorEdgesType=2
iUIMeshEdgesEnable=1
iUIMeshEdgesIterations=1
iUIOutlinesEnable=1
iUIShowFadingOverlay=0

[PPFX_SSDO.fx]
pSSDOAmount=1.460000
pSSDOAngleThreshold=0.125000
pSSDOBounceLOD=2
pSSDOBounceMultiplier=0.800000
pSSDOBounceSaturation=1.000000
pSSDODebugMode=0
pSSDOFadeEnd=0.950000
pSSDOFadeStart=0.900000
pSSDOFilterRadius=8.000000
pSSDOIntensity=0.702000
pSSDOSampleAmount=10
pSSDOSampleRange=366.399994
pSSDOSourceLOD=1

[qUINT_mxao.fx]
MXAO_BLEND_TYPE=0
MXAO_DEBUG_VIEW_ENABLE=0
MXAO_FADE_DEPTH_END=0.400000
MXAO_FADE_DEPTH_START=0.050000
MXAO_GLOBAL_RENDER_SCALE=1.000000
MXAO_GLOBAL_SAMPLE_QUALITY_PRESET=2
MXAO_SAMPLE_NORMAL_BIAS=0.200000
MXAO_SAMPLE_RADIUS=2.500000
MXAO_SSAO_AMOUNT=1.000000


2020/09/07 - 
その他
  • モラルが低下すると、精確・知恵・意志などの精神能力が低下する。
  • ヘルスが低下すると、筋力・耐久・敏捷性などの身体能力が低下する。

お金の稼ぎ方
  • 高額の賞金と高価な景品でアリーナを開催して、試合に参加して勝つ。オークマスターの挑戦前だと、1回のアリーナの開催で2ゴールド稼ぐ事が可能。ストーリが進むとベースのアトラクションの数値が高くなるので、稼げる金額がより増える)
  • 試合のタイプをエキシビジョン、チームサイズを1にして効率よく試合を回す。
  • アトラクションの数値が高いほど、収益が増える。
  • 1アトラクションにつき、40〜50カッパーの収益。
  • 賞金1シルバーにつき、アトラクションが1増える。
  • 景品のアイテムで、白アイテムは20、緑アイテムは30、青アイテムは40、紫アイテムは50、黄アイテムは60のアトラクションが増える。
  • アイテム自体の価値はアトラクションには影響しない。色のランクだけで判断してるので、安いアイテムを使うのが良し。


2020/09/03 - 
GTA5


 YAMAHA VMAX できました。今回は改造パーツはありませんが、ペイントは可能です。

YAMAHA VMAX


2020/08/08 - 
その他
 UIDetect はとても便利なシェーダーですが、適用できるマスクが3つまでと少ない。そこで、もっと適用できるマスクを増やして使えるように改造をしてみました。10個以上使えるようにすると不具合が起きてしまい、それを修正する事ができなかったので、適用できるマスクは9個までです。改造するのはUIDetect.fxの方で、変更内容は以下の通り。

38行目あたりにある下記の個所を
#if (UIDetect_USE_RGB_MASK == 1)
    texture texUIDetectMask <source="UIDetectMaskRGB.png";>
    { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; Format=RGBA8; };
    sampler UIDetectMask { Texture = texUIDetectMask; };
#endif

以下の様に変更する。
#if (UIDetect_USE_RGB_MASK == 1)
    texture texUIDetectMask_1 <source="UIDetectMaskRGB.png";>
    { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; Format=RGBA8; };
    sampler UIDetectMask_1 { Texture = texUIDetectMask_1; };

    texture texUIDetectMask_2 <source="UIDetectMaskRGB_2.png";>
    { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; Format=RGBA8; };
    sampler UIDetectMask_2 { Texture = texUIDetectMask_2; };

    texture texUIDetectMask_3 <source="UIDetectMaskRGB_3.png";>
    { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; Format=RGBA8; };
    sampler UIDetectMask_3 { Texture = texUIDetectMask_3; };

#endif


98行目あたりにある下記の個所を
    #if (UIDetect_USE_RGB_MASK == 1)
        float3 uiMaskRGB = 1 - tex2D(UIDetectMask, texcoord).rgb;
        float3 uiMask = 0;

        if      (ui > .39) uiMask = 1;            //UI-Nr >3 -> apply no mask
        else if (ui > .29) uiMask = uiMaskRGB.b;  //UI-Nr  3 -> apply masklayer blue
        else if (ui > .19) uiMask = uiMaskRGB.g;  //UI-Nr  2 -> apply masklayer green
        else if (ui > .09) uiMask = uiMaskRGB.r;  //UI-Nr  1 -> apply masklayer red
        color = lerp(color, colorOrig, uiMask);
    #else

以下の様に変更する。
    #if (UIDetect_USE_RGB_MASK == 1)

        float3 uiMaskRGB;	

             if (ui > .69) uiMaskRGB = 1 - tex2D(UIDetectMask_3, texcoord).rgb;
        else if (ui > .39) uiMaskRGB = 1 - tex2D(UIDetectMask_2, texcoord).rgb;
        else if (ui > .09) uiMaskRGB = 1 - tex2D(UIDetectMask_1, texcoord).rgb;

        float3 uiMask = 0;

			 if  (ui > .99) uiMask = 1;            //UI-Nr >9 -> apply no mask
        else if (ui > .89) uiMask = uiMaskRGB.b;  //UI-Nr  9 -> apply masklayer blue
        else if (ui > .79) uiMask = uiMaskRGB.g;  //UI-Nr  8 -> apply masklayer green
        else if (ui > .69) uiMask = uiMaskRGB.r;  //UI-Nr  7 -> apply masklayer red

        else if (ui > .59) uiMask = uiMaskRGB.b;  //UI-Nr  6 -> apply masklayer blue
        else if (ui > .49) uiMask = uiMaskRGB.g;  //UI-Nr  5 -> apply masklayer green
        else if (ui > .39) uiMask = uiMaskRGB.r;  //UI-Nr  4 -> apply masklayer red

        else if (ui > .29) uiMask = uiMaskRGB.b;  //UI-Nr  3 -> apply masklayer blue
        else if (ui > .19) uiMask = uiMaskRGB.g;  //UI-Nr  2 -> apply masklayer green
        else if (ui > .09) uiMask = uiMaskRGB.r;  //UI-Nr  1 -> apply masklayer red


        
        color = lerp(color, colorOrig, uiMask);
      
    #else


全文
変更前
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// UIDetect by brussell
// v. 2.0
// License: CC BY 4.0
//
// UIDetect is configured via the file UIDectect.fxh. Please look
// there for a full description and usage of this shader.
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#include "ReShadeUI.fxh"

uniform float fPixelPosX < __UNIFORM_SLIDER_FLOAT1
    ui_label = "Pixel X-Position";
    ui_category = "Show Pixel";
    ui_min = 0; ui_max = BUFFER_WIDTH;
    ui_step = 1;
> = 100;

uniform float fPixelPosY < __UNIFORM_SLIDER_FLOAT1
    ui_label = "Pixel Y-Position";
    ui_category = "Show Pixel";
    ui_min = 0; ui_max = BUFFER_HEIGHT;
    ui_step = 1;
> = 100;

#include "ReShade.fxh"
#include "UIDetect.fxh"

#define epsilon 0.00001

//textures and samplers
texture texColorOrig { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; };
sampler ColorOrig { Texture = texColorOrig; };

texture texUIDetect { Width = 1; Height = 1; Format = R8; };
sampler UIDetect { Texture = texUIDetect; };

#if (UIDetect_USE_RGB_MASK == 1)
    texture texUIDetectMask <source="UIDetectMaskRGB.png";>
    { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; Format=RGBA8; };
    sampler UIDetectMask { Texture = texUIDetectMask; };
#endif

//pixel shaders
float3 PS_ShowPixel(float4 pos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target
{
    float2 pixelCoord = float2(fPixelPosX, fPixelPosY) * BUFFER_PIXEL_SIZE;
    float3 pixelColor = tex2Dlod(ReShade::BackBuffer, float4(pixelCoord, 0, 0)).xyz;
    return pixelColor;
}

float PS_UIDetect(float4 pos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target
{
    float3 pixelColor, uiPixelColor;
    float2 pixelCoord;
    float diff;
    float ui = 1;
    bool uiDetected = false;
    bool uiNext = false;

    for (int i=0; i < PIXELNUMBER; i++)
    {
        [branch]
        if (UIPixelCoord_UINr[i].z - ui < epsilon){
            if (uiNext == false){
                pixelCoord = UIPixelCoord_UINr[i].xy * BUFFER_PIXEL_SIZE;
                pixelColor = round(tex2Dlod(ReShade::BackBuffer, float4(pixelCoord, 0, 0)).rgb * 255);
                uiPixelColor = UIPixelRGB[i].rgb;
                diff = abs(dot(pixelColor - uiPixelColor, 0.333));
                if (diff < epsilon) {
                    uiDetected = true;
                }else{
                    uiDetected = false;
                    uiNext = true;
                }
            }
        }else{
            if (uiDetected == true){ return ui * 0.1; }
            ui += 1;
            uiNext = false;
            i -= 1;
        }
    }
    return uiDetected * ui * 0.1;
}

float4 PS_StoreColor(float4 pos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target
{
    return tex2D(ReShade::BackBuffer, texcoord);
}

float4 PS_RestoreColor(float4 pos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target
{
    float ui = tex2D(UIDetect, float2(0,0)).x;
    float4 colorOrig = tex2D(ColorOrig, texcoord);
    float4 color = tex2D(ReShade::BackBuffer, texcoord);
    
    #if (UIDetect_USE_RGB_MASK == 1)
        float3 uiMaskRGB = 1 - tex2D(UIDetectMask, texcoord).rgb;
        float3 uiMask = 0;

        if      (ui > .39) uiMask = 1;            //UI-Nr >3 -> apply no mask
        else if (ui > .29) uiMask = uiMaskRGB.b;  //UI-Nr  3 -> apply masklayer blue
        else if (ui > .19) uiMask = uiMaskRGB.g;  //UI-Nr  2 -> apply masklayer green
        else if (ui > .09) uiMask = uiMaskRGB.r;  //UI-Nr  1 -> apply masklayer red
        color = lerp(color, colorOrig, uiMask);
    #else
        color = ui > epsilon ? colorOrig : color;
    #endif
    return color;
}

//techniques
technique UIDetect_ShowPixel
{
    pass {
        VertexShader = PostProcessVS;
        PixelShader = PS_ShowPixel;
    }
}

technique UIDetect
{
    pass {
        VertexShader = PostProcessVS;
        PixelShader = PS_UIDetect;
        RenderTarget = texUIDetect;
    }
}

technique UIDetect_Before
{
    pass {
        VertexShader = PostProcessVS;
        PixelShader = PS_StoreColor;
        RenderTarget = texColorOrig;
    }
}

technique UIDetect_After
{
    pass {
        VertexShader = PostProcessVS;
        PixelShader = PS_RestoreColor;
    }
}

変更後
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// UIDetect by brussell
// v. 2.0
// License: CC BY 4.0
//
// UIDetect is configured via the file UIDectect.fxh. Please look
// there for a full description and usage of this shader.
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#include "ReShadeUI.fxh"

uniform float fPixelPosX < __UNIFORM_SLIDER_FLOAT1
    ui_label = "Pixel X-Position";
    ui_category = "Show Pixel";
    ui_min = 0; ui_max = BUFFER_WIDTH;
    ui_step = 1;
> = 100;

uniform float fPixelPosY < __UNIFORM_SLIDER_FLOAT1
    ui_label = "Pixel Y-Position";
    ui_category = "Show Pixel";
    ui_min = 0; ui_max = BUFFER_HEIGHT;
    ui_step = 1;
> = 100;

#include "ReShade.fxh"
#include "UIDetect.fxh"

#define epsilon 0.00001

//textures and samplers
texture texColorOrig { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; };
sampler ColorOrig { Texture = texColorOrig; };

texture texUIDetect { Width = 1; Height = 1; Format = R8; };
sampler UIDetect { Texture = texUIDetect; };

#if (UIDetect_USE_RGB_MASK == 1)
    texture texUIDetectMask_1 <source="UIDetectMaskRGB.png";>
    { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; Format=RGBA8; };
    sampler UIDetectMask_1 { Texture = texUIDetectMask_1; };

    texture texUIDetectMask_2 <source="UIDetectMaskRGB_2.png";>
    { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; Format=RGBA8; };
    sampler UIDetectMask_2 { Texture = texUIDetectMask_2; };

    texture texUIDetectMask_3 <source="UIDetectMaskRGB_3.png";>
    { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; Format=RGBA8; };
    sampler UIDetectMask_3 { Texture = texUIDetectMask_3; };

#endif

//pixel shaders
float3 PS_ShowPixel(float4 pos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target
{
    float2 pixelCoord = float2(fPixelPosX, fPixelPosY) * BUFFER_PIXEL_SIZE;
    float3 pixelColor = tex2Dlod(ReShade::BackBuffer, float4(pixelCoord, 0, 0)).xyz;
    return pixelColor;
}

float PS_UIDetect(float4 pos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target
{
    float3 pixelColor, uiPixelColor;
    float2 pixelCoord;
    float diff;
    float ui = 1;
    bool uiDetected = false;
    bool uiNext = false;

    for (int i=0; i < PIXELNUMBER; i++)
    {
        [branch]
        if (UIPixelCoord_UINr[i].z - ui < epsilon){
            if (uiNext == false){
                pixelCoord = UIPixelCoord_UINr[i].xy * BUFFER_PIXEL_SIZE;
                pixelColor = round(tex2Dlod(ReShade::BackBuffer, float4(pixelCoord, 0, 0)).rgb * 255);
                uiPixelColor = UIPixelRGB[i].rgb;
                diff = abs(dot(pixelColor - uiPixelColor, 0.333));
                if (diff < epsilon) {
                    uiDetected = true;
                }else{
                    uiDetected = false;
                    uiNext = true;
                }
            }
        }else{
            if (uiDetected == true){ return ui * 0.1; }
            ui += 1;
            uiNext = false;
            i -= 1;
        }
    }
    return uiDetected * ui * 0.1;
}

float4 PS_StoreColor(float4 pos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target
{
    return tex2D(ReShade::BackBuffer, texcoord);
}

float4 PS_RestoreColor(float4 pos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target
{
    float ui = tex2D(UIDetect, float2(0,0)).x;
    float4 colorOrig = tex2D(ColorOrig, texcoord);
    float4 color = tex2D(ReShade::BackBuffer, texcoord);
    
    #if (UIDetect_USE_RGB_MASK == 1)

        float3 uiMaskRGB;	

             if (ui > .69) uiMaskRGB = 1 - tex2D(UIDetectMask_3, texcoord).rgb;
        else if (ui > .39) uiMaskRGB = 1 - tex2D(UIDetectMask_2, texcoord).rgb;
        else if (ui > .09) uiMaskRGB = 1 - tex2D(UIDetectMask_1, texcoord).rgb;

        float3 uiMask = 0;

             if (ui > .99) uiMask = 1;            //UI-Nr >9 -> apply no mask
        else if (ui > .89) uiMask = uiMaskRGB.b;  //UI-Nr  9 -> apply masklayer blue
        else if (ui > .79) uiMask = uiMaskRGB.g;  //UI-Nr  8 -> apply masklayer green
        else if (ui > .69) uiMask = uiMaskRGB.r;  //UI-Nr  7 -> apply masklayer red

        else if (ui > .59) uiMask = uiMaskRGB.b;  //UI-Nr  6 -> apply masklayer blue
        else if (ui > .49) uiMask = uiMaskRGB.g;  //UI-Nr  5 -> apply masklayer green
        else if (ui > .39) uiMask = uiMaskRGB.r;  //UI-Nr  4 -> apply masklayer red

        else if (ui > .29) uiMask = uiMaskRGB.b;  //UI-Nr  3 -> apply masklayer blue
        else if (ui > .19) uiMask = uiMaskRGB.g;  //UI-Nr  2 -> apply masklayer green
        else if (ui > .09) uiMask = uiMaskRGB.r;  //UI-Nr  1 -> apply masklayer red


        
        color = lerp(color, colorOrig, uiMask);
      
    #else
        color = ui > epsilon ? colorOrig : color;
    #endif
    return color;
}

//techniques
technique UIDetect_ShowPixel
{
    pass {
        VertexShader = PostProcessVS;
        PixelShader = PS_ShowPixel;
    }
}

technique UIDetect
{
    pass {
        VertexShader = PostProcessVS;
        PixelShader = PS_UIDetect;
        RenderTarget = texUIDetect;
    }
}

technique UIDetect_Before
{
    pass {
        VertexShader = PostProcessVS;
        PixelShader = PS_StoreColor;
        RenderTarget = texColorOrig;
    }
}

technique UIDetect_After
{
    pass {
        VertexShader = PostProcessVS;
        PixelShader = PS_RestoreColor;
    }
}






 9個では足りなく、もっと適用できるマスクが欲しかったりマスクを重ねたい場合は、UIDetect.fx, UIDetect.fxhを複製して使用します。複製した方のUIDetect.fx#include "ReShadeUI.fxh"texColorOrigtexUIDetectが元のUIDetect.fxと被らないように適当に名前を変更してください。同様のシェーダーを重複してエフェクトをかけるのは無駄に負荷をかける気もしますが、このシェーダーは大した影響もなさそうなので、たぶん大丈夫、でしょう。

最初前5 89・[10]・1112 次5最後


Youtube Twitter


 当サイトはPC版ゲームのMODを中心に取り扱うなか、私gosukeのたわ言をつらつらと記録しています。(MODとはModification、元のゲームに様々な要素を追加・改変する事で、オリジナルのゲームよりさらに楽しめる幅が広がります。)

 また、リンクフリーではありますが、ファイルへの直リンクは出来ればご遠慮お願い致します。バナーでリンクする場合は下にあるバナーを使用して下さい。

管理者:gosuke

banner

意見、要望、感想、叱咤、激励、などなどありましたら下の意見箱または X(旧Twitter) までメッセージをどうぞ。
意見箱