3D 관련 개발을 하다보면 쉐이더에 변수를 넣어야하는 경우가 종종 생기는데... 나는 남들처럼 setValue해도 안됐다... 예상은 여러가지가 있는데 일단 Metal을 쓴게 아니라 .shader 파일을 따로 만들어서 shadermodifier로 쉐이더를 불러왔고, 노드자체도 따로 geometry를 변수에 할당한 게 아니라 그냥 node.geometry로 했다.
어쨋든 명확한 이유는 알 수 없지만 일단 나중을 위해 백업한다.
일단 쉐이더 자체는 그냥 내가 알아서 만들었는데 아래 레퍼런스들 참고했다. 이 아저씨가 코드도 공개했고 설명도 친절해서 이거 포스팅 3개 읽고다면 대충 이해가 간다.
ARkit + Scenekit Basic Tutorial
https://maxxfrazer.medium.com/arkit-scenekit-shaders-intro-99df65137006
ARkit + Scenekit Shader
https://maxxfrazer.medium.com/arkit-scenekit-shaders-intro-99df65137006
조금 더 자세히 원하는 scn 파일을 불러와서 쉐이더를 붙이고 변수를 적용하는 코드를 백업한다.
// SCNScene 만들기
let mySCNScene = SCNScene(named: "myScnFile.scn")
//빈 SCNnode 생성 (얘가 가져온 파일의 parentNode가 되어준다...)
let parentSCN = SCNnode()
//position 맞춰주기
parentSCN.position = SCNVector3(x: 0.0, y: 0.0, z: 0.0)
//원하는 scn 파일을 붙여줄 노드를 만든다.
let mySCNNode = mySCNScene?.rootNode.childNodes.first
//만든 SCN node를 parent에 붙여준다
parentSCN.addChildNode(mySCNNode)
// custom Material 만들기
var customMaterial = SCNMaterial()
customMaterial.isDoubleSided = false
customMaterial.diffuse.contents = UIColor(red: 255, green: 0, blue: 0, alpha: 1.0)
// custom Material 적용하기
mySCNNode.geometry?.materials = [customMaterial]
mySCNNode.geometry?.shaderModifiers = [
.geometry: getShader(from: "myShader")
]
mySCNNode.geometry?.firstMaterial?.setValue(8.0, forKey: "differRatio")
mySCNNode.geometry?.firstMaterial?.setValue(0.9, forKey: "ciRatio")
저 변수 전달 때문에 하루를 꼬박날렸는데... SetValue 가지고 이것저것 뒤지다가 발견했다. 솔직히 원리는 아직도 정확히는... 모르겠다. 나중에 SceneKit으로 제대로 앱을 만들어봐야지...