掌握OpenGL绝技,从零开始的详细教程!

作者:达州淘贝游戏开发公司 阅读:85 次 发布时间:2023-05-15 15:22:00

摘要:  OpenGL是一款跨平台的图形渲染API,广泛用于游戏开发、建筑设计、工业仿真、科学研究等领域。如果你想在计算机图形方面有所建树,掌握OpenGL必不可少。本文将为您提供一份从零开始的OpenGL教程,帮助您快速掌握OpenGL的基础知识和绝技。  1. 安装OpenGL  首先,要使用...

  OpenGL是一款跨平台的图形渲染API,广泛用于游戏开发、建筑设计、工业仿真、科学研究等领域。如果你想在计算机图形方面有所建树,掌握OpenGL必不可少。本文将为您提供一份从零开始的OpenGL教程,帮助您快速掌握OpenGL的基础知识和绝技。

掌握OpenGL绝技,从零开始的详细教程!

  1. 安装OpenGL

  首先,要使用OpenGL,需要在计算机上安装OpenGL开发环境。一般来说,安装OpenGL需要完成以下几个步骤:

  1.1安装OpenGL的SDK和库文件:可以从OpenGL官网(https://www.opengl.org/)上下载安装包,然后根据提示进行安装。

  1.2设置IDE:编程中需要用到IDE(集成开发环境),如Visual Studio、Eclipse等。

  1.3添加库文件:将OpenGL库文件添加到IDE中,以便在编写代码时调用。

  2.学习OpenGL基础知识

  在理解OpenGL的基础知识之前,必须先了解OpenGL的结构和概念:

  OpenGL是由状态机作为基础的,每一个状态都有自己的属性,包括可见性、颜色、位置等。OpenGL的工作方式是从状态机设定的状态开始,根据API调用逐步修改状态,最终显示在屏幕上。

  OpenGL的主要术语包括:

  顶点(Vertex):指在三维坐标系中定义的点。

  三角形(Triangle):通过顶点之间连接和填充颜色、纹理形成的三角形。

  渲染(Rendering):指将图形或图像可视化的过程。

  着色器(Shader):允许程序员以自定义方式计算每个像素的颜色。

  VAO(Vertex Array Object):用于存储所有渲染数据的容器。

  VBO(Vertex Buffer Object):储存一组由OpenGL渲染的一系列“点”。

  3.创建第一个OpenGL程序

  学习了OpenGL基础知识后,我们来创建一个简单的OpenGL程序。

  步骤:

  3.1 新建工程。

  3.2 建立OpenGL窗口。

  3.3 渲染窗口。

  详细代码如下:

  ```

  #include

  void OnDisplay() {

   glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

   glClear(GL_COLOR_BUFFER_BIT);

   glutSwapBuffers();

  }

  int main(int argc, char** argv) {

   glutInit(&argc, argv);

   glutInitDisplayMode(GLUT_DOUBLE);

   glutInitWindowSize(800, 600);

   glutCreateWindow("My First OpenGL Window");

   glutDisplayFunc(OnDisplay);

   glutMainLoop();

   return 0;

  }

  ```

  以上代码演示了如何使用OpenGL创建一个最基础的窗口。其中:

  glClearColor()的作用是设置清屏颜色;

  glClear()的作用是清除缓存数据;

  glutSwapBuffers()的作用是展示渲染结果;

  glutDisplayFunc()是OpenGL调用渲染函数的函数。

  4.创建一个矩形

  了解了如何创建OpenGL的窗口之后,接下来,我们创建一个矩形来更好地理解OpenGL。

  步骤:

  4.1 创建一个VAO对象。

  4.2 创建一个VBO对象。

  4.3 绑定VAO。

  4.4 把VBO数据传给GPU。

  4.5 编写着色器。

  4.6 绘制矩形。

  详细代码如下:

  ```

  #include

  #include

  const GLfloat vVerts[] = {

   0.0f, 0.5f, 0.0f,

   -0.5f, -0.5f, 0.0f,

   0.5f, -0.5f, 0.0f

  };

  GLuint VBO, VAO;

  //顶点着色器

  const char* vertexShaderSource =

   "#version 330 core "

   "layout (location = 0) in vec3 aPos;"

   "void main() {"

   " gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);"

   "}";

  //片段着色器

  const char* fragmentShaderSource =

   "#version 330 core "

   "out vec4 FragColor;"

   "void main() {"

   " FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);"

   "}";

  void OnDisplay() {

   glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

   glClear(GL_COLOR_BUFFER_BIT);

   glUseProgram(shaderProgram);

   glBindVertexArray(VAO);

   glDrawArrays(GL_TRIANGLES, 0, 3);

   glBindVertexArray(0);

   glutSwapBuffers();

  }

  void OnCreate() {

   glGenVertexArrays(1, &VAO); //生成VAO

   glGenBuffers(1, &VBO); //生成VBO

   glBindVertexArray(VAO);

   glBindBuffer(GL_ARRAY_BUFFER, VBO);

   glBufferData(GL_ARRAY_BUFFER, sizeof(vVerts), vVerts, GL_STATIC_DRAW);

   glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);

   glEnableVertexAttribArray(0);

   glBindBuffer(GL_ARRAY_BUFFER, 0);

   glBindVertexArray(0);

   //编译着色器

   GLint success;

   GLchar infoLog[512];

   GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);

   glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);

   glCompileShader(vertexShader);

   glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);

   if (!success) {

   glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);

   std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED " << infoLog << std::endl;

   }

   GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);

   glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);

   glCompileShader(fragmentShader);

   glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);

   if (!success) {

   glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);

   std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED " << infoLog << std::endl;

   }

   GLuint shaderProgram = glCreateProgram();

   glAttachShader(shaderProgram, vertexShader);

   glAttachShader(shaderProgram, fragmentShader);

   glLinkProgram(shaderProgram);

   glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);

   if (!success) {

   glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);

   std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED " << infoLog << std::endl;

   }

   glDeleteShader(vertexShader);

   glDeleteShader(fragmentShader);

  }

  int main(int argc, char** argv) {

   glutInit(&argc, argv);

   glutInitDisplayMode(GLUT_DOUBLE);

   glutInitWindowSize(800, 600);

   glutCreateWindow("OpenGL rectangle");

   glewExperimental = GL_TRUE; //GLEW

   glewInit(); //Initialize GLEW

   OnCreate();

   glutDisplayFunc(OnDisplay);

   glutMainLoop();

   return 0;

  }

  ```

  以上代码演示了如何创建一个矩形,并将其渲染出来。其中:

  创建VAO和VBO:在初始化OpenGL时,需要为我们的图形创建一个VertexArrayObject和一个VertexBufferObject。

  绑定:绑定VAO和VBO,以便我们将图形数据传输给OpenGL。

  编写着色器:通常,一个着色器程序有多个着色器,顶点着色器和片段着色器是最基本的着色器。顶点着色器 takes in an array of vertices(接受一个顶点数组),然后将它们转换为代码中的对象。然后,它输出一个vec4变量,其中w设置为1.0,用于坐标变换所需的齐次坐标。与之相反,片段着色器将像素颜色计算为输入所需的颜色。

  绘制矩形:最后,需要渲染这个矩形,使用glDrawArrays()函数。

  5.总结

  本文介绍了如何从零开始创建OpenGL应用程序。我们覆盖了OpenGL的基本结构和概念,学习创建窗口和绘制几何图形。OpenGL是一个庞大的框架,具有强大的实用性和优秀的性能。通过本文所提供的基础教程,希望能帮助读者更快地了解OpenGL,并掌握绝技。

  • 原标题:掌握OpenGL绝技,从零开始的详细教程!

  • 本文链接:https://qipaikaifa1.com/tb/1068.html

  • 本文由达州淘贝游戏开发公司小编,整理排版发布,转载请注明出处。部分文章图片来源于网络,如有侵权,请与淘贝科技联系删除。
  • 微信二维码

    CTAPP999

    长按复制微信号,添加好友

    微信联系

    在线咨询

    点击这里给我发消息QQ客服专员


    点击这里给我发消息电话客服专员


    在线咨询

    免费通话


    24h咨询☎️:189-2934-0276


    🔺🔺 棋牌游戏开发24H咨询电话 🔺🔺

    免费通话
    返回顶部