OpenGl颜色数组问题

OpenGl是怎么通过顶点数组来画图的,就像是画一个正方体,颜色数组有八个元素,是对应八个定顶点吗?

vertex3 pt1[8] = { {0,0,0}, {0,1,0}, {1, 0, 0},{1, 1, 0},{0, 0, 1},{0, 1, 1},{1, 0, 1},{1, 1, 1} };
color3 col1[8] = { {1,0,0},{1,0,0},{0,0,1},{0,0,1},{1,0,0},{1,0,0},{0,0,1},{0,0,1} };

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3, GL_INT,0,pt1);
glColorPointer(3, GL_FLOAT, 0,col1);

GLuint vertIndex[] = { 6, 2, 3, 7 ,5, 1, 0, 4 ,7, 3, 1, 5 ,4, 0, 2, 6,2, 0, 1, 3 ,7, 5, 4, 6 };
glDrawElements(GL_QUADS, 24, GL_UNSIGNED_INT, vertIndex);

你想实现8种颜色渐变吗?

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/648847
  • 除此之外, 这篇博客: OpenGL基础5:第一个正方形中的 四、测试 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    看可不可以在不参考任何文章和代码的情况下,仅通过修改之前生成的三角形的代码,生成如下图形:

    参考代码:

    #pragma comment(lib,"glew32.lib")
    #include<iostream>
    #include<opengl/glew.h>
    #define GLEW_STATIC
    #include<GLFW/glfw3.h>
    #include<opengl/freeglut.h>
    
    void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode);
    const GLuint WIDTH = 800, HEIGHT = 600;
    
    // Shaders
    const GLchar* VShader =
    "#version 330 core\n"
    "layout (location = 0) in vec3 position;\n"
    "void main()\n"
    "{\n"
        "gl_Position = vec4(position.x, position.y, position.z, 1.0);\n"
    "}\0";
    
    const GLchar* FShaderY =
    "#version 330 core\n"
    "out vec4 color;\n"
    "void main()\n"
    "{\n"
        "color = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
    "}\n\0";
    
    const GLchar* FShaderB =
    "#version 330 core\n"
    "out vec4 color;\n"
    "void main()\n"
    "{\n"
        "color = vec4(0.1f, 0.1f, 1.0f, 1.0f);\n"
    "}\n\0";
    
    int main()
    {
        glfwInit();
        glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
        glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
        glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
        glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
    
        GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr);
        glfwMakeContextCurrent(window);
        glfwSetKeyCallback(window, key_callback);
        glewExperimental = GL_TRUE;
        glewInit();
    
        int width, height;
        glfwGetFramebufferSize(window, &width, &height);
        glViewport(0, 0, width, height);
    
        GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
        glShaderSource(vertexShader, 1, &VShader, NULL);
        glCompileShader(vertexShader);
        GLuint fShaderY = glCreateShader(GL_FRAGMENT_SHADER);
        glShaderSource(fShaderY, 1, &FShaderY, NULL);
        glCompileShader(fShaderY);
        GLuint fShaderB = glCreateShader(GL_FRAGMENT_SHADER);
        glShaderSource(fShaderB, 1, &FShaderB, NULL);
        glCompileShader(fShaderB);
       
        GLuint shaderYellow = glCreateProgram();
        GLuint shaderBlue = glCreateProgram();
        glAttachShader(shaderYellow, vertexShader);
        glAttachShader(shaderYellow, fShaderY);
        glLinkProgram(shaderYellow);
        glAttachShader(shaderBlue, vertexShader);
        glAttachShader(shaderBlue, fShaderB);
        glLinkProgram(shaderBlue);
    
        glDeleteShader(vertexShader);
        glDeleteShader(fShaderY);
        glDeleteShader(fShaderB);
    
        GLfloat trangleY[] =
        {
            -0.5f, -0.5f, 0.0f,
            -0.5f, 0.5f, 0.0f,
            0.0f, 0.0f, 0.0f
        };
        GLfloat trangleB[] =
        {
            0.5f, -0.5f, 0.0f,
            0.5f, 0.5f, 0.0f,
            0.0f, 0.0f, 0.0f
        };
        GLuint VBO[2], VAO[2];
        glGenVertexArrays(2, VAO);
        glGenBuffers(2, VBO);
        
        glBindVertexArray(VAO[0]);
        glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);
        glBufferData(GL_ARRAY_BUFFER, sizeof(trangleY), trangleY, GL_STATIC_DRAW);
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
        glEnableVertexAttribArray(0);
    
        glBindVertexArray(VAO[1]);
        glBindBuffer(GL_ARRAY_BUFFER, VBO[1]);
        glBufferData(GL_ARRAY_BUFFER, sizeof(trangleB), trangleB, GL_STATIC_DRAW);
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
        glEnableVertexAttribArray(0);
    
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glBindVertexArray(0);
    
        while (!glfwWindowShouldClose(window))
        {
            glfwPollEvents();
            glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
            glClear(GL_COLOR_BUFFER_BIT);
    
            glUseProgram(shaderYellow);
            glBindVertexArray(VAO[0]);
            glDrawArrays(GL_TRIANGLES, 0, 3);
            glUseProgram(shaderBlue);
            glBindVertexArray(VAO[1]);
            glDrawArrays(GL_TRIANGLES, 0, 3);
    
            glBindVertexArray(0);
            glfwSwapBuffers(window);
        }
        glDeleteVertexArrays(2, VAO);
        glDeleteBuffers(2, VBO);
        glfwTerminate();
        return 0;
    }
    
    void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
    {
        if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
            glfwSetWindowShouldClose(window, GL_TRUE);
    }

     

    参考文献:

    https://learnopengl.com/#!Getting-started/OpenGL
  • 您还可以看一下 杨振老师的OpenGL萌谷手册视频教程课程中的 原理?课时数?课时长度?小节, 巩固相关知识点

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^