无法使用openGL改变颜色

问题描述 投票:0回答:1

这是我编写的代码的一部分,我从 GLUI 列表中选择颜色选项并且 BG 颜色发生变化:

#include <GL/freeglut.h>
#include <GL/glui.h>
#include <cmath>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <vector>

struct Vertex {
    float x, y;
};

std::vector<Vertex> vertices;
int numSides = 3;
const float scaleFactor = 0.5f;
int bgColor[3] = {255, 255, 255}; 

GLUI *glui_window;  

void menuFunction(int value) {
    std::cout << "Menu item selected: " << value << std::endl;
    switch (value) {
        case 1:
            glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // White
            break;
        case 2:
            glClearColor(1.0f, 0.0f, 0.0f, 1.0f); // Red
            break;
        case 3:
            glClearColor(0.0f, 1.0f, 0.0f, 1.0f); // Green
            break;
        case 4:
            glClearColor(0.0f, 0.0f, 1.0f, 1.0f); // Blue
            break;
    }
    glutPostRedisplay();
}



void init() {
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glColor3f(0.0, 0.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
    glutSetCursor(GLUT_CURSOR_CROSSHAIR);

    glui_window = GLUI_Master.create_glui("Options");
    GLUI_Listbox *bgColorList = glui_window->add_listbox("BG Colour", &bgColor[0]);
    bgColorList->add_item(1, "White");
    bgColorList->add_item(2, "Red");
    bgColorList->add_item(3, "Green");
    bgColorList->add_item(4, "Blue");

    glui_window->set_main_gfx_window(glutGetWindow());

    bgColorList->set_int_val(1);

    glui_window->hide();
}

...但是我还没有找到将

init()
函数与
menuFunction()
连接起来的方法。

最初,程序创建一个多边形,此代码更改其后面的颜色。

c++ opengl glut glui
1个回答
0
投票

add_listbox
函数的使用不正确。请参阅GLUI文档。其用法如下:

GLUI_Listbox *GLUI::add_listbox( char *name,
                                 void *live_var=NULL, int id=-1,
                                 GLUI_Update_CB callback=NULL );
  • name
    - 要显示的标签
  • live_var
    - 指向
    int
    类型变量的可选指针。该变量将自动更新为列表框中当前所选文本条目的数字 ID。
  • id
    - 此列表框的 ID。如果定义了回调,则当选择新的列表框条目时,将传递此整数值。
  • callback
    - 选择不同条目时调用的回调函数指针(采用单个
    int
    参数)。回调将传递上面列出的值
    id
    。使用
    GLUI_Listbox::get_int_val()
    确定回调中的哪个条目 被选中了。
  • panel
    - 要添加控件的现有 GLUI 面板(或卷展栏)。

返回:指向新

Listbox
控件的指针

为了获得所需的行为,需要进行以下修改。首先,在程序中为

live_var
(此处为
itemSelectedIdx
)声明一个全局变量。在对
add_listbox
的调用中,传递一个指向
itemSelectedIdx
的指针,为
id
使用任意唯一值(此处为
0
),并将
menuFunction
指定为 callback 函数(被调用的函数)当选择不同的项目时)。

int itemSelectedIdx;

// ...

void init() {
    // ...
    GLUI_Listbox *bgColorList = glui_window->add_listbox("BG Colour", &itemSelectedIdx, 0, menuFunction);
    // ...
}

menuFunction
中,忽略参数
value
并使用之前声明的
itemSelectedIdx
代替,即:

void menuFunction(int value) {
    std::cout << "Menu item selected: " << itemSelectedIdx << std::endl;
    switch (itemSelectedIdx) {
        case 1:
    // ...
}

旁注:

value
参数将包含之前指定为
id
的列表框
0
。当多个小部件(具有不同的
id
)使用相同的回调函数时,这非常有用。

© www.soinside.com 2019 - 2024. All rights reserved.