经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 软件/图像 » OpenGL » 查看文章
OpenGL编程指南(第九版) Tiangles 学习笔记
来源:cnblogs  作者:moonfair  时间:2019/4/26 8:40:40  对本文有异议
  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Triangles.cpp
  4. //
  5. //////////////////////////////////////////////////////////////////////////////
  6. #include "vgl.h"
  7. #include "LoadShaders.h"
  8.  
  9. enum VAO_IDs { Triangles, NumVAOs };
  10. enum Buffer_IDs { ArrayBuffer, NumBuffers };
  11. enum Attrib_IDs { vPosition = 0 };
  12. GLuint VAOs[NumVAOs];
  13. GLuint Buffers[NumBuffers];
  14. const GLuint NumVertices = 6;
  15. //----------------------------------------------------------------------------
  16. //
  17. // init
  18. //
  19.  
  20. void
  21. init( void )
  22. {
  23. glGenVertexArrays( NumVAOs, VAOs );
  24. glBindVertexArray( VAOs[Triangles] );
  25. GLfloat vertices[NumVertices][2] = {
  26. { -0.90f, -0.90f }, { 0.85f, -0.90f }, { -0.90f, 0.85f }, // Triangle 1
  27. { 0.90f, -0.85f }, { 0.90f, 0.90f }, { -0.85f, 0.90f } // Triangle 2
  28. };
  29. glCreateBuffers( NumBuffers, Buffers );
  30. glBindBuffer( GL_ARRAY_BUFFER, Buffers[ArrayBuffer] );
  31. glBufferStorage( GL_ARRAY_BUFFER, sizeof(vertices), vertices, 0);
  32. ShaderInfo shaders[] =
  33. {
  34. { GL_VERTEX_SHADER, "media/shaders/triangles/triangles.vert" },
  35. { GL_FRAGMENT_SHADER, "media/shaders/triangles/triangles.frag" },
  36. { GL_NONE, NULL }
  37. };
  38. GLuint program = LoadShaders( shaders );
  39. glUseProgram( program );
  40. glVertexAttribPointer( vPosition, 2, GL_FLOAT,
  41. GL_FALSE, 0, BUFFER_OFFSET(0) );
  42. glEnableVertexAttribArray( vPosition );
  43. }
  44. //----------------------------------------------------------------------------
  45. //
  46. // display
  47. //
  48.  
  49. void
  50. display( void )
  51. {
  52. static const float black[] = { 1.0f, 0.0f, 0.0f, 0.0f };
  53. glClearBufferfv(GL_COLOR, 0, black);
  54. glBindVertexArray( VAOs[Triangles] );
  55. glDrawArrays( GL_TRIANGLES, 0, NumVertices );
  56. }
  57. //----------------------------------------------------------------------------
  58. //
  59. // main
  60. //
  61. #ifdef _WIN32
  62. int CALLBACK WinMain(
  63. _In_ HINSTANCE hInstance,
  64. _In_ HINSTANCE hPrevInstance,
  65. _In_ LPSTR lpCmdLine,
  66. _In_ int nCmdShow
  67. )
  68. #else
  69. int
  70. main( int argc, char** argv )
  71. #endif
  72. {
  73. glfwInit();
  74. GLFWwindow* window = glfwCreateWindow(800, 600, "Triangles", NULL, NULL);
  75. glfwMakeContextCurrent(window);
  76. gl3wInit();
  77. init();
  78. while (!glfwWindowShouldClose(window))
  79. {
  80. display();
  81. glfwSwapBuffers(window);
  82. glfwPollEvents();
  83. }
  84. glfwDestroyWindow(window);
  85. glfwTerminate();
  86. }

一、环境问题

  首先就是环境的问题,样例中使用的 glCreateBuffers() 函数要求显卡驱动支持OpenGL 4.5才可以使用,如果版本不达标会出现空指针错误。

  解决方法:升级你的显卡驱动, 如果驱动已经是最新,则检查是否为双显卡,将独显(一般都是n卡)设为首选。

二、全局变量

  程序在开头位置(头文件下边)声明了一些对于初学者不明觉厉的枚举值和整型数组。

  其中那些以 IDs 结尾枚举值都是起到了索引的功能,因为 OpenGL 是使用一些整数作为对象(比如缓冲区,顶点数组等)的标记,这些整数通常没有规律可言,因此将同类型的对象的标记存放在一个整型数组中能够便于我们进行管理。

  值得注意的是,每个索引的最后一个元素(以Num为前缀,数组名为后缀的那个元素)只起到表示对象数量的作用,没有其他实际意义。

三、顶点数组与顶点着色器

  顶点数组也是个相当令人困惑的地方。

  有人会说有了顶点着色器表示顶点的信息要顶点数组有什么用,但是仔细去看,顶点着色器只是起到一个中间处理的作用,最终进入绘制函数的仍然是顶点数组。

  因此顶点数据的流向其实是这样的:在一般数组中创建(只包含位置信息) -> 进入顶点着色器进行加工(本例程中虽然只起到了传递数据的作用) -> 传入顶点数组中准备进行绘制。

  此外顶点数组的创建过程也很有意思:glCreateVertexArrays() 只负责进行空间的分配 -> glBindVertexArray() 将数组选中准备进行操作 -> glVertexAttribPointer() 负责对它进行赋值。

 

四、缓冲区

  在我理解中缓冲区大概就是一个全局可用的数据块。

  值得注意的是在顶点数据的流动中缓冲区起到了不可替代的作用。或者可以说凡是跨函数的数据操作,都用到了缓冲区:要么是向被调用函数中传入缓冲区的编号(之前提到的标志),要么是通过 glBindBuffer 将要用到的缓冲区设为激活状态。

  在本程序中使用了后者:顶点数据先从数组中被存放在缓冲区中 -> 顶点着色器再通过访问 / 修改缓冲区进行顶点着色 ->  最后 glVertexAttribPointer() 从缓冲区中将定点数据赋值给顶点数组。

  缓冲区的创建与顶点数组相同,Create 函数是成批地创建缓存的,它接受的是一个数组和它的大小,结果是把创建的缓冲区的编号写入给出的数组中。

 

 

原文链接:http://www.cnblogs.com/moonfair/p/10768621.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号