如何设置像素坐标以匹配 GFLW3 中的 window 坐标
How to set pixel coords to match window coords in GFLW3
我正在尝试创建一些演示来帮助我理解 OpenGL、GLEW 和 GLFW。我发现了一些有趣的事情,但我似乎无法纠正。我正在尝试渲染一组简单的棋盘。
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 的 window:
GLFWwindow* window = glfwCreateWindow(1000, 1000, "Simple example", NULL, NULL);
棋盘显示正确:
但是,如果我最初创建大小为 640,480 的 window 并调整它的大小,我会得到以下图像:
我尝试了几种不同的调整大小的方法,这似乎是最简单的:
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);
}
我试过创建 window 最初较大的 (1200,1600),然后调整较小的 (640, 480),然后再次增加到 1000,1000:相同的结果。我知道 window 坐标和像素坐标之间存在差异,但我认为它们与回调函数相关。
我没有看到直接设置帧缓冲区大小的方法,还有什么需要做的吗?
唉,是在我的顶点着色器的投影矩阵中,我为 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;
我正在尝试创建一些演示来帮助我理解 OpenGL、GLEW 和 GLFW。我发现了一些有趣的事情,但我似乎无法纠正。我正在尝试渲染一组简单的棋盘。
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 的 window:
GLFWwindow* window = glfwCreateWindow(1000, 1000, "Simple example", NULL, NULL);
棋盘显示正确:
但是,如果我最初创建大小为 640,480 的 window 并调整它的大小,我会得到以下图像:
我尝试了几种不同的调整大小的方法,这似乎是最简单的:
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);
}
我试过创建 window 最初较大的 (1200,1600),然后调整较小的 (640, 480),然后再次增加到 1000,1000:相同的结果。我知道 window 坐标和像素坐标之间存在差异,但我认为它们与回调函数相关。
我没有看到直接设置帧缓冲区大小的方法,还有什么需要做的吗?
唉,是在我的顶点着色器的投影矩阵中,我为 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;