TIL

2024 12 01 TIL

noc777 2024. 12. 1. 18:33

금요일에는 이미션 기능에 대한 코드작성의 실마리를 알아왔었다.

material.SetColor 로 이미션 속성의 색상을 지정하였는데

이외의 기능들에 관해서 알아보고 또 기능들의 차이에 대해서 정리가 필요해보였다.

 

일단 그래픽스와 쉐이더 머터리얼 등 내가 컴공과가 아니라서 놓친 개념들이 꽤 많은 것 같지만

이것을 알아보기엔 최종프로젝트의 기간을 생각하여야 하기에 참는다.

(나중에 공부할 땐 컴공과 친구한테 자료 좀 공유해달라고 해야할 거 같다.)

 

내가 알고 사용하는 것은 개념들의 일부이며 나중에 따로 공부해야할 것임을 명시해둔다.

 

이번에 접근해야할 것은 머터리얼이다. 

 

머터리얼(Material)

 

오브젝트의 머터리얼에 접근하기 위해선 해당 오브젝트의 랜더러 컴포넌트에 먼저 접근한 후

그 랜더러 컴포넌트의 머터리얼에 접근해야한다.

Renderer renderer = GetComponent<Renderer>(); //해당 오브젝트의 렌더러 컴포넌트 기능을 가져옴
Material material = renderer.material;    //렌더러 컴포넌트에서 다시 material 기능에 접근

 

이렇게 접근하는 이유는 좀 더 찾아봐야겠지만 Renderer 컴포넌트 안에 Material를 관리제어하는 기능 또한 포함되어 있다는 것을 알아두고 가야 나중에 공부할 때 편할 것 같다.

 

지난 시간에 하얀 색상의 이미션 효과를 주기 위해서 머터리얼에서 SetColor 프로퍼티에 접근하여  

"_EmissionColor"라는 키워드로 접근하였다. 

material.SetColor("_EmissionColor",Color.white); //문자열로 키워드 접근

 

좀 더 살펴보니 예상대로 이 프로퍼티 또한 인트ID값으로 이것을 조작할 수 있는 것으로 보인다.  

약간의 성능 향상을 위해선 미리 인트ID 값을 캐싱해서 사용하는 것이 좋아보였다.

 

private int emissionColorID; //이미션 컬러속성을 사용할 때 쓰는 ID 

 emissionColorID = Shader.PropertyToID("_EmissionColor"); //위의 변수를 할당해주는 코드
 
 _material.SetColor(emissionColorID,Color.white); //이제 SetColor에 ID로 조작이 가능

int 변수를 하나 만들어주고 

변수에 Shader.PropertyToID();  로  위에서 사용하였던

"_EmissionColor"라는 문자열 키워드를 정수형 ID로 바꾸어주었다.

 

찾다보니 거의 모든 문자열로 작동하는 방식의 프로퍼티 키워드는 이런 정수형 ID로 바꾸어 사용해줄 수 있는 것 같다.

 

 

그런데 막상이렇게 색상을 바꿔주고 나니 다른 옵션에 대해서 생각해보게 된다.  

이 색은 어떻게 꺼주지?  SetColor() 를 할때 Color.Black으로

꺼져있는 것과 비슷한 효과를 줄 수는 있지만 꺼져있다고 보기는 힘들다. 

또한 이미션 강도라는 옵션을 보았는 데 SetColor로는 조작이 안되는 듯하다.  

 

색상이외의 조작에 대해서

 

그래서 좀 더 찾아본 결과 EnableKeyword와 DisableKeyword 를 사용하여

이미션 옵션을 켜고 끄고 할수 있다는 것을 알게 되었다. 

 

EnableKeyword와 DisableKeyword 는 문자열 키워드만 받는 것 같다.

EnableKeyword와 DisableKeyword

material.EnableKeyword("_EMISSION"); //이미션 효과 활성화
material.DisableKeyword("_EMISSION"); //이미션 효과 비활성화

 

이 키워드를 사용하면 이미션의 기능을 켜고 끌 수 있다. 

 

또한 이미션의 다른 기능들은 SetFloat 로 사용이 가능한데 

material.SetTexture("_EmissionMap", emissionTexture); //설정한 특정 영역에만 빛나게 하는 효과를 주고 싶을 때

material.SetFloat("_EmissionIntensity", 1.0f); //이미션 강도

 

SetTexture로 EmissionMap에 접근하는 경우 이미션을 적용할 텍스쳐를 따로 만들어서 사용해야 할 것 같다. 

SetFloat 로 강도를 조절하는 것은 밝기 강도를 의미한다.

 

 

 

 

 

 

'TIL' 카테고리의 다른 글

2024 12 03 TIL  (1) 2024.12.03
2024 12 02 TIL  (0) 2024.12.02
2024 11 29 TIL  (0) 2024.11.29
2024 11 28 TIL  (0) 2024.11.28
2024 11 27 TIL  (0) 2024.11.27