2015-10-03 6 views
0

Я пытаюсь создать несколько демоверсий, чтобы помочь мне понять OpenGL, GLEW и GLFW. Я нашел что-то интересное, что я не могу исправить. Я пытаюсь сделать простой набор шахматной доски.Как установить пиксельные координаты для совпадения оконных коордов в GFLW3

float points[] = { 
    0.0f, 1000.0f, 0.0f, 
    500.0f, 500.0f, 0.0f, 
    0.0f, 500.0f, 0.0f, 

    0.0f, 1000.0f, 0.0f, 
    500.0f, 500.0f, 0.0f, 
    500.0f, 1000.0f, 0.0f, 

    1000.0f, 0.0f, 0.0f, 
    500.0f, 500.0f, 0.0f, 
    1000.0f, 500.0f, 0.0f, 

    1000.0f, 0.0f, 0.0f, 
    500.0f, 500.0f, 0.0f, 
    500.0f, 0.0f, 0.0f 
}; 

Если я создаю окно с начальным размером 1000,1000:

GLFWwindow* window = glfwCreateWindow(1000, 1000, "Simple example", NULL, NULL); 

шахматной доске отображается корректно: enter image description here

однако если я создаю окно первоначально с 640,480 размера измените его размер, я получаю следующее изображение:

enter image description here

Я попробовал несколько различных способов изменения размера, это казалось самым простым:

int FB_width, FB_height; 
glfwGetFramebufferSize(window, &FB_width, &FB_height); 
int win_width, win_height; 
glfwGetWindowSize(window, &win_width, &win_height); 

float width = 1000; 
float height = 1000; 
glfwSetWindowSize(window, width, height); 
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); 
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glfwSwapBuffers (window); 

где:

void framebuffer_size_callback(GLFWwindow* window, int width, int height) 
{ 
    glViewport(0, 0, width, height); 
} 

Я попытался создать окно больше первоначально (1200,1600), а затем уменьшая размер (640, 480) и затем снова увеличивая его до 1000,1000: одни и те же результаты. Я знаю, что есть разница между координатами окна и координатами пикселей, однако я думал, что они будут коррелированы с функцией обратного вызова.

Я не видел способ напрямую установить размер фреймбуфера, есть ли что-то еще, что нужно сделать?

ответ

0

Увы, это было в моей матрице проекций вершинному шейдеру, я использовал неправильный параметр для PRO_mat, моя ширина и высота были неправильными.

// Vector of 3 points, add the 4th value in the vertex shader 
const char* vertex_shader = 
"#version 400\n" 
"in vec3 vp;" 
"uniform mat4 PRO_mat;" 
"void main() {" 
" gl_Position = PRO_mat*vec4 (vp, 1.0);" 
"}"; 

Eigen::Matrix<GLfloat,4,4> pro_mat_inv = Eigen::Matrix4f::Identity(); 
pro_mat_inv(0,0) = width/2; 
pro_mat_inv(0,3) = width/2; 
pro_mat_inv(1,1) = height/2; 
pro_mat_inv(1,3) = height/2;