Shadertoy 시작 week #3


htps //w w. 샤로 r과 y. 이 m/ゔぃ에w/MsXcWr

Week #3



마지막으로, 괜찮은 굴절이 생겼다. 그래서 역시 다이아몬드를 해보고 싶다는 것으로, Brilliant-cut 의 거리 함수의 도출에 도전했습니다.

brilliant-cut.glsl
float dfBC (in vec3 p, float r) {
  float angleStep = P2/8.;
  float crownAngle = radians(33.0);
  float pavilionAngle = radians(41.0);
  float tableArea = 0.58;
  float starArea  = 0.5;
  float starAngle = crownAngle * 0.640;
  float bezlAngle = crownAngle;
  float ugrdAngle = crownAngle * 1.209;
  float pavlAngle = pavilionAngle;
  float lgrdAngle = pavilionAngle * 1.049;

  vec3 vHlfStep = vec3(cos(angleStep/2.), 0, sin(angleStep/2.));
  vec3 vQrtStep = vec3(cos(angleStep/4.), 0, sin(angleStep/4.));

  float a = floor(atan(p.z,p.x)/angleStep+.5)*angleStep, c=cos(a), s=sin(a);
  mat3  m = mat3(c,0,s,  0,1,0,  -s,0,c) * r;
  vec3  q = inverse(m) * p;
  q.z = abs(q.z);

  vec3 nmlBezel = vec3(sin(bezlAngle), cos(bezlAngle),0);
  float fcBezel = dot(q, nmlBezel) -  sin(bezlAngle);

  vec3 nmlUGird = normalize(vec3(vQrtStep.x*sin(ugrdAngle),  cos(ugrdAngle)*vQrtStep.x, vQrtStep.z*sin(ugrdAngle)));
  vec3 nmlLGird = normalize(vec3(vQrtStep.x*sin(lgrdAngle), -cos(lgrdAngle)*vQrtStep.x, vQrtStep.z*sin(lgrdAngle)));
  float fcUGird = dot(q, nmlUGird) -  dot(nmlUGird, vQrtStep*vQrtStep.x);
  float fcLGird = dot(q, nmlLGird) -  dot(nmlLGird, vQrtStep*vQrtStep.x);

  vec3 nmlStar  = vec3(sin(starAngle)*vHlfStep.x,cos(starAngle),sin(starAngle)*vHlfStep.z);
  float starDst = (1.-tableArea) * (1.-starArea) * (tan(ugrdAngle)/tan(starAngle)-1.) + 1.;
  float fcStar  = dot(q, nmlStar) -  starDst * sin(starAngle);

  vec3 nmlPMain = vec3(sin(pavlAngle), -cos(pavlAngle),0);
  float fcPMain = dot(q, nmlPMain) -  sin(pavlAngle);

  float fcTable = q.y -  (1.-tableArea) * tan(bezlAngle);
  float fcCulet = - q.y -  tan(pavlAngle) * .96;
  float fcGirdl = length(q.xz) - .975;

  return max(fcGirdl, max(fcCulet, max(fcTable, max(fcBezel, max(fcStar, max(fcUGird, max(fcPMain,fcLGird)))))));
}

가지고 있는 수학 지식을 총동원해 도전했지만, 마지막은 역업으로 나사를 썼습니다( starAngle , ugrdAngle , lgrdAngle 의 수수께끼 계수가 수동 조정치). 수동 조정에서는, 경사가 0.1도 다른 것만으로도, 예쁜 삼각형이 되지 않는다고 하는 시비아인 장인 세계를 경험할 수 있어, 보석 장인 스게라고 생각했습니다(소병감).

일단 어떻게 든 Brilliant-cut 의 거리 함수를 도출할 수 있었으므로, 보이는 방법을 생각한 결과, 반복에 의해 등간격에 무한히 편차하면, 굉장히 치프하게 보이는 것을 알았기 때문에, 계산 부하는 거의 변하지 않습니다만, 표시 12개로 한정하기로 했습니다.
또, 착색이나 거대화도 장난감감이 나와 이것 또 치프로 보여 버리기 때문에, 그다지 하고 싶지 않았지만, 무착색, 소립 다이아몬드의 그림 어긋남이 너무 수수했기 때문에, 지금의 형태로 침착했습니다.
보석의 표현은 정확한 렌더링 이상으로 배치에 의한 심리적 효과가 중요하다고 느꼈습니다. 재미 있습니다.

Tips #3



아티팩트 세 번째입니다.
GEM Clock
요 전날, Tips도 드디어 첫눈을 써 보았다 입니다만, 생각했던 것 이상으로 어렵고 매우 시간이 걸렸습니다. 이것 전부 걸까...
- 원래 형상 (Brilliant-cut)의 거리 함수 도출
- 렌더링 패스 설계로 계산 부하 조정
- 시계 표현
- 원주 배치
- 바운드 모션 함수

좋은 웹페이지 즐겨찾기