대강 내용이 정리된 거 같아서 올림

마지막에 뭘 하면 되는지 내용 정리있음

일단 전무를 끼지 않은 경우 낫과 관련된 셰이더가 둘 존재함

376ed108337a2d59-ps -> 낫 주위의 오라 같은 효과

434be8f4f7e5e73c-ps -> 낫의 날

정도로 이해하고 보면 됨.
둘의 코드 구조 자체는 크게 차이가 없고, 두 개 정도 차이가 존재 함
두 코드를 뜯어보면 공통적으로

// Output signature:

//

// Name                 Index   Mask Register SysValue  Format   Used

// -------------------- ----- ------ -------- -------- ------- ------

// SV_Target                0   xyzw        0   TARGET   float   xyzw
//
라는 부분이 존재하는데, o0.xyzw가 해당 낫의 R,G,B값과 W - 채도 출력값이라고 알면 됨
즉, 우리 화면에 뜨는 색깔 및 채도는 저걸 건들면 바뀐다는 의미

그걸 알고 위에 코드를 보면
두 코드 모두

  if (r1.y != 0) {

    r1.y = t2.Load(float4(0,0,0,0)).y;

    r1.y = -1 + r1.y;

    r1.y = cb0[74].x * r1.y + 1;

    o0.xyz = r1.yyy * r0.xyz;

  } else {

    o0.xyz = r0.xyz;

  }

라는 부분이 존재함.
즉, o0.xyz => R, G, B 값은 
r1.y != 0일 경우 r1.yyy라는 요소와, r0.xyz 요소
아닐 경우에는 r0.xyz 요소의 영향만 받는다고 함.

r1.y에 관한 정보는 저 윗줄을 보면
  r1.y = cmp(0 < cb0[74].x);
라고 되어있는데, cb0[74] 라는 건 맨 위를 보면

cbuffer cb0 : register(b0)

{  float4 cb0[92]; }
라고 함. 어떠한 게임내의 상황을 상수로 표현해서 RGB 표현에 영향을 준다는 거임.
정확한 기준은 내가 알아내지 못했는데, 저게 광원과 캠의 위치를 의미하는 거 같았음.
광원이나 캠이 영향을 줄 경우에 저쪽에 코드를 다시 짜고 r1.yyy 부분에 해당하는 만큼 RGB값을 다시 계산해서 뽑아야 하는데 저게 영향을 줄 때 엄청나게 큰 영향을 주는것도 아니고 복잡해져서 패스함


그러면 RGB는 r0.xyz의 영향만 받는다는 의미가 됨. r0.xyzw에 관한 의미는 위에 있긴 한데 굳이 알 필요는 없을것 같으니 패스

그러니까 RGB를 건들려면 다음과 같이 R,G,B를 따로 계산할 수 있도록 코드를 바꿔주면 됨

  } else {

    o0.xyz = r0.xyz;

  }

    o0.x = r0.x * 1 + 0;            // R

    o0.y = r0.y * 1 + 0;            // G

    o0.z = r0.z * 1 + 0;            // B


이렇게 하고 *1 부분과 +0 부분에 숫자를 조정해서 원하는 색을 뽑을 수 있음.

여기서 * 1과 0이 따로 존재하는데, 우선 수치를 세밀하게 조절하기 위한 게 첫 번째 이유고, 제일 처음 말한 두 셰이더의 차이가 있어서 그럼.
자세하게 설명하자면, 아까 전에 야매로 조절하는 글 썼을 때는 색상 출력 요소인 r0를 고려하지 않고 가산 하기만 했는데, 그러면 해당 셰이더를 그저 해당 색상으로 덮어버리는 거고, 이렇게 변수를 곱하면 출력할 요소에 R,G,B 데이터를 추가해서 셰이더를 출력한다고 생각하면 될 거임.
그러면 r0.xyz의 값이 존재해야 곱해서 출력 색상이 변경될 건데, 낫 주위의 셰이더의 경우에는 이 r0.z 값이 없음. 그래서 주위에 파란 효과를 주고 싶어도 r0.z에 곱해도 파란색 효과가 안나옴. 이런 경우에 파란색 효과를 넣고 싶으면 가산해서 추가할 수 있다고 생각하면 됨.

낫 주위 말고, 낫의 날 부분은 r0.xyz 데이터가 정상적으로 존재하는 거 같아서 승산 만으로 표현해도 될 것 같긴 함.

이렇게 RGB 값을 조절하고, 추가적으로 채도값을 알아볼 건데, 채도 값은 마지막 줄에 있음.
o0.w = saturate(cb0[74].z * r0.x * 1 + 0);    // 채도

채도라고는 했는데, 사실 여기도 차이가 존재해서 낫의 날 셰이더의 경우에는 조금 다른 의미가 있는거 같음. 직접 해보면서 판단ㄱ

여기서는 승산과 가산의 의미가 완전히 다른데, 기본적으론 승산만 해서 채도를 뽑아야 함.

설명을 잘 하지는 못하겠는데, 이게 낫 주위의 효과가 완전히 분리되어서 떠있는 게 아니라 어떤 평평한 판 위에 얘네가 그려진 전체가 셰이더로 표현되었다고 생각하면 됨.
이게 뭔 개소린가 싶으면 다음 사진을 보면 이해 가능할 것


이렇게 됨 ㅇㅇ 그러니까 낫 주위 채도를 계산할 때는 무조건 승산으로 값을 조절해야 함
낫 날 셰이더를 건들때는 가산이 가능한데, 이때는 +가 아닌 -도 가능함. 다만, -0.0n 수준으로 엄청 작은 수치를 입력해도 전체적으로 어두워지는데, 투명도와 연관이 있는가 싶기도 함

이게
o0.x = r0.x * 1;
o0.y = r0.y * 10;
o0.z = r0.z * 10;
에다가
w값에 *1과 -0.02를 한 결과임. 채도라기엔 뭔가 의미가 안맞는 느낌


그리고 최종적으로 이 셰이더가 어디에 또 쓰이는지 모르니까 이 셰이더를 아를레키노에만 할당해야 함

그래서 나는 ini파일을 따로 만들어서

[Constants]

global $scythe


[Present]

post $scythe = 0

run = CommandListArlecchinoControl


[TextureOverrideArlecchinoPosition]

hash = 44e3487a

match_priority = 2

$scythe = 1


; CommandList -------------------------


[CommandListArlecchinoControl]

if $scythe == 1

    x199 = 1

else if $scythe== 0

    x199 = 0

endif
라는 파일을 만들고

두 셰이더 파일에
//3Dmigoto declarations 라는 부분의 마지막 줄에
#define ARL IniParams [199].x 라고 쓰고
아까 정의했던 R, G, B, w 값에 대해 조건문을 달면 됨


  if (ARL == 1) {

    o0.x = r0.x * 1 + 0;            // R

    o0.y = r0.y * 1 + 0;            // G

    o0.z = r0.z * 1 + 0;            // B

}

그리고

  if (ARL == 1) {

  o0.w = saturate(cb0[74].z * r0.x);     // 채도

} else {

  o0.w = saturate(cb0[74].z * r0.x);

}


이렇게 쓰면 아를레키노가 나왔을때만 저 셰이더가 작동함

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

총정리하자면

1. 아를레키노 낫의 셰이더는 

376ed108337a2d59-ps -> 낫 주위의 효과

434be8f4f7e5e73c-ps -> 낫의 날


2. 아를레키노가 있을때만 셰이더 작동하도록 ini파일 만들기

[Constants]

global $scythe


[Present]

post $scythe = 0

run = CommandListArlecchinoControl


[TextureOverrideArlecchinoPosition]

hash = 44e3487a

match_priority = 2

$scythe = 1


; CommandList -------------------------


[CommandListArlecchinoControl]

if $scythe == 1

    x199 = 1

else if $scythe== 0

    x199 = 0

endif

3. 셰이더 파일 편집하기

// 3Dmigoto declarations

#define cmp -

Texture1D<float4> IniParams : register(t120);

Texture2D<float4> StereoParams : register(t125);

#define ARL IniParams [199].x


그리고

    o0.xyz = r0.xyz;

  }


  if (ARL == 1) {

    o0.x = r0.x * 1 + 0;            // R

    o0.y = r0.y * 1 + 0;            // G

    o0.z = r0.z * 1 + 0;            // B

}


  r0.x = cb0[75].w * r0.w;

  r0.x = r0.x * r1.x;


  if (ARL == 1) {

  o0.w = saturate(cb0[74].z * r0.x*1)+0;     // 채도

} else {

  o0.w = saturate(cb0[74].z * r0.x);

}


  return;

}


4. 두 파일 모두 동일하게 o0.xyz,w 부분에 *1과 +0 부분의 수치를 조절해 원하는 색상 맞추기

단, 낫 주위의 효과에 파란색을 줄 경우 *1이 아닌 +0 부분을 조절해야 파란색 조절 가능

그리고 낫 주위 효과의 w값을 건들 경우 +0 값은 조절하면 이상하게 나옴.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

낫 부분은 간단해서 빠르게 확인하고 글 쓰는데, 사실 아를 무기이펙트 관련해서 한 셰이더 파일이 더 있음

저걸 조절하는 셰이더 파일이 존재하고

9daa72f386d5a454-ps 임

똑같이 o0.xyzw 값을 조절하는 부분을 찾아봤는데

  o0.xyz = cb0[92].xyz * r0.yzw;

라는 부분과

  o0.w = saturate(cb0[95].x * r0.x);

라는 부분이 존재했는데,

위 사진 같은 경우엔 xyz 값 전체에 2를 곱해서 녹색으로 나오고 있음

더 자세하게 뜯어보려면 어떻게 변수들을 나눠서 식을 맞춰야 할지 좀 알아봐야 할 부분이 있어서 쓰진 않았고

필요한 사람이 있으면 한번 이쪽도 건들여 보면 좋을 듯



마지막으로 수치 좀 넣어서 초록색으로 만들었는데 

블랙 록 슈터에 녹색 낫쓰는 친구 있지 않았나?

걔 스킨 씌우고 창 조금 모델 손 본 다음에 스킬 이펙트도 녹색으로 맞추면 이쁘겠다 이거