0312 렌즈 플레어의 구현
렌즈 플레어의 구현
260312
// 이거 디지털 메모 옮긴거임
- 그냥 이펙트 렌더링의 경우,
해의 3차원 위치를 스크린 공간으로 변환한 후에,
스크린 정 중앙을 향해서
일정한 크기만큼 진행하면서
렌즈플레어 텍스쳐 하나씩 그리면 되는거임.
- 근데 오클루젼의 경우는??
-> 렌즈 플레어를 가장 마지막에 그린다고 가정하고
(씬의 뎁스 버퍼가 완전히 채워졌다고 가정하고)
해의 위치가 다른 사물에 가려졌는지 판단해야 한다.
밑에 있는거는 OpenGL공식 튜토리얼 글에서 긁어온거
bool glCamera::IsOccluded(glPoint p){
GLint viewport[4];
GLdouble mvmatrix[16], projmatrix[16];
GLdouble winx, winy, winz;
GLdouble flareZ;
GLfloat bufferZ;
glGetIngeterv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, mvmatrix);
glGetDoublev(GL_PROJECTION_MATRIX, projmatrix);
// p라는 3차원 점의 스크린 좌표를 얻는다.
// = vec2((P * V * M) * vec4(p, 1))
gluProject(p.x, p.y, p.z, mvmatrix, projmatrix, viewport, &winx, &winy, &winz);
// 해당 점의 뎁스값은 winz이다. (x, y는 스크린 좌표이고, z는 뎁스값을 나타낸다)
flareZ = winz;
// 해당 스크린 좌표에 기록된 뎁스값을 읽어온다.
glReadPixels(winx, winy, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &bufferZ);
// 만약 읽어온 뎁스값이 태양 점의 뎁스값보다 작다면?
// -> 태양은 앞의 무언가에 가려진 것임. true반환ㅇㅇ
if (bufferZ < flareZ){
return true;
}
return false;
}
해의 위치를 스크린 공간으로 변환하고,
해당 스크린 위치의 Depth를 읽는다(glReadPixels)
또 해의 Clip Space기준의
Z값이 곧 뎁스이므로,
두 뎁스값을 비교했을 때
해의 뎁스가 더 크다면
뒤에 덮여있는거임, 즉
그때는 렌플 렌더링하면 안됨
추가!!!!!!!!!!!
-> 생각해보니까 테스트 1번을 해버리면
그려지거나 / 안그려지거나 둘중 하나임.
근데 해가 천천히 화면 밖으로 나가면
그건 modulate써서 구현해야 됨.
즉, alpha factor를 계산하려면,
sun의 스크린 위치를 기반으로
주변의 1+8개든, 1+12개든, 1 + 24개든
주변을 원형(태양은 원이니까??)으로 샘플링해서
평균내면 alpha factor가 나옴.
그걸 이제 텍스쳐에다가 적용.