在Ubuntu 20.04上编译OpenGL超级宝典第七版源码

OpenGL超级宝典的源码一向都不在Ubuntu上测试。也不知道他们是在什么平台上开发的。所以编译的时候就会遇到麻烦。

以下是我编译的过程:

根据书中描述,安装glfw3:
安装glfw3

可以看到,安装它会顺便把一坨mesa还有x11相关的库都装上。

2. 然后进入build目录cmake:

madbunny@madbunny-virtual-machine:~/桌面/sb7code-master/build$ cmake .. — The C compiler identification is GNU 9.4.0 — The CXX compiler identification is GNU 9.4.0 — Check for working C compiler: /usr/bin/cc — Check for working C compiler: /usr/bin/cc — works — Detecting C compiler ABI info — Detecting C compiler ABI info – done — Detecting C compile features — Detecting C compile features – done — Check for working CXX compiler: /usr/bin/c++ — Check for working CXX compiler: /usr/bin/c++ — works — Detecting CXX compiler ABI info — Detecting CXX compiler ABI info – done — Detecting CXX compile features — Detecting CXX compile features – done CMake Warning (dev) at /usr/share/cmake-3.16/Modules/FindOpenGL.cmake:275 (message): Policy CMP0072 is not set: FindOpenGL prefers GLVND by default when available. Run “cmake –help-policy CMP0072” for policy details. Use the cmake_policy command to set the policy and suppress this warning. FindOpenGL found both a legacy GL library: OPENGL_gl_LIBRARY: /usr/lib/x86_64-linux-gnu/libGL.so and GLVND libraries for OpenGL and GLX: OPENGL_opengl_LIBRARY: /usr/lib/x86_64-linux-gnu/libOpenGL.so OPENGL_glx_LIBRARY: /usr/lib/x86_64-linux-gnu/libGLX.so OpenGL_GL_PREFERENCE has not been set to “GLVND” or “LEGACY”, so for compatibility with CMake 3.10 and below the legacy GL library will be used. Call Stack (most recent call first): CMakeLists.txt:19 (find_package) This warning is for project developers. Use -Wno-dev to suppress it. — Found OpenGL: /usr/lib/x86_64-linux-gnu/libOpenGL.so — Found PkgConfig: /usr/bin/pkg-config (found version “1.6.3”) — Checking for module glfw3 — Found glfw3, version 3.3.2 — Found OpenMP_C: -fopenmp (found version “4.5”) — Found OpenMP_CXX: -fopenmp (found version “4.5”) — Found OpenMP: TRUE (found version “4.5”) — Configuring done — Generating done — Build files have been written to: /home/madbunny/桌面/sb7code-master/build

这个问题也不大。

3. 开始编译:

madbunny@madbunny-virtual-machine:~/桌面/sb7code-master/build$ make Scanning dependencies of target sb7 [ 1%] Building CXX object CMakeFiles/sb7.dir/src/sb7/sb7.cpp.o [ 1%] Building CXX object CMakeFiles/sb7.dir/src/sb7/sb7color.cpp.o [ 2%] Building CXX object CMakeFiles/sb7.dir/src/sb7/sb7ktx.cpp.o [ 2%] Building CXX object CMakeFiles/sb7.dir/src/sb7/sb7object.cpp.o /home/madbunny/桌面/sb7code-master/src/sb7/sb7object.cpp: In member function ‘void sb7::object::render_sub_object(unsigned int, unsigned int, unsigned int)’: /home/madbunny/桌面/sb7code-master/src/sb7/sb7object.cpp:212:77: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] 212 | (void*)sub_object[object_index].first, | ^~~~~ [ 3%] Building CXX object CMakeFiles/sb7.dir/src/sb7/sb7shader.cpp.o [ 4%] Building CXX object CMakeFiles/sb7.dir/src/sb7/sb7textoverlay.cpp.o [ 4%] Building C object CMakeFiles/sb7.dir/src/sb7/gl3w.c.o [ 5%] Linking CXX static library lib/libsb7.a [ 5%] Built target sb7 Scanning dependencies of target wrapmodes [ 6%] Building CXX object CMakeFiles/wrapmodes.dir/src/wrapmodes/wrapmodes.cpp.o [ 7%] Linking CXX executable ../bin/wrapmodes /usr/bin/ld: 找不到 -lglfw3 /usr/bin/ld: 找不到 -lXinerama /usr/bin/ld: 找不到 -lXi /usr/bin/ld: 找不到 -lXxf86vm /usr/bin/ld: 找不到 -lXcursor collect2: error: ld returned 1 exit status make[2]: *** [CMakeFiles/wrapmodes.dir/build.make:85:../bin/wrapmodes] 错误 1 make[1]: *** [CMakeFiles/Makefile2:269:CMakeFiles/wrapmodes.dir/all] 错误 2 make: *** [Makefile:84:all] 错误 2 madbunny@madbunny-virtual-machine:~/桌面/sb7code-master/build$

哎,,,果然出了问题。慢慢来吧。

第一个问题:找不到 -lglfw3。

明明刚才安装了glfw3,咋会找不到呢?看看usr/lib下面到底有没有这个库:

madbunny@madbunny-virtual-machine:/usr/lib$ find -name *glfw* ./x86_64-linux-gnu/libglfw.so ./x86_64-linux-gnu/libglfw.so.3 ./x86_64-linux-gnu/cmake/glfw3 ./x86_64-linux-gnu/cmake/glfw3/glfw3Config.cmake ./x86_64-linux-gnu/cmake/glfw3/glfw3Targets-none.cmake ./x86_64-linux-gnu/cmake/glfw3/glfw3Targets.cmake ./x86_64-linux-gnu/cmake/glfw3/glfw3ConfigVersion.cmake ./x86_64-linux-gnu/libglfw.so.3.3 ./x86_64-linux-gnu/pkgconfig/glfw3.pc madbunny@madbunny-virtual-machine:/usr/lib$

原来,虽然安装的是glfw3,但是库的名字是glfw,并没有3,,,所以得去改cmake。一般找库名的工作都是放在顶层cmake,或者找库名的CMakeLists.txt的入口会放在顶层cmake,所以先打开顶层CMakeLists.txt看一看:

if(WIN32)set(COMMON_LIBS sb7 optimized glfw3 debug glfw3_d ${GLFW_LIBRARIES} ${OPENGL_LIBRARIES})elseif (UNIX)find_package(PkgConfig REQUIRED)pkg_check_modules(GLFW REQUIRED glfw3)set(COMMON_LIBS sb7 glfw3 X11 Xrandr Xinerama Xi Xxf86vm Xcursor GL rt dl)else()set(COMMON_LIBS sb7)endif()

果然有问题!不知道为什么,它查找GLFW之后,并没有使用找到的GLFW变量作为依赖项!所以改掉就可以解决了。不过这个地方问题有点大:好几个库都没有用pkg_check_modules查找,都是直接用的库文件名。不管了,先把这一个地方改了再说:

set(COMMON_LIBS sb7 ${GLFW_LIBRARIES} X11 Xrandr Xinerama Xi Xxf86vm Xcursor GL rt dl)

cmake.. make:

madbunny@madbunny-virtual-machine:~/桌面/sb7code-master/build$ cmake .. CMake Warning (dev) at /usr/share/cmake-3.16/Modules/FindOpenGL.cmake:275 (message): Policy CMP0072 is not set: FindOpenGL prefers GLVND by default when available. Run “cmake –help-policy CMP0072” for policy details. Use the cmake_policy command to set the policy and suppress this warning. FindOpenGL found both a legacy GL library: OPENGL_gl_LIBRARY: /usr/lib/x86_64-linux-gnu/libGL.so and GLVND libraries for OpenGL and GLX: OPENGL_opengl_LIBRARY: /usr/lib/x86_64-linux-gnu/libOpenGL.so OPENGL_glx_LIBRARY: /usr/lib/x86_64-linux-gnu/libGLX.so OpenGL_GL_PREFERENCE has not been set to “GLVND” or “LEGACY”, so for compatibility with CMake 3.10 and below the legacy GL library will be used. Call Stack (most recent call first): CMakeLists.txt:19 (find_package) This warning is for project developers. Use -Wno-dev to suppress it. — Found OpenMP_C: -fopenmp — Found OpenMP_CXX: -fopenmp — Found OpenMP: TRUE — Configuring done — Generating done — Build files have been written to: /home/madbunny/桌面/sb7code-master/build madbunny@madbunny-virtual-machine:~/桌面/sb7code-master/build$ make [ 5%] Built target sb7 [ 6%] Linking CXX executable ../bin/wrapmodes /usr/bin/ld: 找不到 -lXinerama /usr/bin/ld: 找不到 -lXi /usr/bin/ld: 找不到 -lXxf86vm /usr/bin/ld: 找不到 -lXcursor collect2: error: ld returned 1 exit status make[2]: *** [CMakeFiles/wrapmodes.dir/build.make:85:../bin/wrapmodes] 错误 1 make[1]: *** [CMakeFiles/Makefile2:269:CMakeFiles/wrapmodes.dir/all] 错误 2 make: *** [Makefile:84:all] 错误 2 madbunny@madbunny-virtual-machine:~/桌面/sb7code-master/build$

果然不报glfw3的问题了!

至于剩下的X。。。的那些库,应该都是跟X11窗口环境有关的。超级宝典里介绍过,GLFW就是用来屏蔽本地窗口环境细节的,所以大概率是不需要那些库的。那些库可能单纯是为了防止你想自己编译GLFW时会用到。既然已经装好了glfw,应该是用不到这些库的。总之删掉试试看:

pkg_check_modules(GLFW REQUIRED glfw3)#set(COMMON_LIBS sb7 ${GLFW_LIBRARIES} X11 Xrandr Xinerama Xi Xxf86vm Xcursor GL rt dl) set(COMMON_LIBS sb7 ${GLFW_LIBRARIES} GL rt dl)

然后编译:

madbunny@madbunny-virtual-machine:~/桌面/sb7code-master/build$ cmake .. — The C compiler identification is GNU 9.4.0 — The CXX compiler identification is GNU 9.4.0 — Check for working C compiler: /usr/bin/cc — Check for working C compiler: /usr/bin/cc — works — Detecting C compiler ABI info — Detecting C compiler ABI info – done — Detecting C compile features — Detecting C compile features – done — Check for working CXX compiler: /usr/bin/c++ — Check for working CXX compiler: /usr/bin/c++ — works — Detecting CXX compiler ABI info — Detecting CXX compiler ABI info – done — Detecting CXX compile features — Detecting CXX compile features – done — Found OpenGL: /usr/lib/x86_64-linux-gnu/libOpenGL.so — Found PkgConfig: /usr/bin/pkg-config (found version “1.6.3”) — Checking for module glfw3 — Found glfw3, version 3.3.2 — Found OpenMP_C: -fopenmp (found version “4.5”) — Found OpenMP_CXX: -fopenmp (found version “4.5”) — Found OpenMP: TRUE (found version “4.5”) — Configuring done — Generating done — Build files have been written to: /home/madbunny/桌面/sb7code-master/build madbunny@madbunny-virtual-machine:~/桌面/sb7code-master/build$ make -j8 Scanning dependencies of target sb7 [ 0%] Building CXX object CMakeFiles/sb7.dir/src/sb7/sb7object.cpp.o [ 1%] Building CXX object CMakeFiles/sb7.dir/src/sb7/sb7shader.cpp.o [ 1%] Building CXX object CMakeFiles/sb7.dir/src/sb7/sb7color.cpp.o [ 2%] Building CXX object CMakeFiles/sb7.dir/src/sb7/sb7.cpp.o [ 3%] Building CXX object CMakeFiles/sb7.dir/src/sb7/sb7ktx.cpp.o [ 4%] Building CXX object CMakeFiles/sb7.dir/src/sb7/sb7textoverlay.cpp.o [ 4%] Building C object CMakeFiles/sb7.dir/src/sb7/gl3w.c.o /home/madbunny/桌面/sb7code-master/src/sb7/sb7object.cpp: In member function ‘void sb7::object::render_sub_object(unsigned int, unsigned int, unsigned int)’: /home/madbunny/桌面/sb7code-master/src/sb7/sb7object.cpp:212:77: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] 212 | (void*)sub_object[object_index].first, | ^~~~~ [ 5%] Linking CXX static library lib/libsb7.a [ 5%] Built target sb7 Scanning dependencies of target tunnel Scanning dependencies of target tessellatedcube Scanning dependencies of target tesssubdivmodes Scanning dependencies of target springmass Scanning dependencies of target subroutines Scanning dependencies of target wrapmodes Scanning dependencies of target sparsetexture Scanning dependencies of target spinnycube [ 6%] Building CXX object CMakeFiles/tunnel.dir/src/tunnel/tunnel.cpp.o [ 7%] Building CXX object CMakeFiles/tessellatedcube.dir/src/tessellatedcube/tessellatedcube.cpp.o [ 8%] Building CXX object CMakeFiles/springmass.dir/src/springmass/springmass.cpp.o [ 8%] Building CXX object CMakeFiles/tesssubdivmodes.dir/src/tesssubdivmodes/tesssubdivmodes.cpp.o [ 9%] Building CXX object CMakeFiles/wrapmodes.dir/src/wrapmodes/wrapmodes.cpp.o [ 10%] Building CXX object CMakeFiles/subroutines.dir/src/subroutines/subroutines.cpp.o [ 11%] Building CXX object CMakeFiles/sparsetexture.dir/src/sparsetexture/sparsetexture.cpp.o [ 12%] Building CXX object CMakeFiles/spinnycube.dir/src/spinnycube/spinnycube.cpp.o [ 13%] Linking CXX executable ../bin/wrapmodes [ 13%] Linking CXX executable ../bin/tunnel [ 14%] Linking CXX executable ../bin/tesssubdivmodes [ 14%] Linking CXX executable ../bin/subroutines [ 14%] Linking CXX executable ../bin/tessellatedcube [ 15%] Linking CXX executable ../bin/springmass [ 15%] Linking CXX executable ../bin/spinnycube [ 15%] Linking CXX executable ../bin/sparsetexture [ 15%] Built target wrapmodes Scanning dependencies of target singletri [ 15%] Built target tesssubdivmodes [ 15%] Building CXX object CMakeFiles/singletri.dir/src/singletri/singletri.cpp.o Scanning dependencies of target tessmodes [ 15%] Built target subroutines [ 15%] Building CXX object CMakeFiles/tessmodes.dir/src/tessmodes/tessmodes.cpp.o Scanning dependencies of target singlepoint [ 15%] Built target tunnel [ 15%] Built target tessellatedcube [ 15%] Building CXX object CMakeFiles/singlepoint.dir/src/singlepoint/singlepoint.cpp.o Scanning dependencies of target simpletexture [ 15%] Built target sparsetexture Scanning dependencies of target simpletexcoords [ 15%] Built target springmass [ 15%] Built target spinnycube [ 15%] Building CXX object CMakeFiles/simpletexture.dir/src/simpletexture/simpletexture.cpp.o Scanning dependencies of target shapedpoints Scanning dependencies of target shadowmapping [ 16%] Building CXX object CMakeFiles/simpletexcoords.dir/src/simpletexcoords/simpletexcoords.cpp.o Scanning dependencies of target sdfdemo [ 17%] Building CXX object CMakeFiles/shadowmapping.dir/src/shadowmapping/shadowmapping.cpp.o [ 18%] Building CXX object CMakeFiles/shapedpoints.dir/src/shapedpoints/shapedpoints.cpp.o [ 18%] Building CXX object CMakeFiles/sdfdemo.dir/src/sdfdemo/sdfdemo.cpp.o [ 19%] Linking CXX executable ../bin/singletri [ 20%] Linking CXX executable ../bin/singlepoint [ 21%] Linking CXX executable ../bin/tessmodes [ 21%] Linking CXX executable ../bin/shapedpoints [ 23%] Linking CXX executable ../bin/sdfdemo [ 23%] Linking CXX executable ../bin/simpletexcoords [ 23%] Linking CXX executable ../bin/shadowmapping [ 23%] Built target singletri Scanning dependencies of target sampleshading [ 24%] Linking CXX executable ../bin/simpletexture [ 24%] Built target singlepoint [ 25%] Building CXX object CMakeFiles/sampleshading.dir/src/sampleshading/sampleshading.cpp.o [ 25%] Built target tessmodes Scanning dependencies of target gsquads Scanning dependencies of target gslayered [ 25%] Building CXX object CMakeFiles/gsquads.dir/src/gsquads/gsquads.cpp.o [ 26%] Building CXX object CMakeFiles/gslayered.dir/src/gslayered/gslayered.cpp.o [ 26%] Built target sdfdemo [ 26%] Built target shapedpoints [ 26%] Built target simpletexcoords Scanning dependencies of target clipdistance [ 26%] Built target shadowmapping Scanning dependencies of target fragmentlist Scanning dependencies of target fragcolorfrompos [ 28%] Building CXX object CMakeFiles/clipdistance.dir/src/clipdistance/clipdistance.cpp.o [ 28%] Building CXX object CMakeFiles/fragmentlist.dir/src/fragmentlist/fragmentlist.cpp.o [ 28%] Built target simpletexture Scanning dependencies of target stereo [ 28%] Building CXX object CMakeFiles/fragcolorfrompos.dir/src/fragcolorfrompos/fragcolorfrompos.cpp.o Scanning dependencies of target gsculling [ 28%] Building CXX object CMakeFiles/stereo.dir/src/stereo/stereo.cpp.o [ 29%] Building CXX object CMakeFiles/gsculling.dir/src/gsculling/gsculling.cpp.o [ 29%] Linking CXX executable ../bin/sampleshading [ 30%] Linking CXX executable ../bin/fragcolorfrompos [ 31%] Linking CXX executable ../bin/clipdistance [ 31%] Linking CXX executable ../bin/fragmentlist [ 31%] Built target sampleshading [ 32%] Linking CXX executable ../bin/gslayered [ 32%] Linking CXX executable ../bin/gsculling Scanning dependencies of target toonshading [ 33%] Linking CXX executable ../bin/stereo [ 35%] Building CXX object CMakeFiles/toonshading.dir/src/toonshading/toonshading.cpp.o [ 35%] Linking CXX executable ../bin/gsquads [ 35%] Built target fragcolorfrompos Scanning dependencies of target envmapsphere [ 36%] Building CXX object CMakeFiles/envmapsphere.dir/src/envmapsphere/envmapsphere.cpp.o [ 36%] Built target clipdistance [ 36%] Built target gslayered Scanning dependencies of target fontdemo [ 36%] Built target fragmentlist Scanning dependencies of target gstessellate Scanning dependencies of target prefixsum2d [ 36%] Building CXX object CMakeFiles/fontdemo.dir/src/fontdemo/fontdemo.cpp.o [ 36%] Building CXX object CMakeFiles/gstessellate.dir/src/gstessellate/gstessellate.cpp.o [ 36%] Built target gsculling [ 36%] Built target stereo Scanning dependencies of target grass [ 37%] Building CXX object CMakeFiles/prefixsum2d.dir/src/prefixsum2d/prefixsum2d.cpp.o [ 38%] Building CXX object CMakeFiles/grass.dir/src/grass/grass.cpp.o Scanning dependencies of target dof [ 38%] Built target gsquads [ 38%] Linking CXX executable ../bin/toonshading [ 39%] Building CXX object CMakeFiles/dof.dir/src/dof/dof.cpp.o Scanning dependencies of target noperspective [ 39%] Building CXX object CMakeFiles/noperspective.dir/src/noperspective/noperspective.cpp.o [ 40%] Linking CXX executable ../bin/fontdemo [ 40%] Linking CXX executable ../bin/envmapsphere [ 41%] Linking CXX executable ../bin/gstessellate [ 41%] Linking CXX executable ../bin/prefixsum2d [ 41%] Linking CXX executable ../bin/grass [ 41%] Built target toonshading Scanning dependencies of target blinnphong [ 42%] Building CXX object CMakeFiles/blinnphong.dir/src/blinnphong/blinnphong.cpp.o [ 42%] Built target fontdemo [ 42%] Linking CXX executable ../bin/dof [ 42%] Built target envmapsphere Scanning dependencies of target pmbstreaming Scanning dependencies of target dflandscape [ 43%] Linking CXX executable ../bin/noperspective [ 43%] Built target gstessellate [ 43%] Building CXX object CMakeFiles/pmbstreaming.dir/src/pmbstreaming/pmbstreaming.cpp.o Scanning dependencies of target deferredshading [ 43%] Built target prefixsum2d [ 43%] Building CXX object CMakeFiles/dflandscape.dir/src/dflandscape/dflandscape.cpp.o [ 44%] Building CXX object CMakeFiles/deferredshading.dir/src/deferredshading/deferredshading.cpp.o Scanning dependencies of target cubemapenv [ 44%] Built target grass [ 45%] Building CXX object CMakeFiles/cubemapenv.dir/src/cubemapenv/cubemapenv.cpp.o Scanning dependencies of target phonglighting [ 45%] Built target dof [ 46%] Building CXX object CMakeFiles/phonglighting.dir/src/phonglighting/phonglighting.cpp.o Scanning dependencies of target cubicbezier [ 46%] Linking CXX executable ../bin/blinnphong [ 46%] Built target noperspective [ 47%] Building CXX object CMakeFiles/cubicbezier.dir/src/cubicbezier/cubicbezier.cpp.o Scanning dependencies of target basicfbo [ 48%] Linking CXX executable ../bin/pmbstreaming [ 48%] Building CXX object CMakeFiles/basicfbo.dir/src/basicfbo/basicfbo.cpp.o [ 49%] Linking CXX executable ../bin/dflandscape [ 50%] Linking CXX executable ../bin/deferredshading [ 50%] Linking CXX executable ../bin/cubemapenv [ 50%] Built target blinnphong [ 51%] Linking CXX executable ../bin/phonglighting Scanning dependencies of target alienrain [ 51%] Built target pmbstreaming [ 51%] Building CXX object CMakeFiles/alienrain.dir/src/alienrain/alienrain.cpp.o [ 51%] Built target dflandscape Scanning dependencies of target msaanative Scanning dependencies of target blendmatrix [ 52%] Linking CXX executable ../bin/basicfbo [ 52%] Linking CXX executable ../bin/cubicbezier [ 52%] Built target deferredshading [ 53%] Building CXX object CMakeFiles/blendmatrix.dir/src/blendmatrix/blendmatrix.cpp.o [ 53%] Building CXX object CMakeFiles/msaanative.dir/src/msaanative/msaanative.cpp.o Scanning dependencies of target bumpmapping [ 54%] Building CXX object CMakeFiles/bumpmapping.dir/src/bumpmapping/bumpmapping.cpp.o [ 54%] Built target cubemapenv Scanning dependencies of target tessellatedtri [ 54%] Built target phonglighting [ 54%] Building CXX object CMakeFiles/tessellatedtri.dir/src/tessellatedtri/tessellatedtri.cpp.o Scanning dependencies of target indirectmaterial [ 54%] Built target cubicbezier [ 54%] Building CXX object CMakeFiles/indirectmaterial.dir/src/indirectmaterial/indirectmaterial.cpp.o [ 55%] Linking CXX executable ../bin/alienrain Scanning dependencies of target bindlesstex [ 55%] Built target basicfbo Scanning dependencies of target polygonsmooth [ 55%] Building CXX object CMakeFiles/bindlesstex.dir/src/bindlesstex/bindlesstex.cpp.o [ 56%] Building CXX object CMakeFiles/polygonsmooth.dir/src/polygonsmooth/polygonsmooth.cpp.o [ 56%] Linking CXX executable ../bin/blendmatrix [ 57%] Linking CXX executable ../bin/msaanative [ 57%] Linking CXX executable ../bin/bumpmapping [ 58%] Linking CXX executable ../bin/tessellatedtri [ 58%] Built target alienrain Scanning dependencies of target compressrgtc [ 58%] Building CXX object CMakeFiles/compressrgtc.dir/src/compressrgtc/compressrgtc.cpp.o [ 58%] Built target blendmatrix [ 58%] Built target msaanative [ 59%] Linking CXX executable ../bin/indirectmaterial [ 59%] Linking CXX executable ../bin/polygonsmooth [ 60%] Linking CXX executable ../bin/bindlesstex Scanning dependencies of target starfield Scanning dependencies of target depthclamp [ 60%] Built target bumpmapping [ 60%] Building CXX object CMakeFiles/starfield.dir/src/starfield/starfield.cpp.o [ 60%] Building CXX object CMakeFiles/depthclamp.dir/src/depthclamp/depthclamp.cpp.o Scanning dependencies of target csflocking [ 60%] Built target tessellatedtri [ 60%] Building CXX object CMakeFiles/csflocking.dir/src/csflocking/csflocking.cpp.o Scanning dependencies of target cullindirect [ 61%] Building CXX object CMakeFiles/cullindirect.dir/src/cullindirect/cullindirect.cpp.o [ 61%] Built target indirectmaterial [ 61%] Built target bindlesstex [ 61%] Built target polygonsmooth Scanning dependencies of target multiscissor Scanning dependencies of target tessellatedgstri Scanning dependencies of target hqfilter [ 62%] Building CXX object CMakeFiles/multiscissor.dir/src/multiscissor/multiscissor.cpp.o [ 63%] Building CXX object CMakeFiles/tessellatedgstri.dir/src/tessellatedgstri/tessellatedgstri.cpp.o [ 64%] Linking CXX executable ../bin/compressrgtc [ 65%] Building CXX object CMakeFiles/hqfilter.dir/src/hqfilter/hqfilter.cpp.o [ 66%] Linking CXX executable ../bin/depthclamp [ 67%] Linking CXX executable ../bin/starfield [ 67%] Linking CXX executable ../bin/cullindirect [ 68%] Linking CXX executable ../bin/tessellatedgstri [ 68%] Built target compressrgtc Scanning dependencies of target indexedcube [ 68%] Linking CXX executable ../bin/multiscissor [ 68%] Building CXX object CMakeFiles/indexedcube.dir/src/indexedcube/indexedcube.cpp.o [ 68%] Built target depthclamp [ 69%] Linking CXX executable ../bin/hqfilter Scanning dependencies of target simpleclear [ 69%] Built target starfield [ 70%] Building CXX object CMakeFiles/simpleclear.dir/src/simpleclear/simpleclear.cpp.o Scanning dependencies of target instancedattribs [ 71%] Linking CXX executable ../bin/csflocking [ 71%] Building CXX object CMakeFiles/instancedattribs.dir/src/instancedattribs/instancedattribs.cpp.o [ 71%] Built target tessellatedgstri [ 71%] Built target cullindirect [ 71%] Built target multiscissor [ 71%] Built target hqfilter Scanning dependencies of target julia Scanning dependencies of target equirectangular Scanning dependencies of target linesmooth Scanning dependencies of target rimlight [ 72%] Building CXX object CMakeFiles/julia.dir/src/julia/julia.cpp.o [ 73%] Building CXX object CMakeFiles/equirectangular.dir/src/equirectangular/equirectangular.cpp.o [ 74%] Building CXX object CMakeFiles/linesmooth.dir/src/linesmooth/linesmooth.cpp.o [ 75%] Linking CXX executable ../bin/indexedcube [ 75%] Linking CXX executable ../bin/simpleclear [ 75%] Building CXX object CMakeFiles/rimlight.dir/src/rimlight/rimlight.cpp.o [ 75%] Built target csflocking Scanning dependencies of target mirrorclampedge [ 76%] Linking CXX executable ../bin/instancedattribs [ 76%] Building CXX object CMakeFiles/mirrorclampedge.dir/src/mirrorclampedge/mirrorclampedge.cpp.o [ 76%] Linking CXX executable ../bin/julia [ 76%] Built target simpleclear [ 76%] Built target indexedcube Scanning dependencies of target movingtri [ 77%] Linking CXX executable ../bin/equirectangular Scanning dependencies of target multiviewport [ 78%] Linking CXX executable ../bin/linesmooth [ 78%] Building CXX object CMakeFiles/movingtri.dir/src/movingtri/movingtri.cpp.o [ 79%] Building CXX object CMakeFiles/multiviewport.dir/src/multiviewport/multiviewport.cpp.o [ 80%] Linking CXX executable ../bin/rimlight [ 80%] Built target instancedattribs Scanning dependencies of target hdrbloom [ 80%] Built target julia [ 81%] Linking CXX executable ../bin/mirrorclampedge [ 82%] Linking CXX executable ../bin/movingtri Scanning dependencies of target ktxview [ 82%] Built target equirectangular [ 82%] Building CXX object CMakeFiles/hdrbloom.dir/src/hdrbloom/hdrbloom.cpp.o Scanning dependencies of target normalviewer [ 83%] Building CXX object CMakeFiles/ktxview.dir/src/ktxview/ktxview.cpp.o [ 83%] Building CXX object CMakeFiles/normalviewer.dir/src/normalviewer/normalviewer.cpp.o [ 83%] Built target linesmooth [ 83%] Built target rimlight Scanning dependencies of target multidrawindirect [ 84%] Linking CXX executable ../bin/multiviewport Scanning dependencies of target objectexploder [ 85%] Building CXX object CMakeFiles/multidrawindirect.dir/src/multidrawindirect/multidrawindirect.cpp.o [ 85%] Building CXX object CMakeFiles/objectexploder.dir/src/objectexploder/objectexploder.cpp.o [ 85%] Built target mirrorclampedge [ 85%] Built target movingtri Scanning dependencies of target ompparticles Scanning dependencies of target hdrexposure [ 86%] Building CXX object CMakeFiles/hdrexposure.dir/src/hdrexposure/hdrexposure.cpp.o [ 87%] Building CXX object CMakeFiles/ompparticles.dir/src/ompparticles/ompparticles.cpp.o [ 87%] Built target multiviewport [ 88%] Linking CXX executable ../bin/normalviewer Scanning dependencies of target dispmap [ 89%] Building CXX object CMakeFiles/dispmap.dir/src/dispmap/dispmap.cpp.o [ 89%] Linking CXX executable ../bin/multidrawindirect [ 89%] Linking CXX executable ../bin/ktxview [ 90%] Linking CXX executable ../bin/hdrbloom [ 91%] Linking CXX executable ../bin/objectexploder [ 91%] Built target normalviewer [ 91%] Linking CXX executable ../bin/ompparticles Scanning dependencies of target packetbuffer [ 92%] Building CXX object CMakeFiles/packetbuffer.dir/src/packetbuffer/packetbuffer.cpp.o [ 92%] Built target multidrawindirect [ 92%] Built target ktxview Scanning dependencies of target perpixelgloss Scanning dependencies of target hdrtonemap [ 92%] Linking CXX executable ../bin/hdrexposure [ 92%] Built target objectexploder [ 92%] Built target hdrbloom [ 93%] Building CXX object CMakeFiles/perpixelgloss.dir/src/perpixelgloss/perpixelgloss.cpp.o [ 93%] Linking CXX executable ../bin/dispmap [ 94%] Building CXX object CMakeFiles/hdrtonemap.dir/src/hdrtonemap/hdrtonemap.cpp.o Scanning dependencies of target pmbfractal Scanning dependencies of target prefixsum [ 94%] Building CXX object CMakeFiles/pmbfractal.dir/src/pmbfractal/pmbfractal.cpp.o [ 95%] Building CXX object CMakeFiles/prefixsum.dir/src/prefixsum/prefixsum.cpp.o [ 95%] Built target ompparticles Scanning dependencies of target ssao [ 95%] Built target hdrexposure [ 95%] Building CXX object CMakeFiles/ssao.dir/src/ssao/ssao.cpp.o Scanning dependencies of target raytracer /home/madbunny/桌面/sb7code-master/src/packetbuffer/packetbuffer.cpp: In member function ‘void packet_stream::DrawElements(GLenum, GLsizei, GLenum, GLuint, GLsizei, GLint, GLuint)’: /home/madbunny/桌面/sb7code-master/src/packetbuffer/packetbuffer.cpp:305:33: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] 305 | pPacket->indices = (GLvoid*)mode; | ^~~~ [ 95%] Built target dispmap [ 95%] Building CXX object CMakeFiles/raytracer.dir/src/raytracer/raytracer.cpp.o Scanning dependencies of target programinfo [ 96%] Building CXX object CMakeFiles/programinfo.dir/src/programinfo/programinfo.cpp.o [ 96%] Linking CXX executable ../bin/perpixelgloss [ 96%] Linking CXX executable ../bin/prefixsum [ 96%] Linking CXX executable ../bin/packetbuffer [ 97%] Linking CXX executable ../bin/pmbfractal [ 97%] Linking CXX executable ../bin/hdrtonemap [ 97%] Built target perpixelgloss [ 98%] Linking CXX executable ../bin/ssao [ 99%] Linking CXX executable ../bin/programinfo [100%] Linking CXX executable ../bin/raytracer [100%] Built target prefixsum [100%] Built target packetbuffer [100%] Built target hdrtonemap [100%] Built target pmbfractal [100%] Built target programinfo [100%] Built target ssao [100%] Built target raytracer madbunny@madbunny-virtual-machine:~/桌面/sb7code-master/build$

果然编过了!

试试效果:

madbunny@madbunny-virtual-machine:~/桌面/sb7code-master/build$ cd ../bin/ madbunny@madbunny-virtual-machine:~/桌面/sb7code-master/bin$ ./tunnel Failed to open window madbunny@madbunny-virtual-machine:~/桌面/sb7code-master/bin$

翻车了,,,居然创建不出来窗口!来看看这个log是谁打的:

madbunny@madbunny-virtual-machine:~/桌面/sb7code-master$ grep -Hrni Failed to open window include/sb7.h:118: fprintf(stderr, “Failed to open window\n”);

找到代码看了以后看不出来什么问题。先把参数打出来看看吧:

fprintf(stderr, “w: %d, h: %d, fullscreen: %d, \n, info.windowWidth, info.windowHeight, info.flags.fullscreen); window = glfwCreateWindow(info.windowWidth, info.windowHeight, info.title, info.flags.fullscreen ? glfwGetPrimaryMonitor() : NULL, NULL); if (!window) { fprintf(stderr, “Failed to open window\n); return; }

好像没啥问题,,,

madbunny@madbunny-virtual-machine:~/桌面/sb7code-master/build$ make -j8 madbunny@madbunny-virtual-machine:~/桌面/sb7code-master/build$ cd – /home/madbunny/桌面/sb7code-master/bin madbunny@madbunny-virtual-machine:~/桌面/sb7code-master/bin$ ./tunnel w: 800, h: 600, fullscreen: 0, Failed to open window

这下难搞了。只能一点一点看代码了。

从代码来看,打出错误日志的原因是glfwCreateWindow返回了空指针。假设问题不是出在我的软件环境上,那么肯定是传给glfwCreateWindow的参数有问题。但是从刚刚打印出来的数据看,传给glfwCreateWindow的参数没啥问题。所以只能从glfw初始化开始,挨个检查每行代码,看看是什么问题。如果检查不出来问题,那么可能需要找点glfw的资料,写一个简单的glfw程序,看看能不能跑起来。如果跑不起来,那可能就是软件环境有问题;如果能跑,那就得一点点把程序改成sb7.h里的样子,然后看看是哪一步造成了问题。下面是sb7.h里的代码:

if (!glfwInit()) { fprintf(stderr, “Failed to initialize GLFW\n); return; } init(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, info.majorVersion); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, info.minorVersion); #ifndef _DEBUG if (info.flags.debug) #endif /* _DEBUG */ { glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE); } if (info.flags.robust) { glfwWindowHint(GLFW_CONTEXT_ROBUSTNESS, GLFW_LOSE_CONTEXT_ON_RESET); } glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); glfwWindowHint(GLFW_SAMPLES, info.samples); glfwWindowHint(GLFW_STEREO, info.flags.stereo ? GL_TRUE : GL_FALSE);

再往下就是调用glfwCreateWindow了。

首先glfwInit初始化应该没问题,因为错误日志没打出来。

init先不看,先不要纠结细节(其实在这里搞个init很奇怪,glfwinit难道不是init的一部分?)。然后就是glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, info.majorVersion),这似乎是在设置什么版本。但是我不知道这个函数是什么意思,所以先去网上查一查:

Window hints need to be set before the creation of the window and context you wish to have the specified attributes. They function as additional arguments to glfwCreateWindow.

果然这个函数是有问题的!glfwWindowHint设置的值,也是glfwCreateWindow的参数。那么一行一行看吧,毕竟有好几个glfwWindowHint。

GLFW_CONTEXT_VERSION_MAJOR在文档中的描述是这样的:

GLFW_CONTEXT_VERSION_MAJOR and GLFW_CONTEXT_VERSION_MINOR specify the client API version that the created context must be compatible with. The exact behavior of these hints depend on the requested client API.

也就是说GLFW_CONTEXT_VERSION_MAJOR指的是client api的主版本号。但是client api又是什么意思呢?这条描述的附近,我找到了这个:

GLFW_CLIENT_API specifies which client API to create the context for. Possible values are GLFW_OPENGL_API, GLFW_OPENGL_ES_API and GLFW_NO_API. This is a hard constraint.

这里说的是GLFW_CLIENT_API可以用来指定使用哪个client api去创建context。可选的值有GLFW_OPENGL_API、GLFW_OPENGL_ES_API、GLFW_NO_API。这就明朗了,在Linux PC机上,client api应该是指OpenGL,而不是OpenGL ES。而client api的主版本号,当然就是指OpenGL的主版本号了。但是这里没有直接给出主版本号,而是使用了info.majorVersion。通过搜索(先在当前文件搜索,如果没有,在源码目录grep搜索),我找到了它的值:

virtual void init() { strcpy(info.title, “OpenGL SuperBible Example”); info.windowWidth = 800; info.windowHeight = 600; #ifdef __APPLE__ info.majorVersion = 3; info.minorVersion = 2; #else info.majorVersion = 4; info.minorVersion = 3; #endif info.samples = 0; info.flags.all = 0; info.flags.cursor = 1; #ifdef _DEBUG info.flags.debug = 1; #endif }

OpenGL版本4.3。这版本号一看就有点大。我都不知道OpenGL还有4.x版本。赶紧确认下Ubuntu的OpenGL版本:

madbunny@madbunny-virtual-machine:~/桌面/sb7code-master$ glxinfo | grep OpenGL OpenGL vendor string: VMware, Inc. OpenGL renderer string: SVGA3D; build: RELEASE; LLVM; OpenGL core profile version string: 3.3 (Core Profile) Mesa 21.2.6 OpenGL core profile shading language version string: 3.30 OpenGL core profile context flags: (none) OpenGL core profile profile mask: core profile OpenGL core profile extensions: OpenGL version string: 3.3 (Compatibility Profile) Mesa 21.2.6 OpenGL shading language version string: 3.30 OpenGL context flags: (none) OpenGL profile mask: compatibility profile OpenGL extensions: OpenGL ES profile version string: OpenGL ES 2.0 Mesa 21.2.6 OpenGL ES profile shading language version string: OpenGL ES GLSL ES 1.0.16 OpenGL ES profile extensions: madbunny@madbunny-virtual-machine:~/桌面/sb7code-master$

我的Ubuntu的OpenGL版本是3.3。这基本就凉了。

但是还是先试试,于是我吧代码中的版本号强行改成3.3,然后重新编译,再试一试:

madbunny@madbunny-virtual-machine:~/桌面/sb7code-master/bin$ cd – /home/madbunny/桌面/sb7code-master/build madbunny@madbunny-virtual-machine:~/桌面/sb7code-master/build$ make -j8 madbunny@madbunny-virtual-machine:~/桌面/sb7code-master/build$ cd – /home/madbunny/桌面/sb7code-master/bin madbunny@madbunny-virtual-machine:~/桌面/sb7code-master/bin$ ./tunnel w: 800, h: 600, fullscreen: 0, madbunny@madbunny-virtual-machine:~/桌面/sb7code-master/bin$

这回倒是不报错了,但是窗口里没有任何内容:

窗口黑黢黢

虽然我不知道这个sample是干啥的,但是肯定不能是这样。所以说,适配工作到这里基本就可以宣告失败了。我用的Ubuntu是运行在VMware Player上的虚拟机,如果我有一台新买的PC可能就没问题了。

但是我还是不死心,去网上搜索了一下关于VMware虚拟机中OpenGL版本的问题,我找到了VMware社区里的一个帖子:

这大概是说VMware 16能支持到4.1。我的VMware player是15,我觉得值得一试!因为虽然还是达不到代码的要求,但是至少主版本号一样了,情况应该能大有改善!

于是我先去VMware官网下载了VMware workstation player 16,然后升级。但是升级之后发现glx的输出没有任何改变。官方论坛肯定是不会撒谎的。所以我怀疑跟VMware tools有关。

SVGA这个名字看上去跟显卡有关

为了验证我的猜想,我准备用player 16装一个新的虚拟机,然后看一下不装VMware tools的情况下OpenGL的版本。

OpenGL 4.1

这么看来还是跟虚拟机创建的设备有关了。但是我把新建虚拟机的vmx文件里我觉得像的选项都merge到原来的虚拟机里也不行。于是我决定上网搜一搜。

这篇关于升级OpenGL版本的帖子里,有人建议到:可以创建一个新的虚拟机,但是在选择磁盘时,使用原来的磁盘,即可升级虚拟机的版本。实际上商业版本的workstation是可以升级虚拟机的,player这种免费的版本不可以。于是我决定再试一试!

然并卵

VMware player 16在创建虚拟机的时候并不提供选择vmdk的选项。然后我尝试直接将原来虚拟机的vmdk文件的文件名修改成与新建虚拟机同名,然后用改了名的原来虚拟机的vmdk文件替换新建虚拟机的vmdk,结果如上图:找不到操作系统。

收费版提供的功能怎么可能让你通过改配置的方式简单实现呢!所以,我只能老老实实用VMware player 16创建一个新虚拟机了。

由于这次环境是全新的,所以我还安装了pkgconf cmake build-essential libglfw3-dev mesa-utils vim这几个包。apt-get速度慢,换源什么的属于基本操作了,这就不说了。总之,编译OK:

这次下载了新的Ubuntu22.04新版本

先试试直接启动行不行:

果然还是不行

既然不行,就还是先改成4.1,重新编译看看效果:

然并卵

依然不行,,,算了。

剩下的工作就是逐个例子修改shader代码中关于OpenGL版本的声明。只要例子中的shader代码是OpenGL4.1支持的,那么只要把代码中的OpenGL版本声明改成“#version 410 core”就可以正常执行了。我目前看到chapter4,这之前的例子都可以这样修改。

如果有现成的Linux电脑,这个学习环境搭起来应该很简单。如果是被环境耽误,很着急,我觉得最好还是去京东买一台兼容Ubuntu,甚至原生就是Linux系统的笔记本电脑(我记得华为有一些型号就是自带深度Linux系统的)或者mini电脑。笔记本电脑便宜的就两三千块,mini电脑甚至有一千出头的,不要像我这样耽误好几天。京东隔天就到了,省事。我是因为疫情隔离在家,快递也不通才这样。至于我为什么非要在虚拟机里面搭建环境,其实原因很简单:1.我不想破坏自己电脑的运行环境,电脑里有很多我已经忘了原来是怎么配置的工具。2.我更熟悉在Linux上编程,在Windows上很多工具都要重新找。

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片