【问题标题】:drawing several triangles with different colours with one glDrawArrays command使用一个 glDrawArrays 命令绘制多个不同颜色的三角形
【发布时间】:2019-01-13 20:05:37
【问题描述】:

我正在尝试用 OpenGL 编写一些东西,但我是初学者,对于我犯的任何错误,我深表歉意。

一般来说,我只是想绘制两个不同颜色的三角形,我使用了以下代码:

float vertices[] = {
        -0.5f, -0.6f, 0.0f,
        0.5f, -0.6f, 0.0f,
        0.4f,  0.5f, 0.0f,
        0.5f, 0.6f, 0.0f,
        -0.5f, 0.6f, 0.0f,
        -0.4f,  -0.5f, 0.0f

};

void display() {
    std::cout << "frame";
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set background color to black and opaque
    glClear(GL_COLOR_BUFFER_BIT);         // Clear the color buffer
    // activate and specify pointer to vertex array
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, vertices);

// draw a cube
    glColor3f(1.0f, 0.0f, 0.0f); // Red

    glDrawArrays(GL_TRIANGLES, 0, 3);
    //glColor3f(0.0f, 1.0f, 0.0f); // Green
    glDrawArrays(GL_TRIANGLES, 3, 3);

    glDisableClientState(GL_VERTEX_ARRAY);
    glFlush();  // Render now
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);                 // Initialize GLUT
    glutCreateWindow("OpenGL Setup Test"); // Create a window with the given title
    glutInitWindowSize(320, 320);   // Set the window's initial width & height
    glutInitWindowPosition(50, 50); // Position the window's initial top-left corner
    glutDisplayFunc(display); // Register display callback handler for window re-paint
    glutMainLoop();           // Enter the infinitely event-processing loop
    return 0;
}

现在.. 如果我 .想在同一个命令中绘制两个三角形,我可以做

    glDrawArrays(GL_TRIANGLES, 0, 6);

但它会以相同的颜色绘制两个三角形。

有没有办法通过只使用一个glDrawArrays() 命令以不同的颜色绘制每个三角形?

如果没有..我应该执行其他命令吗?

谢谢

【问题讨论】:

  • "如果没有.. 还有其他命令我应该使用吗?" 固定功能属性和客户端功能自几十年以来已被弃用。请参阅 Fixed Function Pipeline 和 @ 987654322@。阅读 Vertex SpecificationShader 了解最先进的渲染方式。

标签: c++ opengl gldrawarrays


【解决方案1】:

description of glDrawArrays 中写着:

您可以使用 glVertexAttribPointer 预先指定单独的顶点、法线和颜色数组,而不是调用 GL 过程来传递每个单独的顶点属性,并使用它们通过一次调用 glDrawArrays 来构造图元序列。

这是你的解决方案吗?

【讨论】:

【解决方案2】:

“如果不是……我应该执行其他命令吗?” 固定功能属性和客户端功能自几十年以来已被弃用。请参阅 Fixed Function PipelineLegacy OpenGL。 阅读Vertex SpecificationShader,了解最先进的渲染方式。


无论如何,您可以通过glColorPointer 定义一组颜色属性,因此每个顶点坐标都与一个单独的颜色属性相关联:

float colors[] = {
     1.0f, 0.0f, 0.0f, // red
     1.0f, 0.0f, 0.0f,
     1.0f, 0.0f, 0.0f,
     0.0f, 1.0f, 0.0f, // green
     0.0f, 1.0f, 0.0f,
     0.0f, 1.0f, 0.0f
};

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

glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(3, GL_FLOAT, 0, colors);

glDrawArrays(GL_TRIANGLES, 0, 6);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多