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这些对象的,但是想到这是第一篇,不想增加读者的入门难度,详细的分析将在日后的博客中推出。