SceneKit Shader에 변수 넣기

J·2023년 5월 26일
0

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

ShaderModifier로 scn node에 shader 적용하기

  1. xcode 에서 New File > empty > 원하는쉐이더이름.shader 로 새로운 파일을 만든다.
  2. 쉐이더 파일 안에 함수를 쓴다. 자세한 문법과 예시는 위의 링크에 나와있다.
  3. 쉐이더를 붙여야 하는 SCNnode에 적용한다.
  4. 쉐이더에 변수를 넣어준다.

조금 더 자세히 원하는 scn 파일을 불러와서 쉐이더를 붙이고 변수를 적용하는 코드를 백업한다.

  1. scn 파일을 SCNnode로 가져오기
	// 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)
  1. 쉐이더에서도 할 수 있는 것 같지만 만약 custom color나 Material을 지정하고 싶다면 custom Material을 만들어서 넣어주면 된다.
	// 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]
  1. 쉐이더를 적용한다.
    "myShader"에 자신이 만든 Shader를 넣으면 된다. String으로 넣어야 한다.
mySCNNode.geometry?.shaderModifiers = [
            .geometry: getShader(from: "myShader")
        ]
  1. 쉐이더에 변수를 넣는다. 여기서는 두개의 변수에 넣어줬다.
mySCNNode.geometry?.firstMaterial?.setValue(8.0, forKey: "differRatio")

mySCNNode.geometry?.firstMaterial?.setValue(0.9, forKey: "ciRatio")

저 변수 전달 때문에 하루를 꼬박날렸는데... SetValue 가지고 이것저것 뒤지다가 발견했다. 솔직히 원리는 아직도 정확히는... 모르겠다. 나중에 SceneKit으로 제대로 앱을 만들어봐야지...

profile
재이의 삽질일기, 근데 발전을 곁들인

0개의 댓글