2015-10-03 44 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:結果相同。我知道窗口座標和像素座標之間存在差異,但我認爲這些會與回調函數相關。

我沒有看到直接設置framebuffer大小的方法,是否還有其他需要完成的工作?

回答

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;