본문 바로가기
유니티 엔진

URP 에서 나무 (SpeedTree)의 엠비언트가 검게 나올 때

by 대마왕J 2020. 8. 17.


요런 경우인데, 


사실 모바일 중심에다가 URP 에서 누가 스피드 트리를 쓰나.. 싶은 한국 환경에서 별로 관심없을 내용인게 맞긴 하지만 

어쨌건 나는! 스피드 트리를 쓰는데 엠비언트가 검게 나와서!!!

라이트 프로브도 구워보고 별짓 다 해 봤지만 결론으로 그냥 엠비언트가 안나온다는 결론에 도달. 

SH 연산이 패스되고 있구나.. 싶은 생각이 들었던 것이었다. 


그래서 일단 구글링.. 을 해보니 

과연 있었네요. 역시 구글링


https://forum.unity.com/threads/still-no-speedtree-support.894025/?_ga=2.107763586.1470992922.1597595493-1770143334.1577213009#post-5946692


일단 내용은 여기 

여기의 두 셰이더만 받아서 기존 URP 내장의 스피드트리 셰이더만 바꿔주면 됩니다. 




저 두 개를 받아서 교체하는 법은 다음과 같습니다. 

아래 폴더를 찾아갑니다. 





빌보드 셰이더를 제외하고 SpeedTree7 에 관련된 셰이더는 전부 복사합니다. 빌보드는 뭐 별 문제가 없어서. 

당연히 메타파일들은 가져오지 않도록 조심. 






이 파일들을 Asset 폴더 아래의 적당한 폴더에 카피해 놓습니다. 

패키지 폴더에 그냥 두면, 껐다 켤 때마다 복구하려 덤벼들기 때문에 이렇게 따로 복사해 주는 겁니다. 

이제 이걸 수정하면 끝. 





그리고 이 카피해 놓은 두 개의 셰이더를 참고해서 수정합니다. 

간단하게는 저 구글링한 두 셰이더를 카피해서 덮어쓰기 하는게 최고지요. 

굳이 수정하겠다면 아래 글을 참고하시면 되겠지만 저건 저만 보려고 만든거라 보기 힘드실테고, 저 셰이더를 분석하시는게 낫습니다.

 



그리고 생성되어 있는 SpeedTree Material을 전부 선택하고, 셰이더 이름을 SpeedTree7(Fixed)로 바꿔줍니다. 

새로 카피한 셰이더는 친절하게도 이름이 (Fixed)로 바뀌어 있어요 . 겹치지 않게 하려는 배려겠지요. 




그러면 끝....








아래는 분석용 백업글입니다. 

저만보려고 대충 썼어요 







일단 SpeedTree7.shader 파일의 
 #include "SpeedTree7Input.hlsl"

 #include "SpeedTree7Passes.hlsl"

인 부분들을 

#include "Packages/com.unity.render-pipelines.universal/Shaders/Nature/SpeedTree7Input.hlsl"

#include "Packages/com.unity.render-pipelines.universal/Shaders/Nature/SpeedTree7Passes.hlsl"로 바꿔주어야 합니다. 경로를 못찾아요. 패키지 안에 들어 있는거라서 경로를 확실히 해줘야 함. 


그 뒤 SpeedTree7CommonPasses.hlsl 에서 버텍스 아웃풋에서 

float4 lightmapUVOrVertexSH : TEXCOORD8;

로 8번 레지스터를 버텍스 SH 좌표로 받아오고요 


OUTPUT_SH(inputData.normalWS.xyz, input.lightmapUVOrVertexSH.xyz); 

로 SH 연산을 추가해준다음에 

 inputData.bakedGI = half3(0, 0, 0); // No GI currently. 이렇게 검은색이 들어있는 GI 부분을 

inputData.bakedGI = SAMPLE_GI(input.lightmapUVOrVertexSH.xy, input.lightmapUVOrVertexSH.xyz, inputData.normalWS);


로 바꿔 줘야 합니다. 



간단하긴 한데 은근히 귀찮아서, 그냥 저 파일을 받아서 바꿔주는 쪽으로 해결하시길. 
아니면 그냥 나무용 셰이더를 따로 만드는게 간단하고 빠를듯 . 
굳이 스피드트리용 셰이더를 쓰시려면 이걸 쓰시면 되고요 .







ps. 사실상 해 보니 SpeedTree7CommonPasses.hlsl

파일만 수정해도 잘 작동은 되더군요 








반응형

댓글