c++ - 立方体的一半的 OpenGL 颜色

标签 c++ visual-studio opengl glut

我正在尝试给半个立方体上色,让它看起来像是装满了水。在下面的代码中,我绘制了带有白色边缘的立方体:

void initGL() {
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
    glClearDepth(1.0f); 
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL); 
    glShadeModel(GL_SMOOTH);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 
}

void display() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
    glLoadIdentity(); 

    glTranslatef(-3.0f, 0.0f, -9.0f); 

    glBegin(GL_QUADS);
    glBegin(GL_LINES);

    glColor3f(1.0f, 1.0f, 1.0f); 
    glVertex3f(1.0f, 1.0f, -1.0f);
    glVertex3f(-1.0f, 1.0f, -1.0f);
    glVertex3f(-1.0f, 1.0f, 1.0f);
    glVertex3f(1.0f, 1.0f, 1.0f);

    glColor3f(1.0f, 1.0f, 1.0f); 
    glVertex3f(1.0f, -1.0f, 1.0f);
    glVertex3f(-1.0f, -1.0f, 1.0f);
    glVertex3f(-1.0f, -1.0f, -1.0f);
    glVertex3f(1.0f, -1.0f, -1.0f);

    glColor3f(1.0f, 1.0f, 1.0f); 
    glVertex3f(1.0f, 1.0f, 1.0f);
    glVertex3f(-1.0f, 1.0f, 1.0f);
    glVertex3f(-1.0f, -1.0f, 1.0f);
    glVertex3f(1.0f, -1.0f, 1.0f);

    glColor3f(1.0f, 1.0f, 1.0f); 
    glVertex3f(1.0f, -1.0f, -1.0f);
    glVertex3f(-1.0f, -1.0f, -1.0f);
    glVertex3f(-1.0f, 1.0f, -1.0f);
    glVertex3f(1.0f, 1.0f, -1.0f);

    glColor3f(1.0f, 1.0f, 1.0f); 
    glVertex3f(-1.0f, 1.0f, 1.0f);
    glVertex3f(-1.0f, 1.0f, -1.0f);
    glVertex3f(-1.0f, -1.0f, -1.0f);
    glVertex3f(-1.0f, -1.0f, 1.0f);

    glColor3f(1.0f, 1.0f, 1.0f); 
    glVertex3f(1.0f, 1.0f, -1.0f);
    glVertex3f(1.0f, 1.0f, 1.0f);
    glVertex3f(1.0f, -1.0f, 1.0f);
    glVertex3f(1.0f, -1.0f, -1.0f);
    glEnd(); 
    glutSwapBuffers();

}

但我不知道如何在不删除白色边缘的情况下给它的一半上色。除此之外,我还必须为它制作动画,这样水才能上下流动。

最佳答案

请注意,glBeginglEnd 等内容已弃用(甚至 glVertexPointerglEnableClientState)。 了解 Fixed Function PipelineVertex Specification .


但是根据您的代码,我建议定义一个顶点数据数组 ( glVertexPointer ) 和客户端功能(glEnableClientState),以解决您的问题。 进一步定义索引数组并使用 glDrawElements到 从数组数据渲染(索引)图元。

定义顶点坐标:

GLfloat water_height = -0.5f;
GLfloat vertices[] =
{
    -1.0f, -1.0f,         -1.0f,  // 0
     1.0f, -1.0f,         -1.0f,  // 1
     1.0f, -1.0f,          1.0f,  // 2
    -1.0f, -1.0f,          1.0f,  // 3

    -1.0f,  1.0f,         -1.0f,  // 5
     1.0f,  1.0f,         -1.0f,  // 6
     1.0f,  1.0f,          1.0f,  // 7
    -1.0f,  1.0f,          1.0f,  // 8

    -1.0f,  water_height, -1.0f,  // 9
     1.0f,  water_height, -1.0f,  // 10
     1.0f,  water_height,  1.0f,  // 11
    -1.0f,  water_height,  1.0f   // 12
};

定义“水”四边形的索引:

// 6 quad indices for the 6 sides of the water cube
GLuint water_indices[] = 
{ 
    0, 1, 2, 3,
    0, 1, 9, 8,
    1, 2, 10, 9,
    2, 3, 11, 10,
    3, 0, 8, 11,
    8, 9, 10, 11
};

定义边的索引:

// 8 edges for the part of the cube which is not filled with water 
GLuint edge_indices[] = 
{ 
    4, 5, 
    5, 6,
    6, 7,
    7, 4,
    4, 8,
    5, 9,
    6, 10,
    7, 11
};

绘制四边形和线条:

glVertexPointer( 3, GL_FLOAT, 0, vertices );
glEnableClientState( GL_VERTEX_ARRAY );

glColor4f( 0.3f, 0.5f, 1.0f, 1.0f );
glDrawElements( GL_QUADS, 6 * 4, GL_UNSIGNED_INT, water_indices );

glColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
glDrawElements( GL_LINES, 8 * 2, GL_UNSIGNED_INT, edge_indices );

glDisableClientState( GL_VERTEX_ARRAY );

预览:

water

关于c++ - 立方体的一半的 OpenGL 颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50437689/

相关文章:

opengl - 有了 OpenCL,GLSL 的意义何在?

c++ - 连接到数据库

c++ - 当人们忘记调用虚拟的基类版本时,有没有办法扫描?

sql-server - 在 MS Reporting Services (SQL Server 2008) 中针对 ODBC 数据源使用参数

c# - 通过 visual studio 运行的 UI 外观与安装的应用程序不同

c++ - OpenGL 3D 选择

c++ - 错误 C2338: !boost::is_integral<T>::value with boost

c++ - 从链表中的第一个节点删除时出现段错误

visual-studio - VS 中是否有与 Eclipse 一样的 "Type Hierarchy View"等效项?

c++ - 具有 PBO 支持的高级 OpenGL 库