如何使用 glut 和 openGL 改变颜色?

Posted

技术标签:

【中文标题】如何使用 glut 和 openGL 改变颜色?【英文标题】:How do I get color to change using glut and openGL? 【发布时间】:2015-02-24 18:26:19 【问题描述】:

我正在尝试教自己在没有用户输入的情况下为对象设置动画,到目前为止,我已经弄清楚如何让场景旋转。我如何让一个物体改变颜色呢?我认为我的代码可以做到这一点,但它仍然是一个白色三角形(甚至没有不同的颜色)。

如何让它在三角形或透视旋转的同时改变颜色?

这是我当前的代码:

#include <GL/glut.h>

float color1;
float color2;
float color3;

void changeSize(int w, int h) 

// Prevent a divide by zero, when window is too short
// (you cant make a window of zero width).
if (h == 0)
    h = 1;

float ratio = w * 1.0 / h;

// Use the Projection Matrix
glMatrixMode(GL_PROJECTION);

// Reset Matrix
glLoadIdentity();

// Set the viewport to be the entire window
glViewport(0, 0, w, h);

// Set the correct perspective.
gluPerspective(45.0f, ratio, 0.1f, 100.0f);

//changeColor?
color1 += 0.1f;
color2 += 0.3;
color3 += color2;
if (color1 > 1.0)
    color1 = 0;
if (color2 > 1.0)
    color2 = 0;
if (color3 > 1.0)
    color3 = 0;

// Get Back to the Modelview
glMatrixMode(GL_MODELVIEW);


float angle = 0.0f;

void renderScene(void) 

// Clear Color and Depth Buffers
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// Reset transformations
glLoadIdentity();
// Set the camera
gluLookAt(0.0f, 0.0f, 10.0f,
    0.0f, 0.0f, 0.0f,
    0.0f, 1.0f, 0.0f);

glRotatef(angle, 0.0f, 1.0f, 0.0f);

glBegin(GL_TRIANGLES);
glColor3f(color1, color2, color3);

glVertex3f(2.0f, -2.0f, 0.0f);
glVertex3f(2.0f, 0.0f, 0.0);
glVertex3f(0.0f, 2.0f, 0.0);
glEnd();

angle += 0.1f;
color1 += 0.1f;
color2 += 0.3;
color3 += color2;

glutSwapBuffers();


int main(int argc, char **argv) 

// init GLUT and create window
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100, 100);
glutInitWindowSize(320, 320);
glutCreateWindow("tutorial example");

// register callbacks
glutDisplayFunc(renderScene);
glutReshapeFunc(changeSize);

glutIdleFunc(renderScene);

// enter GLUT event processing cycle
glutMainLoop();

return 1;

【问题讨论】:

【参考方案1】:

浮动颜色必须在 [0,1] 的范围内,并且您只需在值中添加一些内容,并且永远不会将其重置为零,因此它在前 10 帧中变得大于 1(=非常快),OpenGL 将其钳位到 1,所以你看到它是白色的。

changeSize 中的那一堆 ifs 实际上应该在 renderScene 中。

【讨论】:

【参考方案2】: 对于像这样简单的事情,请使用具有合理超时时间的 glutTimerFunc() 回调 在计时器回调中更新角度/颜色并开始重绘 每次通过 glutDisplayFunc() 回调重新设置投影/模型视图矩阵,有助于防止奇怪的矩阵问题

大家一起:

#include <GL/glut.h>

float angle = 0.0f;
float color1 = 0.0f;
float color2 = 0.0f;
float color3 = 0.0f;
void timer( int value )

    angle += 3.0f;

    //changeColor?
    color1 += 0.001f;
    color2 += 0.003f;
    color3 += color2;
    if (color1 > 1.0)
        color1 = 0;
    if (color2 > 1.0)
        color2 = 0;
    if (color3 > 1.0)
        color3 = 0;

    glutPostRedisplay();
    glutTimerFunc( 16, timer, 0 );


void renderScene()

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    double w = glutGet( GLUT_WINDOW_WIDTH );
    double h = glutGet( GLUT_WINDOW_HEIGHT );
    gluPerspective(45.0f, w / h, 0.1f, 100.0f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt
        (
        0.0f, 0.0f, 10.0f,
        0.0f, 0.0f, 0.0f,
        0.0f, 1.0f, 0.0f
        );

    glRotatef(angle, 0.0f, 1.0f, 0.0f);

    glBegin(GL_TRIANGLES);
    glColor3f(color1, color2, color3);
    glVertex3f(2.0f, -2.0f, 0.0f);
    glVertex3f(2.0f, 0.0f, 0.0);
    glVertex3f(0.0f, 2.0f, 0.0);
    glEnd();

    glutSwapBuffers();


int main(int argc, char **argv)

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowSize(320, 320);
    glutCreateWindow("tutorial example");
    glutDisplayFunc(renderScene);
    glutTimerFunc( 0, timer, 0 );
    glutMainLoop();
    return 1;

【讨论】:

感谢您提供替代解决方案。也可以随意投票赞成或反对我的问题,因为我最近对其进行了编辑以使其更好并需要反馈。另外,另一方面,我最终使用了类似于您的解决方案(我认为),那是前一段时间。

以上是关于如何使用 glut 和 openGL 改变颜色?的主要内容,如果未能解决你的问题,请参考以下文章

更新窗口显示 OpenGL/GLUT C++

与 GLUT 和 OpenGL 集成的 Cocoa 框架

如何使用 Glut 使相机飞过 OpenGL 中的对象?

在 OpenGL 中设置透明背景颜色不起作用

计算机图形学_图元的属性_3_OpenGL颜色函数(上)

计算机图形学_图元的属性_3_OpenGL颜色函数(上)