2016-06-20 2 views
0

Я пытаюсь сделать куб. Сцена, которая визуализируется, является ландшафтом. Я использую отображение отладки долготы долготы, чтобы увидеть, что находится в определенном файле cubemap. Два вида отладки в левом нижнем углу - это фиктивная карта куба, которая показывает только направления и одну карту куба с реальными изображениями.OpenGL рендеринга для cubemap

Отладочный вид в нижней нижней половине снизу показывает, что я получаю в виде куба, который мне нужен.

Я пробовал много разных комбинаций для настройки камеры, но ни один из них не дал никаких логических результатов. Я также сравнил код с несколькими образцами для реализации динамического cubemap, и я все еще не мог определить проблему. У меня нет идей, что даже попробовать дальше, поэтому любая помощь или предложение приветствуются.

Розыгрыш для cubemap функции:

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, были неверными, как для проекционных, так и для представления матриц. Я посмотрю, буду ли я сообщать о запросе на исправление, но на данный момент вот код, который фактически фиксировал матрицы.

// 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... 
} 

EDIT:

После замечаний Андреаса я исследовал немного больше.

glm::perspective требуется FOV в радианах, но так как каждый пример, который использовал эту функцию, называл ее градусами, я никогда не подозревал об этом. После проверки на scrathapixel я был уверен, что матрица перспективы правильная (хотя детерминант отрицательный). Итак, FOV находится в радиусах, это была моя ошибка.

Однако, lookAt был не прав. Я сравнил эту функцию по нескольким ресурсам и определенно с bgfx's lookAt, и действительно, весь третий столбец должен иметь знак обратный. Таким образом, изменения, в которых я умножаю этот столбец матрицы вида с -1, остались.

+0

Ну, 'glm' - только заголовок, поэтому вы можете легко исправить его самостоятельно, а не« запрашивать исправление ». 'перспектива' - это в значительной степени копия' gluPerspective' 1: 1, которая является ужасно простой функцией, поэтому я немного недоумеваю, как может быть ошибка. –

+0

Глядя на значение 'p [2] [2]', я подозреваю, что вы, возможно, не знаете, что ось z указывает на камеру, а не на нее. Ось оси идет вправо, ось y идет вверх, поэтому, если система координат должна быть правой, ось z должна указывать на камеру. Однако ваша матрица имеет отрицательный детерминант, что неверно. –

+0

@AndreasHaferburg Я отредактировал ответ еще больше. –

Смежные вопросы