我在使用 C++ 中的 OpenGL 教程时遇到问题。我尝试在鼠标单击时画线,其中一条边为 0.0,第二条边为光标位置。当我手动设置值时,它可以正确绘制,但是当我使用代表光标位置的变量时,它根本不会绘制。
这是我读取光标位置的回调函数。
GLfloat x;
GLfloat y;
static void cursor_position_callback(GLFWwindow* window, double xpos, double ypos) {
x = xpos / (1024 / 2) - 1.0;
y = ypos / (768 / 2) - 1.0;
}
这是我传递变量来绘制的地方
do{
// Calculate position
static GLfloat g_vertex_buffer_data[] = {
//0.5f, 0.0f, 0.0f <------ THIS WORKS
x, y, 0.0f
};
std::cout << x << " " << y << std::endl;
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
...
// Draw the triangle !
// if mouse clicked
if (glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS) {
glDrawArrays(GL_LINES, 0, 2);
}
我将不胜感激!
最佳答案
数组 g_vertex_buffer_data
是static
,因此数据仅初始化一次并始终保持其静态值。
由于x
和y
都没有初始化,数组中的数据由x
和y
的任意随机值设置code> 在程序的开头。
static GLfloat g_vertex_buffer_data[] = { //0.5f, 0.0f, 0.0f <------ THIS WORKS x, y, 0.0f };
使用局部非静态数组并初始化x
和y
解决问题:
GLfloat x = 0.0f;
GLfloat y = 0.0f;
do{
// Calculate position
GLfloat g_vertex_buffer_data[] = {
//0.5f, 0.0f, 0.0f <------ THIS WORKS
x, y, 0.0f
};
// [...]
请注意,在循环的每次迭代中,局部变量都由 x
和 y
的当前值设置。
另一种解决方案是在循环之前创建数组,但在循环中更改数组元素的值:
GLfloat g_vertex_buffer_data[] = {
0.5f, 0.0f, 0.0f
};
do
{
g_vertex_buffer_data[0] = x;
g_vertex_buffer_data[1] = y;
// [...]
关于c++ - OpenGL - 正确读取光标位置但无法从中画线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58557896/