tag 标签: openGL

相关博文
  • 热度 31
    2016-6-1 17:25
    1660 次阅读|
    0 个评论
    Step 9 : Build Qt Programs   编写 Qt 程序,首先要具备 C++ 基础知识;   A. 打开主机上的 Qt Creator : B. 创建一个新项目: File - New File or Project - Application - Qt Widgets Application 将名字设置为 serial_ test , 目录设置为 /home/maria/qt/qt_workspace/serial_test ; 然后在 manag e 里面,添加新的 Kit : 为 Qt Versions 添加: /home/maria/qt/qt-am335x/qt-everywhere/build/bin/qmake 为 Compilers 添加: /opt/i686-arago-linux/usr/bin/arm-linux-gnueabihf-gcc 为 Debuggers 添加: /opt/i686-arago-linux/usr/bin/arm-linux-gnueabihf-gdb 为 Kits 添加新的 am335x-kit ,并将其 sysroot 、 Compiler 、 Debugger 等选成实际的交叉编译类型。 选择 Kits 为刚刚创建的 am335x-kit ,然后一路点击 next 。   C. 将以前的项目 m ainwindow.ui 替代新项目的 mainwindow.ui : D. 将以前的项目 m ainwindow.h 替代新项目的 mainwindow.h : E . 将以前的项目 m ainwindow.cpp 替代新项目的 mainwindow.cpp : (其实我也不想这样的偷懒,但是以前在主机上编写了一个简单的串口应用,正好可以拿来搞这个 ^_^ ) F. 编译项目: Build - Build All G. 将可执行文件拷贝到目标板运行: 生成的可执行文件,存放在 serial_test/build-serial_test-am335x-Debug 目录下 ,将它拷贝到目标板上: ~ # tftp 192.168.1.118 -g -l serial_test ~ # chmod +x serial_test ~ # ./serial_test 然后可以看见 serial_test 的程序界面出现在液晶上 , 编写基础的 Qt 应用真的是很简单,因为它的开发环境和跨平台特性都非常的完善 ^_^ 。 到这里, SGX+OpenGL+Qt5 移植在 AM335x+Linux 上的基本步骤就算是完成了,虽然还有触摸屏 tslib 和字体的问题待解决,但还是不放在本文中啦, maybe 以后调试的时候再补充进来。   Step 10 : About Linux   后记:为什么要选择 Linux 做硬件开发?   如果 Linux 真的像很多人所认为的装 x 专 用,毫无用户体验可言,它不会受到那么多人的喜爱。它所能提供的通透、自由和参与的感觉,是做技术的人不可抗拒的诱惑。它的结构极其健壮简洁,并没有很多 内容来帮助用户,因此你需要花时间(对我来说是很长的时间)去学习它,但是随着学习的深入,你会发现一个自由的世界打开,你能用极其合理的开销实现非常强 大的功能。   对于计算机来说,你不是用户,而是上帝。   使用 Linux 环境做硬件开发,也是同样的感受,随着开发的进行,你会发现你不仅知道怎么做可以实现硬件的功能,你还能知道为什么要这样做。 Linux 对它的使用者完全真诚,它只忠实于事物本身的逻辑,而不会为自身的利益为使用者做任何决定,所有的决定都是为了一个最优的最合理的最强壮的未来,它每一个透明的自由的部件,最终提供给了使用者 unlimited possibility 。   Free 不是免费, free 是自由,你,值得拥有。
  • 热度 25
    2016-6-1 17:25
    1719 次阅读|
    0 个评论
    接下来编译示例程序( qmake 为上步编译时生成,在 /home/maria/qt/qt-am335x/qt-everywhere/build 目录下): $ cd qtbase/examples/ $ ../../build/bin/qmake examples.pro $ gmake -j8 $ gmake -j8 install   编译完成之后,会发现目标文件系统里面增加了 build/examples 目录: $ find . -mmin 1 ./home/maria/qt/qt-am335x/qt-everywhere/build/examples/*   将 ./home/maria 目录拷贝到 SD 的目标文件系统里; 将 ./usr/lib 和 ./usr/include 也拷贝到 SD 卡的目标文件系统里; 运行 Graphics SDK 的 335x-demo ; 此外,还需要执行下面的步骤( Qt 程序会试图获取 /etc/machine-id 的值,如果运行示例程序时报错,可以主机上的 machine-id 文件拷贝过来,另外还要设置屏幕的分辨率值): ~ # tftp 192.168.1.118 -g -l machine-id ~# cp machine-id /etc/ ~ # export QT_QPA_EGLFS_PHYSICAL_HEIGHT=272 ~ # export QT_QPA_EGLFS_PHYSICAL_WIDTH=480   然后执行 Qt 的示例程序(如果报找不到 platform 的错误信息,则执行第二条): ~ # /home/maria/qt/qt-am335x/qt-everywhere/build/examples/widgets/widgets/digitalclock/digitalclock ~ # /home/maria/qt/qt-am335x/qt-everywhere/build /examples/widgets/widgets/digitalclock/digitalclock -platform eglfs   到这里,就可以看到液晶上显示的数字时钟啦~ 运行 Qt 程序的时候,可能会发现终端会打印出很多错误,但是不要害怕这些错误,它们提示的信息往往非常关键,比如需要设置哪些环境变量,或者缺乏哪些库文件或者头文件。另外, arm-linux-gnueabihf-ldd 和 readelf 是非常有用的工具,通过它们来观察 .so 或者可执行程序,往往能够发现很多问题的答案。
  • 热度 27
    2016-6-1 17:23
    1108 次阅读|
    0 个评论
    NOTE :修改 qmake.conf 文件,要特别注意它的 inluce 目录、交叉编译器的设置,以及 INCDIR 和 LIBDIR 是否正确; NOTE :对比 Qt 的 mainline 里面的 qmake.conf ,观察它新增的内容; NOTE : $$QT_INSTALL_DIR/src/3rdparty/powervr/wsegl2 这个目录并不存在,但并不影响编译结果;   另外还要将交叉编译器的 bin 目录加入环境变量 PATH ,拷贝头文件和 lib (为了省事可以把 lib 的内容全都拷贝进目标文件系统,但是这里还是暂时采取需要什么就拷贝什么的方法,你甚至先什么都不做,等到编译报错的时候再去寻找对应的 lib 或者头文件,这样能够更加清晰的理解 Qt 的编译过程) ,再执行 configure 和 make 步骤:   $ export PATH=$PATH:/opt/i686-arago-linux/usr/bin $ mkdir /home/maria/qt/qt-am335x/roofts.withSDK/usr/lib $ cp /opt/ti-sdk-am335x-evm-07.00.00.00/linux-devkit/sysroots/cortexa8hf-vfp-neon-3.8-oe-linux-gnueabi/usr/include /home/maria/qt/qt-am335x/roofts.withSDK/usr/ -r   $ cp /opt/ti-sdk-am335x-evm-07.00.00.00/linux-devkit/sysroots/cortexa8hf-vfp-neon-3.8-oe-linux-gnueabi/usr/lib/crt* /home/maria/qt/qt-am335x/roofts.withSDK/usr/lib/ $ cp /opt/ti-sdk-am335x-evm-07.00.00.00/linux-devkit/sysroots/cortexa8hf-vfp-neon-3.8-oe-linux-gnueabi/usr/lib/libts* /home/maria/qt/qt-am335x/roofts.withSDK/usr/lib/ $ cp /opt/ti-sdk-am335x-evm-07.00.00.00/linux-devkit/sysroots/cortexa8hf-vfp-neon-3.8-oe-linux-gnueabi/usr/lib/librt. * /home/maria/qt/qt-am335x/roofts.withSDK/usr/lib/ $ cp /opt/ti-sdk-am335x-evm-07.00.00.00/linux-devkit/sysroots/cortexa8hf-vfp-neon-3.8-oe-linux-gnueabi/usr/lib/libpthread* /home/maria/qt/qt-am335x/roofts.withSDK/usr/lib/ $ cp /opt/ti-sdk-am335x-evm-07.00.00.00/linux-devkit/sysroots/cortexa8hf-vfp-neon-3.8-oe-linux-gnueabi/usr/lib/libm.* /home/maria/qt/qt-am335x/roofts.withSDK/usr/lib/ $ cp /opt/ti-sdk-am335x-evm-07.00.00.00/linux-devkit/sysroots/cortexa8hf-vfp-neon-3.8-oe-linux-gnueabi/usr/lib/libc.* /home/maria/qt/qt-am335x/roofts.withSDK/usr/lib/ $ cp /opt/ti-sdk-am335x-evm-07.00.00.00/linux-devkit/sysroots/cortexa8hf-vfp-neon-3.8-oe-linux-gnueabi/usr/lib/libc_nonshared.a* /home/maria/qt/qt-am335x/roofts.withSDK/usr/lib/ $ cp /opt/ti-sdk-am335x-evm-07.00.00.00/linux-devkit/sysroots/cortexa8hf-vfp-neon-3.8-oe-linux-gnueabi/usr/lib/libz.so* /home/maria/qt/qt-am335x/roofts.withSDK/usr/lib/ $ cp /opt/ti-sdk-am335x-evm-07.00.00.00/linux-devkit/sysroots/cortexa8hf-vfp-neon-3.8-oe-linux-gnueabi/usr/lib/libjpeg.so* /home/maria/qt/qt-am335x/roofts.withSDK/usr/lib/ $ cp /opt/ti-sdk-am335x-evm-07.00.00.00/linux-devkit/sysroots/cortexa8hf-vfp-neon-3.8-oe-linux-gnueabi/usr/lib/libpng* /home/maria/qt/qt-am335x/roofts.withSDK/usr/lib/ $ cp /opt/ti-sdk-am335x-evm-07.00.00.00/linux-devkit/sysroots/cortexa8hf-vfp-neon-3.8-oe-linux-gnueabi/usr/lib/libnsl.* /home/maria/qt/qt-am335x/roofts.withSDK/usr/lib/ $ cp /opt/ti-sdk-am335x-evm-07.00.00.00/linux-devkit/sysroots/cortexa8hf-vfp-neon-3.8-oe-linux-gnueabi/usr/lib/libgthread-2.0.so* /home/maria/qt/qt-am335x/roofts.withSDK/usr/lib/ $ cp /opt/ti-sdk-am335x-evm-07.00.00.00/linux-devkit/sysroots/cortexa8hf-vfp-neon-3.8-oe-linux-gnueabi/usr/lib/libglib-2.0.so* /home/maria/qt/qt-am335x/roofts.withSDK/usr/lib/ $ cp /opt/ti-sdk-am335x-evm-07.00.00.00/linux-devkit/sysroots/cortexa8hf-vfp-neon-3.8-oe-linux-gnueabi/usr/lib/libasound.so* /home/maria/qt/qt-am335x/roofts.withSDK/usr/lib/ $ cp /opt/ti-sdk-am335x-evm-07.00.00.00/linux-devkit/sysroots/cortexa8hf-vfp-neon-3.8-oe-linux-gnueabi/usr/lib/libdl.* /home/maria/qt/qt-am335x/roofts.withSDK/usr/lib/ $ cp /opt/ti-sdk-am335x-evm-07.00.00.00/linux-devkit/sysroots/cortexa8hf-vfp-neon-3.8-oe-linux-gnueabi/usr/lib/libfreetype.so* /home/maria/qt/qt-am335x/roofts.withSDK/usr/lib/ $ cp /opt/ti-sdk-am335x-evm-07.00.00.00/linux-devkit/sysroots/cortexa8hf-vfp-neon-3.8-oe-linux-gnueabi/usr/lib/glib-2.0 /home/maria/qt/qt-am335x/roofts.withSDK/usr/lib/ -r $ cp /opt/ti-sdk-am335x-evm-07.00.00.00/linux-devkit/sysroots/cortexa8hf-vfp-neon-3.8-oe-linux-gnueabi/usr/lib/libfontconfig.so* /home/maria/qt/qt-am335x/roofts.withSDK/usr/lib/ $ cp /opt/ti-sdk-am335x-evm-07.00.00.00/linux-devkit/sysroots/cortexa8hf-vfp-neon-3.8-oe-linux-gnueabi/usr/lib/libexpat.so* /home/maria/qt/qt-am335x/roofts.withSDK/usr/lib/ $ cp /opt/ti-sdk-am335x-evm-07.00.00.00/linux-devkit/sysroots/cortexa8hf-vfp-neon-3.8-oe-linux-gnueabi/usr/lib/lib dbus * /home/maria/qt/qt-am335x/roofts.withSDK/usr/lib/ $ cp /opt/ti-sdk-am335x-evm-07.00.00.00/linux-devkit/sysroots/cortexa8hf-vfp-neon-3.8-oe-linux-gnueabi/usr/lib/lib u * /home/maria/qt/qt-am335x/roofts.withSDK/usr/lib/ $ cp /opt/ti-sdk-am335x-evm-07.00.00.00/linux-devkit/sysroots/cortexa8hf-vfp-neon-3.8-oe-linux-gnueabi/usr/lib/ libglslcompiler * /home/maria/qt/qt-am335x/roofts.withSDK/usr/lib/   另外,还要将目标文件系统的 include/freetypes2/freetype 软链接成 include/freetype : $ cd /home/maria/qt/qt-am335x/roofts.withSDK/usr/include $ ln -s freetype2/freetype freetype ( 如果 freetypes 报错了就做此修改,没有报错的话就不用管了~ )   $ ./configure –help $ ./configure \ -debug -opensource -confirm-license -shared \ -prefix /home/maria/qt/qt-am335x/qt-everywhere/build \ -sysroot /home/maria/qt/qt-am335x/roofts.withSDK \ -platform linux-g++-64 \ -device linux-TIarmv7-sgx-g++ \ -device-option CROSS_COMPILE=/opt/i686-arago-linux/usr/bin/arm-linux-gnueabihf- \ -D QT_NO_QWS_CURSOR -D QT_QWS_CLIENTBLIT \ -eglfs -opengl es2 -qreal float -v \ -nomake examples -nomake tests   NOTE : configure 的编译选项,需要根据主机和目标板的实际情况慢慢摸索,有的编译选项随着新版本的发布不再支持,有的编译选项被添加在新版本中,有的编译错误即使存在也没有关系,有的编译错误则会影响结果。一般来说,提示“ Just run 'gmake'” 就算是成功。 NO TE : configure 会生成很多 .o 文件,在重新 configure 之前可以编写脚本 , 来删除旧有的 .o 文件。   -prefix: 主机上 Qt SDK 安装的目录; -sysroot: 目标文件系统的根目录; -platform: 主机使用的 mkspecs ; -device: 目标机使用的 mkspecs ,替代 xplatform ; -nomake examples -nomake tests: 不编译示例和测试程序,否则得花很长的时间;   $ gmake -j8 $ gmake -j8 install   这里的 gmake ,是指 GNU Make ,在 Fedora 主机上就是 make ; 编译完成之后,会发现目标文件系统里面增加了 build 目录: $ find . -mmin 1 ./home/maria/qt/qt-am335x/qt-everywhere/build/*  
  • 热度 29
    2016-6-1 17:22
    2137 次阅读|
    0 个评论
    Step 8: Build Qt   http://processors.wiki.ti.com/index.php/Building_Qt http://processors.wiki.ti.com/index.php/Building_Qt_with_OpenGL_ES_accelerated_by_SGX ( NOTE :触摸屏 tslib 的调试暂时不考虑。) 到目前为止的目标文件系统,具备了那些内容呢: 有 etc 目录和其中的启动文件,有存放在 bin 、 sbin 目录下的 busybox 可执行程序, lib 库,其他目录如 home 、 media 、 mnt 、 proc 等,以及存放在 opt 目录下的 Graphics SDK ,包括它的库文件、驱动文件和 demo 文件。只有 demo 文件无错误的运行在目标板上了,才可以往下进行,否则,要继续修改 Kernel 代码或者 Graphics SDK 编译方式。   准备好文件系统,以及解压 Qt 源代码: $ mkdir roofts.withSDK $ cp ../ro otfs/* rootfs.withSDK/ -rv $ tar xvf ../qt-everywhere-opensource-src-5.4.1.tar.gz -C .   从下面这个地址下载 qmake. conf 文件 ,并将它复制进 Qt 源代码目录 ,并根据主机的实际情况修改内容 : http://processors.wiki.ti.com/images/7/76/Linux-TIarmv7-sgx-g%2B%2B.tar.gz   $ tar xvf Linux-TIarmv7-sgx-g++.tar.gz $ ln -s qt-everywhere-opensource-src-5.4.1 qt-everywhere $ cp linux-TIarmv7-sgx-g++ qt-everywhere/qtbase/mkspecs/device/ -r $ vim qt-everywhere/qtbase/mkspecs/device/linux-TIarmv7-sgx-g++/qmake.conf MAKEFILE_GENERATOR = UNIX CONFIG += incremental QMAKE_INCREMENTAL_STYLE = sublib   include(../../common/linux.conf) include(../../common/gcc-base-unix.conf) include(../../common/g++-unix.conf)   load(device_config) QT_QPA_DEFAULT_PLATFORM = eglfs   QT_INSTALL_DIR = /home/maria/qt/qt-am335x/qt-everywhere/qtbase SGX_SDK_ROOT = /home/maria/qt/graphics/Graphics_SDK_5_01_01_02   COMPILER_FLAGS = -march=armv7-a -mtune=cortex-a8 -mfpu=vfpv3 -mfloat-abi=hard QMAKE_CFLAGS_RELEASE = -O3 -march=armv7-a -mtune=cortex-a8 -mfpu=vfpv3 -mfloat-abi=hard QMAKE_CXXFLAGS_RELEASE = -O3 -march=armv7-a -mtune=cortex-a8 -mfpu=vfpv3 -mfloat-abi=hard   QMAKE_CC = arm-linux-gnueabihf-gcc QMAKE_CXX = arm-linux-gnueabihf-g++ QMAKE_LINK = arm-linux-gnueabihf-g++ QMAKE_LINK_SHLIB = arm-linux-gnueabihf-g++ QMAKE_AR = arm-linux-gnueabihf-ar cqs QMAKE_OBJCOPY = arm-linux-gnueabihf-objcopy QMAKE_STRIP = arm-linux-gnueabihf-strip QMAKE_NM = arm-linux-gnueabihf-nm -P   QMAKE_INCDIR_OPENGL_ES2 = $$SGX_SDK_ROOT/GFX_Linux_SDK/OGLES2/SDKPackage/Builds/OGLES2/Include/ QMAKE_INCDIR_OPENGL_ES2 += $$SGX_SDK_ROOT/include QMAKE_INCDIR_OPENGL_ES2 += $$SGX_SDK_ROOT/GFX_Linux_SDK/OGLES/SDKPackage/Builds/OGLES/Include/ QMAKE_LIBDIR_OPENGL_ES2 = $$SGX_SDK_ROOT/gfx_dbg_es8.x/ QMAKE_LIBS_OPENGL_ES2 = -lEGL -lGLESv2 -lGLES_CM -lIMGegl -lsrv_um -lusc   QMAKE_INCDIR_OPENGL += $$SGX_SDK_ROOT/GFX_Linux_SDK/OGLES/SDKPackage/Builds/OGLES/Include/ QMAKE_LIBDIR_OPENGL = $$SGX_SDK_ROOT/gfx_dbg_es8.x QMAKE_LIBDIR_OPENGL_QT = $$SGX_SDK_ROOT/gfx_dbg_es8.x QMAKE_LIBS_OPENGL_ES1 = -lEGL -lGLES_CM -lIMGegl -lsrv_um -lusc   QMAKE_INCDIR_OPENVG = $$SGX_SDK_ROOT/GFX_Linux_SDK/OVG/SDKPackage/Builds/OVG/Include/ QMAKE_LIBDIR_OPENVG = $$SGX_SDK_ROOT/gfx_dbg_es8.x/ QMAKE_LIBS_OPENVG = -lEGL -lGLESv2 -lGLES_CM -lIMGegl -lsrv_um -lOpenVG -lOpenVGU   QMAKE_INCDIR_EGL = $$QMAKE_INCDIR_OPENGL_ES2 QMAKE_INCDIR_EGL += $$QT_INSTALL_DIR/src/3rdparty/powervr/wsegl2 QMAKE_INCDIR_POWERVR = $$QT_INSTALL_DIR/src/3rdparty/powervr/wsegl2 QMAKE_LIBDIR_EGL = $$QMAKE_LIBDIR_OPENGL_ES2 QMAKE_LIBS_EGL = -lEGL -lIMGegl -lsrv_um -lGLESv2 -lGLES_CM -lusc   QMAKE_INCDIR += $$QMAKE_INCDIR_OPENGL_ES2 QMAKE_LIBDIR += $$QMAKE_LIBDIR_OPENGL_ES2 QMAKE_LIBS = $$QMAKE_LIBS_OPENGL_ES2 -lts -lrt -lpthread   deviceSanityCheckCompiler() load(qt_config)
  • 热度 25
    2014-4-11 18:46
    1838 次阅读|
    0 个评论
    At some point in their lives, all engineers wanted a robotic arm. Unfortunately, they're quite costly. Dan Royer from Marginally Clever, however, has released an open-source 3DOF robotic arm that is sure to get many excited.   While the robot in the video is only his first prototype, you can easily see that it is quite capable. Dan built-in one nice approach—an understanding of inverse kinematics. This means that instead of having to program specific transitions and positions for each motor or servo in the chain, you can simply give the robot coordinates where you want the tip to be and it will figure the rest out. This saves so much time and reduces trial and error considerably.   You can download the code as well as the design files for the arm on his page . Keep an eye on his site, because his ultimate goal is to build a low-cost 6DOF version. He isn't stopping development on this version either. Immediate plans include bearings for smoother movement and a nice openGL based interface to allow for you to manipulate the arm visually. Caleb Kraft, Chief Community Editor, EE Times  
相关资源
  • 所需E币: 0
    时间: 2024-6-3 14:35
    大小: 2.51KB
    Qt对OpenGL的支持是内建的,也就是说,只要你的Qt版本支持OpenGL,你就可以在你的Qt应用程序中使用OpenGL,无需额外安装OpenGL。然而,要在你的Qt应用程序中使用OpenGL,你的系统需要有一个支持OpenGL的图形驱动。这通常意味着你需要在你的系统上安装一个支持OpenGL的图形卡驱动。大多数现代的桌面系统(包括Windows、macOS和大多数Linux发行版)都自带了支持OpenGL的图形驱动,所以你通常不需要手动安装。如果你的系统没有支持OpenGL的图形驱动,或者你的图形驱动不支持你需要的OpenGL版本,你可能需要手动安装一个新的图形驱动。这通常涉及到从你的图形卡制造商的网站下载驱动程序,并按照他们的指示进行安装。请注意,虽然Qt支持OpenGL,但并不是所有的Qt功能都需要OpenGL。大多数Qt功能(包括QtWidgets和QtQuick2D)都可以在没有OpenGL的系统上运行。只有一些特定的功能(如QtQuick3D和一些Qt3D功能)需要OpenGL。一、Vulkan和OpenGL区别Vulkan和OpenGL区别,Vulkan与OpenGL相比,可以更详细的向显卡描述你的应用程序打算做什么,从而可以获得更好的性能和更小的驱动开销。Vulkan的设计理念与Direct3D12和Metal基本类似,但Vulkan作为OpenGL的替代者,它设计之初就是为了跨平台实现的,可以同时在Windows、Linux和Android开发。甚至在MacOS系统上,Khronos也提供了Vulkan的SDK,虽然这个SDK底层其实是使用MoltenVK实现的。Vulkan的最大任务不是竞争DirectX,而是取代OpenGL,所以重点要看和后者的对比。在高分辨率、高画质、需要GPU发挥的时候,Vulkan、OpenGL的速度基本差不多,但是随着分辨率的降低,CPU越来越重要,Vulkan逐渐体现了出来,尤其是看看GTX980Ti,最多可以领先OpenGL33%之多!二、OpenGL对象我们可以把OpenGL对象理解成一个状态的集合,它负责管理它下属的所有状态。当然,除了状态,OpenGL对象还会存储其他数据。注意。这些状态和上述context中的状态并不重合,只有在把一个OpenGL对象绑定到context上时,OpenGL对象的各种状态才会映射到context的状态。因此,这时如果我们改变了context的状态,那么也会影响这个对象,而相反地,依赖这些context状态的函数也会使用存储在这个对象上的数据。因此,OpenGL对象的绑定既可能是为了修改该对象的状态(大多数对象需要绑定到context上才可以改变它的状态),也可能是为了让context渲染时使用它的状态。三、OpenGL的工作方式首先,OpenGL一开始最难理解的部分我觉得在于创建整个程序上。虽然我已经有一些图形学基础,但是拿到OpenGL的时候完全是懵逼的,因为完全不知道其程序的运作方式。所以在这里,我觉得最先需要解释的就是OpenGL的整体工作方式:OpenGL是一个状态机,因此,其工作方式来自于上下文环境的切换,或者说是设定当前上下文环境(Context)。因此,不论是创建的shader,还是VAO,VBO,都是需要创建之后绑定进入当前上下文的。四、学习OpenGL常见难点: 难点1:不知道如何将单个例子,结合成一个完整的渲染引擎  难点2:不能把Shader和CPU的流程联立在一起,不知道某个资源/数据,是从哪里来的。就算知道他是什么时候送到GPU的,也不知道GPU如何定位某个资源/数据。  难点3:难以建立起并行计算的思维方式  难点4:难以理解各种模板如何在多个批次之间发生作用。不能具象的去理解混合,测试的过程。不能够理解,FrameBuffer的真正含义。  难点5:难以建立起空间想象,不知道矩阵变换,如何将顶点,或其他数据,变换到不同的空间进行统一计算。  难点6:难以理解从Vertex到Fragment是如何过度的。 五、构建OpenGL程序1、在项目的根目录下创建buildmkdirbuildcdbuild2、执行cmake指令,指定要构建的文件系统和使用的编译器cmake..-GNinja-DCMAKE_C_COMPILER=clang-DCMAKE_CXX_COMPILER=clang++3、执行ninjaninja编译完成之后就可以在build目录下找到可执行程序了,能够正常运行就说明OpenGL的开发环境搭建完成。
  • 所需E币: 0
    时间: 2024-1-2 13:49
    大小: 2.95KB
    上传者: 开心就很好了
    今天给大家讲讲关于OpenGL的知识,以及结合OpenGL自主高性能三维GIS平台架构与实现的全流程。我将从2D->2.5D->3D立体球,全程零代码到完全实现,带着大家一步步学习。首先,我们先来看看什么是OpenGL?OpenGL(英语:OpenGraphicsLibrary,译名:开放图形库或者“开放式图形库”)是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。OpenGLES(OpenGLforEmbeddedSystems)是OpenGL三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而设计,去除了许多不必要和性能较低的API接口。如果用一句话来描述OpenGL的话,我想应该是基于C/S结构设计的模板模式(设计模式里的那个);在图形渲染管线这节,主要介绍的是其模板设计,在OpenGL里我们称之为PipeLine;在C/S结构这节,则介绍OpenGLC/S结构给OpenGL带来的一些对于初学者看起来可能觉得奇奇怪怪的东西。我们知道,automapper的映射是基于语法糖和语法约定的,他会自动映射两个对象中名字相同的字断,而默认情况下,找不到匹配的字断将会被忽略,使用null,使用空来代替。除了使用automapper的自动映射,我们也可以手动添加映射关系。比如,dto中的价格,相当于模型中原价乘以折扣,我们可以把这个计算过程放在automapper中进行,对这样的映射过程有一个专有名词,叫做投影,projection。投影是个数学概念,所谓投影,就是把资源对象中的某一个或几个数据,进过一定的变化和计算,然后传递给目标对象。在autompeer中,我们可以使用ForMember函数做字断的投影。publicTouristRouteProfile(){CreateMap<TouristRoute,TouristRouteDto>().ForMember(dest=>dest.Price,opt=>opt.MapFrom(src=>src.OriginalPrice*(decimal)(src.DiscountPresent??1))).ForMember(dest=>dest.TravelDays,opt=>opt.MapFrom(src=>src.TravelDays.ToString())).ForMember(dest=>dest.TripType,opt=>opt.MapFrom(src=>src.TripType.ToString())).ForMember(dest=>dest.DepartureCity,opt=>opt.MapFrom(src=>src.DepartureCity.ToString()));}这次ValidationContext所访问的不再是属性级别的数据,而是class类级别的数据,然后再通过class来访问属性。所以如果我们想访问TouristRouteForCreationDto的话,代码可以这么写,本地变量vartouristRoute等于validationContext点ObjectInstance,因为这个时候获取的数据类型是普通的对象,所以我们还需要进行类型转换,(),把它转化为“(TouristRouteForCreationDto)”,当然,我们还需要引入dto的命名空间。publicclassTouristRouteTitleMustBeDifferentFromDescriptionAttribute:ValidationAttribute{  protectedoverrideValidationResultIsValid(    objectvalue,     ValidationContextvalidationContext  )  {    vartouristRouteDto=(TouristRouteForCreationDto)validationContext.ObjectInstance;    if(touristRouteDto.Title==touristRouteDto.Description)    {      returnnewValidationResult(        "路线名称必须与路线描述不同",        new[]{"TouristRouteForCreationDto"}      );    }    returnValidationResult.Success;  }}拿到用户数据,我们就可以开始配置jwt数据了,首先,在claims数组中,把假数据替换为真数据。接着,继续使用userManager来获得用户的角色的字符串。//3.添加用户varadminUserId="90184155-dee0-40c9-bb1e-b5ed07afc04e";ApplicationUseradminUser=newApplicationUser{  Id=adminUserId,  UserName="admin@fakexiecheng.com",  NormalizedUserName="admin@fakexiecheng.com".ToUpper(),  Email="admin@fakexiecheng.com",  NormalizedEmail="admin@fakexiecheng.com".ToUpper(),  TwoFactorEnabled=false,  EmailConfirmed=true,  PhoneNumber="123456789",  PhoneNumberConfirmed=false};那这种C/S结构对于我们使用OpenGL有什么影响呢?最大的影响就是在于我们只能在OpenGLcontext所在的线程调用OpenGL的接口,详细阅读EGL标准你会知道所有OpenGL接口都存在一个阴式的入参,就是OpenGLContextpublicstaticasyncTask<PaginationList<T>>CreateAsync(  intcurrentPage,intpageSize,IQueryable<T>result){  //pagination  //skip  varskip=(currentPage-1)*pageSize;  result=result.Skip(skip);  //以pagesize为标准显示一定量的数据  result=result.Take(pageSize);  //includevsjoin  varitems=awaitresult.ToListAsync();  returnnewPaginationList<T>(currentPage,pageSize,items);}最后,在返回数据的时候,删掉分页处理的部分,返回类型使用PaginationList的实例创建工厂。privatereadonlyAppDbContext_context;privatereadonlyIPropertyMappingService_propertyMappingService;publicTouristRouteRepository(  AppDbContextappDbContext,  IPropertyMappingServicepropertyMappingService){  _context=appDbContext;  _propertyMappingService=propertyMappingService;}本文到此结束,感谢大家的观看!!
  • 所需E币: 0
    时间: 2023-5-22 15:47
    大小: 116.08MB
    上传者: Fx
    OpenGL超级宝典中文第五版带目录清晰扫描版
  • 所需E币: 1
    时间: 2022-5-6 17:55
    大小: 23.19MB
    上传者: 西风瘦马
    OpenGL编程指南(原书第7版)中文扫描版.pdf
  • 所需E币: 5
    时间: 2021-9-10 23:19
    大小: 147.24KB
    上传者: czd886
    嵌入式系统中基于OpenGL的虚拟仪表设计
  • 所需E币: 5
    时间: 2020-1-9 15:52
    大小: 812KB
    上传者: 16245458_qq.com
    OpenGL硬體加速供奧援手持式裝置繪圖能力大躍進OpenGL硬體加速供奧援手持式裝置繪圖能力大躍進|||新通訊2009年8月號102期||文.陳之容/李懷哲||[pic]||由於OpenVG可以在兼顧功耗與效能的前提下,為手持式裝置提供可觀的圖形處理能力,甚至可支援||三維(3D)場景運算,因此在手持式裝置中,利用OpenVG來實作豐富多媒體播放器(RichMedia||Player)可以獲得相當顯著的優勢。OpenVG之所以能在功耗/性能上取得更完美的平衡,主要原因之||一在於能利用已經非常成熟的OpenGL硬體來取得硬體加速的效果。本文將就OpenVG的規格做更進一||步介紹,並分享資策會研發團隊利用OpenGL實作OpenVG的經驗,以闡述利用硬體加速的OpenVG在效||能上的優勢。||[pic]||CoreAPI/VGU函式庫攜手完成繪圖作業 ……
  • 所需E币: 3
    时间: 2020-1-3 17:48
    大小: 161.48KB
    上传者: 2iot
    摘要:以VC++为平台,融合OpenGL图形技术,结合斜拉桥结构的特点,采用参数化方法对斜拉桥进行三维建模,实现了斜拉桥三维可视化.该方法具有建模速度快,参数分类清晰,系统操作方便、快捷的特点,为桥梁设计方案比选提供一种新的方法.[著者文摘]……
  • 所需E币: 3
    时间: 2020-1-3 17:48
    大小: 312.69KB
    上传者: 2iot
    摘要:提出了一种基于图形空间,利用OpenGL选择模式实现复杂多面体模型间距离计算及碰撞检测的新方法,可用于计算任意多面体模型上的所有顶点沿法向到目标多面体模型的有符号距离,并判断模型间的碰撞情况.以上下颌牙齿多面体模型为例,计算出了上颌模型顶点到下颌模型的距离,并以上领模型的距离图显示,以此为依据,分析了模型问碰撞情况,验证了新方法的有效性.最后对该方法的运算效率进行了分析.计算得到的距离图在口腔修复体[牙合]面间碰撞区域的识别及标准冠[牙合]面调整等方面得到了较好的应用。[著者文摘]……
  • 所需E币: 3
    时间: 2020-1-3 17:48
    大小: 256.67KB
    上传者: 238112554_qq
    摘要:以在VisualC++环境下利用OpenGL开发的机械手实时控制三维可视化仿真平台为实例,详细介绍了建立机械手三维模型的数学模型和实现的算法,该平台的软件设计使用了模拟人手的人机交互界面,而且在软件功能上实NT其他类似平台所没有的实时抓取物体的功能,具有较好的可扩展性和交互性.[著者文摘]……
  • 所需E币: 4
    时间: 2020-1-3 17:48
    大小: 216.39KB
    上传者: wsu_w_hotmail.com
    摘要:通过VC&OpenGL的编程完成了一个三维系统平台,平台能够快速构建三维场景,用颜色维表示场强,并能够对三维场分布进行点、网格、面、切片等多种形态的良好展示;系统与仪器的接口通过串口进行;同时,系统通过3DS文件导入,解决了虚拟仪器的构建和展示问题,且仪器各部分能够按要求分别进行状态改变和操作。实例展示说明了系统应用的性能。[著者文摘]……
  • 所需E币: 4
    时间: 2020-1-3 17:48
    大小: 254.07KB
    上传者: 978461154_qq
    摘要:为改进当前医疗电子仪器的显示效果,本研究在嵌入式系统中实现三维显示功能。先用Rhino建立心脏模型,再在EmbeddedVisualC环境中应用Opengl|ESAPI等编写应用程序进行三维显示。结果表明:程序可在目标机上流畅运行,所显示的模型比较逼真,可对模型进行任意角度的旋转、设置颜色等操作。嵌入式系统在三维显示技术中的应用具有较大发展空间,在医疗电子仪器领域应用价值较大。[著者文摘]……
  • 所需E币: 5
    时间: 2020-1-3 17:48
    大小: 217.68KB
    上传者: 16245458_qq.com
    摘要:该文通过对井径测井数据的特征分析,选用“推移表示法”得出井筒模型方程,从而解决了从井径测井数据到井筒模型的自动生成的关键问题。该文还对系统核心类CWellData的功能设计进行了介绍。[著者文摘]……
  • 所需E币: 3
    时间: 2020-1-3 17:48
    大小: 154.61KB
    上传者: quw431979_163.com
    摘要:三维地形可视化是地理信息系统(GIS)、数字摄影测量(DP)和遥感系统(RS)的主要部分,而高度真实感三维图形的绘制是计算机图形学(CG)的重要研究内容,利用OpenGL实现三维地形可视化,采用Delaunay三角化法得到地形采样点,并用已知数据对三角曲面进行插值加密,生成规则格网(GRID)数据结构的方法,可得到高度真实感的三维地形可视化效果。[著者文摘]……
  • 所需E币: 4
    时间: 2020-1-3 17:48
    大小: 201.88KB
    上传者: 2iot
    摘要:介绍了NURBS曲线的两种表示形式及其绘制的一种方法,结合VC++、OpenGL实验环境,对NURBS曲线的一些基本性质及权因子对其形状的影响做了直观的研究,方便我们在理论上的深入理解、研究.[著者文摘]……
  • 所需E币: 4
    时间: 2020-1-3 17:48
    大小: 224.23KB
    上传者: 978461154_qq
    摘要:目的:提出一种基于ITK和OpenGL开发的医学图像三维重建系统的新模式。方法:在VC++6.0的MFC环境下编程,设计交互性强、灵活实用的用户界面;集成ITK类库实现医学图像的读写、分割、等值面提取,并利用OpenGL进行三维表面的绘制和渲染。结果:设计并实现了一个医学图像三维重建系统。结论:基于ITK和OpenGL模式开发医学图像三维重建系统,不仅可以解决ITK不具备可视功能、不提供用户界面的缺点,同时可以利用OpenGL强大的三维绘制和渲染功能使三维场景更加逼真。[著者文摘]……
  • 所需E币: 4
    时间: 2020-1-3 17:48
    大小: 195.4KB
    上传者: 16245458_qq.com
    摘要:可视化技术将大量枯燥的数据以图形图像这种直观的方式显示出来,使观察者可以准确的发现隐藏在大量数据背后的规律,从而帮助人们更好的理解和分析这些数据。基于粒子系统原理,在Windows开发平台上,运用编程软件VC++和三维动画标准OpenGL,首次实现了在不同电压下油液雾化情况的模拟,其仿真结果基本反映了静电喷涂中油液雾化的过程,与实际情况基本吻合。[著者文摘]……
  • 所需E币: 3
    时间: 2020-1-3 17:48
    大小: 291.54KB
    上传者: 978461154_qq
    摘要:介绍了OpenGL的基本原理和特点,阐述了OpenGL与VC++应用接口的建立方法及其绘制环境的设置。利用OpenGL提供的光照、材质、反走样、融合等技术,实现三维数据的可视化及其三维图形的真实感显示和物理云图的显示。利用VC++及OpenGL中图形的变换功能,实现图形的交互动态显示效果。[著者文摘]……
  • 所需E币: 3
    时间: 2020-1-3 17:48
    大小: 329.61KB
    上传者: wsu_w_hotmail.com
    摘要:介绍了利用VisualC#.Net开发OpengGL控件的方法.利用.NET的托管功能,将微软提供的opengl32.dll和glu32.dll中提供的API函数导出,并将其封装到几个C#类中,主程序就可以像调用通常的C#类一样来操作OpengGL了.还将OpenGL的导出函数独立封装成一个可视化控件,以便于应用.最后,将该控件成功应用于"智能内镜立体成像系统".……
  • 所需E币: 4
    时间: 2020-1-3 17:48
    大小: 188.18KB
    上传者: quw431979_163.com
    摘要:介绍了OpenGL的一个重要技术一纹理映射,并结合VC++平台,给出了具体实现的步骤及在柳编工艺品真实感模拟中的应用.[著者文摘]……
  • 所需E币: 3
    时间: 2020-1-3 17:51
    大小: 270.16KB
    上传者: 二不过三
    摘要:对红外目标的红外辐射特性进行了分析计算,提出了在Visualc++6.0环境下利用OpenGLAPI对空间目标红外辐射特性进行仿真的方法。针对假定目标给出了该目标在不同观察方向上的辐射强度并据此生成灰度图像,并利用上海技术物理研究所自行研制的128×128像素电阻阵列红外景象转换器进行了仿真实验,取得了实验结果。对红外目标的红外辐射特性仿真进行研究,为红外景象模拟提供基础。[著者文摘]……