Opencascade 可视化--创建视图分析(二)

2024-03-26 23:40

本文主要是介绍Opencascade 可视化--创建视图分析(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、创建视图

创建一个Opencascade视图,过程如下:

代码逻辑如下:

Handle(Aspect_DisplayConnectionaDisplayConnection = new Aspect_DisplayConnection();

if (GetGraphicDriver().IsNull())

{

GetGraphicDriver() = new OpenGl_GraphicDriver(aDisplayConnection);

}

--- 创建图形系统驱动

myViewer = new V3d_Viewer(GetGraphicDriver());

myView = myViewer->CreateView();

--- 创建V3d_View

Handle(WNT_Windowwind = new WNT_Window((Aspect_Handlehwnd);

--- 根据已有窗口句柄,创建原生窗口

myView->SetWindow(wind);

---- 捆绑原生窗口

二、源码分析

2.1 创建图形系统OpenGl_GraphDriver

OpenGl_GraphDriver 通过EGL(EGL是地产原生窗口与Khronos渲染API(例如OpenGL ES,OpenVG等)之间的接口)建立OpenGl与原生窗口系统(例如:微软Windows,MacOS,Linux XServer)的联系、创建绘制上下文。OpenGl_GraphDriver的初始化函数(为了便于理解,去掉了一些不关键代码):

Standard_Boolean OpenGl_GraphicDriver::InitContext()

{

myEglDisplay = (Aspect_Display )eglGetDisplay (EGL_DEFAULT_DISPLAY);

------ 建立本地系统和 OpenGL ES 的连接

   EGLint aVerMajor = 0; EGLint aVerMinor = 0;

   eglInitialize ((EGLDisplay )myEglDisplay, &aVerMajor, &aVerMinor)

---- 初始化

   myEglConfig = chooseEglSurfConfig ((EGLDisplay )myEglDisplay);

---- chooseEglSurfConfig对eglChooseChofig进行了封装,作用是确定Surface(绘制区域)

的配置。

   EGLint* anEglCtxAttribs = NULL;

   eglBindAPI (EGL_OPENGL_API) != EGL_TRUE

      ---- 绑定OpenGl

myEglContext = eglCreateContext (myEglDisplay, myEglConfig, EGL_NO_CONTEXT, anEglCtxAttribs);

--- 创建EGL上下文

  myIsOwnContext = Standard_True;

  return Standard_True;

}

2.2 创建视图V3d_View

创建V3d_View的主要逻辑在V3d_View构造函数中,主要做两件事情:1. 调用驱动创建与OpenGl关联的代理子对象Openl_View;2.初始化相机等。

V3d_View构造函数:

V3d_View::V3d_View (const Handle(V3d_Viewer)& theViewer, const V3d_TypeOfView theType)

{

myView = theViewer->Driver()->CreateView (theViewer->StructureManager());

--- 创建OpenGl_View

Handle(Graphic3d_Camera) aCamera = new Graphic3d_Camera();

   aCamera->SetFOVy (45.0);

   aCamera->SetIOD (Graphic3d_Camera::IODType_Relative, 0.05);

   aCamera->SetZFocus (Graphic3d_Camera::FocusType_Relative, 1.0);

   aCamera->SetProjectionType ((theType == V3d_ORTHOGRAPHIC)

     ? Graphic3d_Camera::Projection_Orthographic

    : Graphic3d_Camera::Projection_Perspective);

SetCamera (aCamera);

--- 初始化相机

}

驱动为V3d_View创建代理对象OpenGl_View:

Handle(Graphic3d_CView) OpenGl_GraphicDriver::CreateView

(const Handle(Graphic3d_StructureManager)& theMgr)

{

Handle(OpenGl_View) aView = new OpenGl_View (theMgr, this, myCaps, &myStateCounter);

  myMapOfView.Add (aView);

     ---- 创建OpenGl_View

}

2.3创建原生窗口WNT_Window

比较简单,不在此罗列。

2.4 捆绑原生窗口

捆绑原生窗口,本质上是为其代理子对象OpenGl_View捆绑原生窗口:

void V3d_View::SetWindow (const Handle(Aspect_Window)&  theWindow,

                          const Aspect_RenderingContext theContext)

{

myView->SetWindow (theWindow, theContext);

---- OpenGl_View 设置窗口

......

}

OpenGl_View 捆绑原生窗口主要做3事情:1. 创建一个渲染窗口捆绑原生窗口;2. 创建工作空间;3.初始化纹理环境。

void OpenGl_View::SetWindow (const Handle(Aspect_Window)& theWindow,

                             const Aspect_RenderingContext theContext)

{

myWindow = myDriver->CreateRenderWindow (theWindow, theContext);

--- 创建渲染窗口OpenGl_Window,绑定原生窗口

myWorkspace = new OpenGl_Workspace (this, myWindow);

--- 创建工作空间,OpenGl_Workspace 实现渲染图元、维护状态的方法。

initTextureEnv (myWorkspace->GetGlContext());

--- 初始化纹理环境

}

2.4.1创建一个渲染窗口捆绑原生窗口

Handle(OpenGl_Window) OpenGl_GraphicDriver::CreateRenderWindow

(const Handle(Aspect_Window)&  theWindow,

const Aspect_RenderingContext theContext)

{

 return new OpenGl_Window (this, theWindow, theContext, myCaps, aShareCtx);

}

OpenGl_Window::OpenGl_Window(...)

{

#if defined(HAVE_EGL)

EGLDisplay anEglDisplay = (EGLDisplay )theDriver->getRawGlDisplay();

   EGLContext anEglContext = (EGLContext )theDriver->getRawGlContext();

EGLConfig  anEglConfig  = (EGLConfig  )theDriver->getRawGlConfig();

anEglSurf = eglCreateWindowSurface

(anEglDisplay,

anEglConfig,

(EGLNativeWindowType )myPlatformWindow->NativeHandle(),--- 原生窗口句柄

NULL);

---- 创建屏幕渲染区:EGL窗口

myGlContext = new OpenGl_Context (theCaps))

myGlContext->Init

(

(Aspect_Drawable )anEglSurf,

(Aspect_Display )anEglDisplay,

(Aspect_RenderingContext )anEglContext, isCoreProfile

);

---- 创建OpenGl_Context(OpenGl上下文),并初始化:调用eglMakeCurrent,把EGL 上下设置为当前上下文;调用::glGetString (GL_VENDOR)检查当前OpenGL版本等信息。

Init();

--- 渲染窗口初始化

#endif

}

上下文初始化

OpenGl_Context::init(isCoreProfile)

{

GLint aMajor = 0, aMinor = 0;

     glGetIntegerv (GL_MAJOR_VERSION, &aMajor);

glGetIntegerv (GL_MINOR_VERSION, &aMinor);

...

--- 检索版本,确认当前版本支持情况。

myVendor = (const char* )::glGetString (GL_VENDOR);

--- 检索开发者

glGetIntegerv (GL_CONTEXT_PROFILE_MASK, &aProfile);

glGetIntegerv (GL_MAX_DRAW_BUFFERS,      &myMaxDrawBuffers);

glGetIntegerv (GL_MAX_COLOR_ATTACHMENTS, &myMaxColorAttachments);

glGetIntegerv (GL_MAX_TEXTURE_SIZE, &myMaxTexDim);

glGetIntegerv (GL_MAX_TEXTURE_UNITS, &myMaxTexUnitsFFP);

glGetIntegerv (GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &myMaxTexCombined);

glGetIntegerv (GL_MAX_VIEWPORT_DIMS, aMaxVPortSize);

glGetIntegerv (GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &myAnisoMax);

glGetIntegerv (GL_MAX_SAMPLES, &myMaxMsaaSamples);

glGetIntegerv (GL_MAX_SAMPLES, &myMaxMsaaSamples);

glGetIntegerv (GL_MAX_COLOR_TEXTURE_SAMPLES, &aNbColorSamples);

glGetIntegerv (GL_MAX_DEPTH_TEXTURE_SAMPLES, &aNbDepthSamples);

glGetIntegerv (GL_STEREO, &aStereo);

glGetIntegerv (GL_MAX_CLIP_PLANES, &myMaxClipPlanes);

--- 确定当前OpenGl支持特性

}

渲染窗口初始化

void OpenGl_Window::Init()

{

Activate();

--- 把上下文设为当前上下文

const Standard_Integer aViewport[4] = { 0, 0, myWidth, myHeight };

myGlContext->ResizeViewport (aViewport);

--- 修改视口大小

glDisable (GL_DITHER);

--- 关闭颜色抖动

glDisable (GL_SCISSOR_TEST);

--- 关闭裁剪测试

glMatrixMode (GL_MODELVIEW);

--- 指定GL_MODELVIEW 为当前矩阵

}

2.4.2 创建工作空间

OpenGl_Workspace::OpenGl_Workspace

(OpenGl_View* theView, const Handle(OpenGl_Window)& theWindow)

{

myGlContext = theWindow->GetGlContext()

myGlContext->core11fwd->glPixelStorei (GL_UNPACK_ALIGNMENT, 1);

--- 设置像素对齐方式

myGlContext->core11ffp->glLightModeli ((GLenum )GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);

--- 设置光照模式

myGlContext->core11fwd->glHint (GL_POINT_SMOOTH_HINT, GL_FASTEST);

--- 指定反走样点的采样质量

    if (myGlContext->caps->ffpEnable)

    {

        myGlContext->core11fwd->glHint (GL_FOG_HINT, GL_FASTEST);

--- 指定雾化计算的精度

}

myGlContext->core11fwd->glHint (GL_LINE_SMOOTH_HINT,    GL_FASTEST);

--- 指定反走样线段的采样质量

myGlContext->core11fwd->glHint (GL_POLYGON_SMOOTH_HINT, GL_FASTEST);

--- 指定反走样多边形的采样质量

}

这篇关于Opencascade 可视化--创建视图分析(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/850249

相关文章

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

python如何创建等差数列

《python如何创建等差数列》:本文主要介绍python如何创建等差数列的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python创建等差数列例题运行代码回车输出结果总结python创建等差数列import numpy as np x=int(in

python中Hash使用场景分析

《python中Hash使用场景分析》Python的hash()函数用于获取对象哈希值,常用于字典和集合,不可变类型可哈希,可变类型不可,常见算法包括除法、乘法、平方取中和随机数哈希,各有优缺点,需根... 目录python中的 Hash除法哈希算法乘法哈希算法平方取中法随机数哈希算法小结在Python中,

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

怎么用idea创建一个SpringBoot项目

《怎么用idea创建一个SpringBoot项目》本文介绍了在IDEA中创建SpringBoot项目的步骤,包括环境准备(JDK1.8+、Maven3.2.5+)、使用SpringInitializr... 目录如何在idea中创建一个SpringBoot项目环境准备1.1打开IDEA,点击New新建一个项

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

关于MyISAM和InnoDB对比分析

《关于MyISAM和InnoDB对比分析》:本文主要介绍关于MyISAM和InnoDB对比分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录开篇:从交通规则看存储引擎选择理解存储引擎的基本概念技术原理对比1. 事务支持:ACID的守护者2. 锁机制:并发控制的艺

MySQL 用户创建与授权最佳实践

《MySQL用户创建与授权最佳实践》在MySQL中,用户管理和权限控制是数据库安全的重要组成部分,下面详细介绍如何在MySQL中创建用户并授予适当的权限,感兴趣的朋友跟随小编一起看看吧... 目录mysql 用户创建与授权详解一、MySQL用户管理基础1. 用户账户组成2. 查看现有用户二、创建用户1. 基

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可