0312 렌즈 플레어의 구현

렌즈 플레어의 구현

260312

// 이거 디지털 메모 옮긴거임

  1. 그냥 이펙트 렌더링의 경우,

해의 3차원 위치를 스크린 공간으로 변환한 후에,

스크린 정 중앙을 향해서

일정한 크기만큼 진행하면서

렌즈플레어 텍스쳐 하나씩 그리면 되는거임.

  1. 근데 오클루젼의 경우는??

-> 렌즈 플레어를 가장 마지막에 그린다고 가정하고

​ (씬의 뎁스 버퍼가 완전히 채워졌다고 가정하고)

​ 해의 위치가 다른 사물에 가려졌는지 판단해야 한다.

밑에 있는거는 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가 나옴.

그걸 이제 텍스쳐에다가 적용.