OpenSceneGraph中的OpenGL哲学(一):第1章 OpenGL概述

  2015年1月26日,在知道这本书上市了一个月之后,终于有一个机会在京东上买下了这边书《OpenGL编程指南(原书第八版)》,接下来的时间,会用OSG的思路,一个个的实现书中的例子程序,并且逐步学习OSG中和OpenGL千丝万缕的联系。

  老实说,对于一个没有任何图形学基础的人,是看不懂这本书的第一章的,或者没法完全看懂第一章的。如果您是一个没有任何图形学基础的人,您也不应该放弃对于OpenGL的学习热诚,开始或许困难,但是迟早它会变成一个HelloWorld,只要我们不断的努力。在接下来的时间里,会和大家共同学习这本书,博主并不是OpenGL的专家,也是和大家一样,一名虔诚的学习者。

  

  1.1 什么是OpenGL

  这个读者可以看书,或者上网查询相关资料,博主不再赘述。

 

  1.2初识OpenGL程序

  博主用OSG的方式,重写了这段程序:

 1 #include<osgViewer/Viewer>
 2 
 3 //OpenGL编程指南(原书第八版) 例1.1
 4 osg::ref_ptr<osg::Geometry> getGeometry_1_1()
 5 {
 6     //声明一个Geometry
 7     osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry();
 8 
 9     //声明并初始化顶点数组
10     osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array();
11     vertices->push_back(osg::Vec3(-0.90,-0.90,0.0));//第一个三角形
12     vertices->push_back(osg::Vec3( 0.85,-0.90,0.0));
13     vertices->push_back(osg::Vec3(-0.90, 0.85,0.0));
14     vertices->push_back(osg::Vec3( 0.90,-0.85,0.0));//第二个三角形
15     vertices->push_back(osg::Vec3( 0.90, 0.90,0.0));
16     vertices->push_back(osg::Vec3(-0.85, 0.90,0.0));
17     
18     //设置Geometry顶点数组
19     geometry->setVertexArray(vertices);
20 
21     //添加图元绘制
22     geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::Mode::TRIANGLES, 0, vertices->size()));
23 
24     //OpenSceneGraph的Geometry对象使用GLSL方法
25     {
26         osg::ref_ptr<osg::Program> program = new osg::Program();
27         program->addShader(osg::Shader::readShaderFile(osg::Shader::Type::VERTEX, "D:\\vert.glsl"));
28         program->addShader(osg::Shader::readShaderFile(osg::Shader::Type::FRAGMENT, "D:\\frag.glsl"));
29 
30         geometry->getOrCreateStateSet()->setAttributeAndModes(program, osg::StateAttribute::Values::ON | osg::StateAttribute::Values::PROTECTED);
31     }
32 
33     return geometry;
34 }
35 
36 void main()
37 {
38     osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
39 
40     osg::ref_ptr<osg::Group> root = new osg::Group();
41     root->addChild(getGeometry_1_1());
42 
43     viewer->setSceneData(root);
44     viewer->run();
45 }
1 #version 430 core 
2 layout (location=0) in vec4 vPosition;
3 
4 void main()
5 {
6     gl_Position=vPosition;
7 }
1 #version 430 core
2 out vec4 fColor;
3 
4 void main()
5 {
6     fColor=vec4(0.0,0.0,1.0,1.0);
7 }

  上文中“顶点着色器”、“片元着色器”代码块分别对应文件:D:\\vert.glsl、D:\\frag.glsl文件中的内容。

  如果您看到如下图所示的渲染效果,那么恭喜您,您已经进入了OpenGL和OSG的世界:

 

  1.3OpenGL语法

  书中已经讲到,不再赘述。

 

  1.4OpenGL渲染管线

  顶点数据-->顶点着色器-->细分控制着色器-->细分计算着色器-->几何着色器-->图元设置-->剪切-->光栅化-->片元着色器-->(上图最终效果看到的图形)

 

  1.5第一个程序:深入分析

  书中通过大量的篇幅介绍了OpenGL、GLUT、GLEW相互协同,绘出最终两个三角形的例子程序。相比而已,博主的这个OSG的程序,就显得简单多了。博主在代码中加了比较详细的注释,稍微有点OSG基础的读者,应该可以看明白。原本打算详细分析一下OSG中是怎么使用Shader、Program这些对象的,但是想到这是第一篇,不想增加读者的入门难度,详细的分析将在日后的博客中推出。

 

 

  

  

posted @ 2015-01-27 15:36  武汉小孩  阅读(1019)  评论(1编辑  收藏  举报