当前位置:   article > 正文

Qt+OpenGL-part2

Qt+OpenGL-part2

1-2VAO与VBO_哔哩哔哩_bilibili

顶点着色器:

在GPU上创建内存,存储顶点数据

通过顶点缓冲对象(Vertex Buffer Objects,VBO)管理(GL_ARRAY_BUFFER)

在GPU的内存中存储数据,说明这些内存(这些字节)有什么含义。

顶点数组类型(Vertex Array Objects,VAO)

VAO不保存实际数据,而是放置顶点的定义。

position,color

OpenGL 4 Reference Pages (khronos.org)

Reference Guides - The Khronos Group Inc

小结:

关于VAO和VBO

  1. #include "openglwidget.h"
  2. unsigned int VBO,VAO;
  3. OpenGLWidget::OpenGLWidget(QWidget *parent) : QOpenGLWidget(parent)
  4. {
  5. }
  6. void OpenGLWidget::initializeGL()
  7. {
  8. initializeOpenGLFunctions();
  9. float vertices[]={
  10. -0.5f,-0.5f,0.0f,
  11. 0.5f,-0.5f,0.0f,
  12. 0.0f,0.5f,0.0f
  13. };
  14. glGenVertexArrays(1,&VAO);
  15. glGenBuffers(1,&VBO);
  16. glBindVertexArray(VAO);
  17. glBindBuffer(GL_ARRAY_BUFFER,VBO);
  18. glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);
  19. glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3*sizeof(float),(void *)0);
  20. glBindBuffer(GL_ARRAY_BUFFER,0);
  21. glBindVertexArray(0);
  22. }
  23. void OpenGLWidget::resizeGL(int w, int h)
  24. {
  25. }
  26. void OpenGLWidget::paintGL()
  27. {
  28. glClearColor(0.2f,0.3f,0.3f,1.0f);
  29. glClear(GL_COLOR_BUFFER_BIT);
  30. glBindVertexArray(VAO);
  31. glBindBuffer(GL_ARRAY_BUFFER,VBO);
  32. glDrawArrays(GL_TRIANGLES,0,3);
  33. }

1-3编译链接着色器_哔哩哔哩_bilibili

经过一些努力,终于可以画出三角形了。。。

  1. #ifndef OPENGLWIDGET_H
  2. #define OPENGLWIDGET_H
  3. #include <QOpenGLWidget>
  4. #include <QOpenGLFunctions_3_3_Core>
  5. class OpenGLWidget : public QOpenGLWidget,QOpenGLFunctions_3_3_Core
  6. {
  7. Q_OBJECT
  8. public:
  9. explicit OpenGLWidget(QWidget *parent = nullptr);
  10. protected:
  11. virtual void initializeGL();
  12. virtual void resizeGL(int w, int h);
  13. virtual void paintGL();
  14. signals:
  15. public slots:
  16. };
  17. #endif // OPENGLWIDGET_H
  1. #include "openglwidget.h"
  2. #include <QDebug>
  3. unsigned int VBO,VAO;
  4. unsigned int shaderProgram;
  5. //顶点着色器
  6. const char* vertexShaderSource="#version 330 core\n"
  7. "layout(location=0) in vec3 aPos;\n"
  8. "void main()\n"
  9. "{\n"
  10. "gl_Position=vec4(aPos.x,aPos.y,aPos.z,1.0);\n"
  11. "}\0";
  12. //片段着色器
  13. const char* fragmentShaderSource="#version 330 core\n"
  14. "out vec4 FragColor;\n"
  15. "void main()\n"
  16. "{\n"
  17. "FragColor=vec4(1.0f,0.5f,0.2f,1.0f);\n"
  18. "}\0";
  19. OpenGLWidget::OpenGLWidget(QWidget *parent) : QOpenGLWidget(parent)
  20. {
  21. }
  22. void OpenGLWidget::initializeGL()
  23. {
  24. initializeOpenGLFunctions();
  25. //三角形的三个点(x,y,z)
  26. float vertices[]={
  27. -0.5f,-0.5f,0.0f,
  28. 0.5f,-0.5f,0.0f,
  29. 0.0f,0.5f,0.0f
  30. };
  31. //顶点数组
  32. glGenVertexArrays(1,&VAO);
  33. //顶点缓冲对象
  34. glGenBuffers(1,&VBO);
  35. //绑定顶点数组
  36. glBindVertexArray(VAO);
  37. //绑定顶点缓冲对象
  38. glBindBuffer(GL_ARRAY_BUFFER,VBO);
  39. //把三角形相关数据复制到缓冲内存中
  40. glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);
  41. //第二个参数:数据的大小(字节为单位)
  42. //第三个参数:数据指针
  43. glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3*sizeof(float),(void *)0);
  44. glEnableVertexAttribArray(0);
  45. glBindBuffer(GL_ARRAY_BUFFER,0);
  46. glBindVertexArray(0);
  47. unsigned int vertexShader=glCreateShader(GL_VERTEX_SHADER);
  48. glShaderSource(vertexShader,1,&vertexShaderSource,NULL);
  49. glCompileShader(vertexShader);
  50. int success;
  51. char infoLog[512];
  52. glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
  53. if(!success)
  54. {
  55. glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
  56. qDebug() << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog;
  57. }
  58. unsigned int fragmentShader=glCreateShader(GL_FRAGMENT_SHADER);
  59. glShaderSource(fragmentShader,1,&fragmentShaderSource,NULL);
  60. glCompileShader(fragmentShader);
  61. shaderProgram=glCreateProgram();
  62. glAttachShader(shaderProgram,vertexShader);
  63. glAttachShader(shaderProgram,fragmentShader);
  64. glLinkProgram(shaderProgram);
  65. glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
  66. if(!success) {
  67. glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
  68. qDebug() << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog;
  69. }
  70. glDeleteShader(vertexShader);
  71. glDeleteShader(fragmentShader);
  72. }
  73. void OpenGLWidget::resizeGL(int w, int h)
  74. {
  75. }
  76. void OpenGLWidget::paintGL()
  77. {
  78. glClearColor(0.2f,0.3f,0.3f,1.0f);
  79. glClear(GL_COLOR_BUFFER_BIT);
  80. glUseProgram(shaderProgram);
  81. glBindVertexArray(VAO);
  82. glDrawArrays(GL_TRIANGLES,0,3);
  83. }

OpenGL入门教程之 深入三角形_opengl绘制三角形平移旋转-CSDN博客

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号