maktoub 2023-04-04 20:32 采纳率: 66.7%
浏览 20
已结题

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);
  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-04-07 16:55
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 这个问题的回答你可以参考下: 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萌谷手册视频教程课程中的 原理?课时数?课时长度?小节, 巩固相关知识点

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月23日
  • 已采纳回答 11月15日
  • 创建了问题 4月4日