2016-06-20 6 views
0

큐브 맵에 렌더링하려고합니다. 렌더링되는 장면은 지형입니다. 위도 - 경도 디버그 표시를 사용하여 특정 큐브 맵에있는 내용을 확인합니다. 왼쪽 하단에있는 두 개의 디버그보기는 방향을 보여주는 더미 큐브 맵과 실제 그림이있는 큐브 맵입니다.큐브 맵에 OpenGL 렌더링

오른쪽 아래 절반의 디버그보기는 제가 뒤에서 큐브 맵에서 렌더링 한 것을 보여줍니다.

카메라를 설정하기 위해 여러 가지 조합을 시도했지만 그 중 아무 것도 논리적 인 결과를 제공하지 않았습니다. 또한 동적 큐브 맵을 구현하기 위해 코드를 여러 샘플과 비교해 보았지만 여전히 문제를 발견 할 수 없었습니다. 나도 다음에 시도해 볼 아이디어가 없으므로 도움이나 제안을 환영합니다. 행렬들 잘못했다

void Draw(GLuint cubemap, glm::ivec2 res, glm::vec3 position) 
{ 

    glBindFramebuffer(GL_FRAMEBUFFER, fbo); 

    glBindRenderbuffer(GL_RENDERBUFFER, rb); 
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, res.x, res.y); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rb); 

    // camera 
    glm::mat4 p = glm::perspective(90.0f, 1.0f, 0.01f, 10.0f); 
    glm::mat4 v; 

    glm::vec3 targets[6] = { 
     glm::vec3(+1.0f, 0.0f, 0.0f), 
     glm::vec3(-1.0f, 0.0f, 0.0f), 
     glm::vec3(0.0f, +1.0f, 0.0f), 
     glm::vec3(0.0f, -1.0f, 0.0f), 
     glm::vec3(0.0f, 0.0f, +1.0f), 
     glm::vec3(0.0f, 0.0f, -1.0f) 
    }; 
    glm::vec3 ups[6] = { 
     glm::vec3(0.0f, 1.0f, 0.0f), 
     glm::vec3(0.0f, 1.0f, 0.0f), 
     glm::vec3(0.0f, 0.0f, 1.0f), 
     glm::vec3(0.0f, 0.0f, -1.0f), 
     glm::vec3(0.0f, 1.0f, 0.0f), 
     glm::vec3(0.0f, 1.0f, 0.0f) 
    }; 

    // render 
    for (int i = 0; i < 6; i++) 
    { 
     glViewport(0, 0, res.x, res.y); 
     // setup target face 
     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, cubemap, 0); 
     // setup camera 
     v = glm::lookAt(position, position + targets[i], ups[i]); 
     // draw 
     DrawTerrain(terrain.heightmap, terrain.m, v, p); // model, view, projection matrices 
    } 
    glBindFramebuffer(GL_FRAMEBUFFER, 0); 
} 

screenshot

답변

0

:

그리기 기능을 큐브 맵합니다. 값을 철저히 검사 한 후 glm이 반환하는 값은 투영 및 뷰 행렬 모두에 맞지 않습니다. 내가 bugfix에 대한 요청을보고 할 지 알게 될 것이지만, 지금은 행렬을 실제로 수정 한 코드가있다.

// projection matrix (fov = 90 degrees, aspect = 1.0) 
glm::mat4 p; 
float n = 0.1f, f = 2.0f; // near and far 
p[0][0] = 1.0f; 
p[1][1] = 1.0f; 
p[2][2] = -f/(f - n); 
p[2][3] = -1.0f; 
p[3][2] = -(f*n)/(f - n); 

glm::vec3 targets[6] = { 
    glm::vec3(+1.0f, 0.0f, 0.0f), 
    glm::vec3(-1.0f, 0.0f, 0.0f), 
    glm::vec3(0.0f, +1.0f, 0.0f), 
    glm::vec3(0.0f, -1.0f, 0.0f), 
    glm::vec3(0.0f, 0.0f, +1.0f), 
    glm::vec3(0.0f, 0.0f, -1.0f) 
}; 
glm::vec3 ups[6] = { 
    glm::vec3(0.0f, 1.0f, 0.0f), 
    glm::vec3(0.0f, 1.0f, 0.0f), 
    glm::vec3(0.0f, 0.0f, -1.0f), 
    glm::vec3(0.0f, 0.0f, 1.0f), 
    glm::vec3(0.0f, 1.0f, 0.0f), 
    glm::vec3(0.0f, 1.0f, 0.0f) 
}; 
for(int i=0; i<6; ++i) 
{ 
    // view matrix 
    v = glm::lookAt(position, position + targets[i], ups[i]); 
    v[0][2] *= -1.0f; 
    v[1][2] *= -1.0f; 
    v[2][2] *= -1.0f; 
    v[3][2] *= -1.0f; 
    // render... 
} 

편집 : 나는 좀 더 조사 안드레아스의 의견 후

.

glm::perspective 라디안 단위의 필수 FOV이지만,이 함수를 사용한 모든 예제가 각도와 함께 호출 되었기 때문에 나는 결코 그걸 의심하지 않았습니다. scrathapixel에서 확인한 후에 나는 원근법 행렬이 맞다고 확신했습니다 (결정자가 음수 임에도 불구하고). 그래서, FOV는 방사능에 있습니다, 그건 제 실수였습니다.

그러나 lookAt은 잘못되었습니다. 이 기능을 여러 리소스에서 비교 한 결과는 bgfx's lookAt이고 실제로 세 번째 열의 부호는 반대로 표시되어야합니다. 그래서 -1로 뷰 매트릭스의 해당 열을 곱하는 변경 사항이 남아 있습니다.

+0

음,'glm'은 헤더 전용이므로 "수정 요청 중"대신 쉽게 수정할 수 있습니다. 'perspective'는'gluPerspective'의 1 : 1 복사본입니다. 이것은 매우 단순한 함수입니다. 그래서 어떻게 버그가 될 수 있는지 약간 당황 스럽습니다. –

+0

'p [2] [2]'값을 보면 z 축이 카메라를 향한 것이지 멀리 떨어지는 것을 알 수 없다고 생각됩니다. x 축은 오른쪽으로 이동하고 y 축은 위로 올라가므로 좌표계가 오른 손잡이 인 경우 z 축은 카메라를 향해야합니다. 그러나 행렬에는 부정적인 결정 요소가 있습니다. 이는 잘못된 것입니다. –

+0

@AndreasHaferburg 답변을 더 자세히 편집했습니다. –