OpenGL - правильно читает положение курсора, но не может нарисовать линию - PullRequest
0 голосов
/ 25 октября 2019

У меня проблемы с учебником OpenGL на C ++. Я пытаюсь рисовать линии по щелчку мыши, где один край равен 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); 
    }

Я буду признателен за любую помощь!

1 Ответ

2 голосов
/ 25 октября 2019

Массив g_vertex_buffer_data равен static, поэтому данные инициализируются только один раз и сохраняют свои статические значения на все время.
Поскольку x соответственно y не инициализируютсяданные в массиве задаются произвольными случайными значениями x и y в начале программы.

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;

    // [...]
...