2017-12-06 13 views
0

나는 sin 파동으로 모든 verts를 움직이는 간단한 셰이더를 작성하려고합니다.법선을 다시 계산하는 방법?

v.vertex.y += sin(_Time.y * _Speed + v.vertex.x * _Amount * v.vertex.z) * _Distance; 

문제는 이동 후 법선이 잘못되어 실시간 그림자가 없음을 의미합니다. 나는 많은 것을 수색했으며 가짜 이웃을 사용하여 법선을 다시 계산해야한다는 것을 알았다. Unity Shaderlab을위한 구현물이 없었기 때문에 복사 및 붙여 넣기 만 할 수는 없었습니다. 쉐이더 코드에 대한 지식이 매우 기본적 이었기 때문에 필요한 부분을 찾은 것으로 번역 할 수 없었습니다.

정점을 이동 한 후 법선을 어떻게 다시 계산할 수 있습니까?

답변

-1

나 자신을 수행하지 않은 채, 나는 조금 googly했고 법선을 뒤집을 때 this shader을 찾았다. 그것은 정점 정보를 조정하여이 작업을 수행합니다

void vert(inout appdata_full v) { 
     v.normal.xyz = v.normal * -1; 
    } 

는 당신은 다른 변경을 기반으로 법선 방향을 다시 계산과 유사한 방식으로 그것을 업데이트 셰이더를 조정할 수 있어야합니다.

+0

사용해 주셔서 감사합니다. 하지만 슬프게도 내가 어떻게 달성 해야할지 모르겠다. ( – Al3x

+0

@ Al3x 어떤 수학을 사용해야할지 모르겠다. – Draco18s

1

정상적인 계산 뒤의 수학은 교차 곱입니다.

삼각형에서 정점 A, B 및 C를 가져옵니다. 그런 다음 벡터 AB 및 AC를 만듭니다. ABxAC는 삼각형의 법선을 제공합니다. ACxAB은 반대의 정상 (ABxAC = - ACxAB)을 줄 것입니다.

en.wikipedia.org/wiki/Cross_product

당신이 메쉬 클래스 메쉬를 이동 인 경우는 RecalculateNormals있다. 하지만 셰이더에서 작업 할 때는 여기에 해당되지 않는다고 생각합니다.

+0

정확히 내가 실패한 부분은이 "가짜"이웃을 만들고이 벡터를 만드는 것이다. 다행히 모바일에서 공정한 효과와 울트라 퍼포먼스를 달성 할 수있었습니다. 내가 한 것은 그림자를 모두 버리고 간단한 질감을 만들었습니다. 이제 메쉬가 움직이면 텍스처가 따라 올 수 있습니다. 움직이는 것을 보아라. 좋았어. 나는 그림자를 다룰 필요가 없다. (내가 모바일을 목표로하고 있기 때문에) – Al3x

+0

가짜 이웃들, 나는 두 개의 벡터로 가정한다. 삼각형을 얻을 때, 그것은 세 가지로 만들어진다. 점, 꼭지점 당신이 선택한 것은 상관 없으며 하나의 꼭지점이 두 벡터의 시작 꼭지점 일뿐입니다. – Everts

1

표면의 법선 벡터는 그 유도체과 관련됩니다. 부비동 파의 경우 그 미분은 코사인 파 cos()입니다. 두 연산 모두 sincos()이라는 단일 연산으로 효율적으로 계산할 수 있습니다.

완벽한 소개 운동 :) 둘 다 음모를 꾸미고 relationship을 관찰하십시오.

에버트 (Everts)의 이전 답변은 인접한 정점에 액세스 할 때 작동합니다. 일반적으로 쉐이더에서는 사용하지 않지만 (CPU에서는 문제가되지 않습니다).