c++ - OpenGL - 正确读取光标位置但无法从中画线

标签 c++ opengl glfw

我在使用 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_datastatic,因此数据仅初始化一次并始终保持其静态值。
由于xy都没有初始化,数组中的数据由xy的任意随机值设置code> 在程序的开头。

static GLfloat g_vertex_buffer_data[] = { 
       //0.5f, 0.0f, 0.0f <------ THIS WORKS
       x, y, 0.0f
    };

使用局部非静态数组并初始化xy解决问题:

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
    };

    // [...]

请注意,在循环的每次迭代中,局部变量都由 xy 的当前值设置。

另一种解决方案是在循环之前创建数组,但在循环中更改数组元素的值:

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/

相关文章:

c - OpenGL 在场景中移动一张 table

c++ - glDrawElements 没有显示

c++ - glfw3 编译 undefined reference

c++ - 是否在兼容模式下运行的程序

c++ - 构建 32 位库 opencv

c++ - 在 OpenGL 中实例化数百万个对象

c++ - 使用顶点数组对象渲染三角形什么都不显示(OpenGL)

c++ - 一旦上下文打开,纹理仅适用于 compat 和 glGetError Always INVALID_ENUM

c++ - 是否有一个函数可以检索范围内可用的不同值的数量?

c++ - 在 C++ 中打开 HDF5 文件的更好方法