利用OpenGL实现Volume绘制

分享于 

4分钟阅读

多媒体

  繁體

示例应用程序使用3D个纹理,要运行这个应用程序,机器应该支持3D纹理,这意味着OpenGL版本1.2或更高。

使用应用程序

文件打开对话框显示在应用程序的启动时,我们必须选择示例数据,如果按下左侧按钮,我们可以使用鼠标移动旋转图像。

使用代码

附加的源将只包含基于3D纹理的方法。

  • CRawDataProcessor-负责从文件中读取数据并将其转换为纹理。
  • CTranformationMgr-处理转换并将其保存在矩阵中。
  • CRendererHelper进行OpenGL初始化和volume渲染

这是什么原始数据?

原始数据只是连续的2D帧,下面是切片的快照,这些2D帧将来自Z轴的不同位置。

设置OpenGL

如上所述,使用有以下值的正交投影:

  • 左=-1
  • 右边=+1
  • 顶部=+1
  • 底部=-1
  • 近=-1
  • 远=+1

上面的值可能在Resize函数中稍有变化,因为我们保持长宽比。但我们不必担心渲染代码内部的纵横比,

Ortho

bool CRendererHelper::Initialize( HDC hContext_i )
{
 //Setting up the dialog to support the OpenGL. PIXELFORMATDESCRIPTOR stPixelFormatDescriptor;
 memset( &stPixelFormatDescriptor, 0, sizeof( PIXELFORMATDESCRIPTOR ));
 stPixelFormatDescriptor.nSize = sizeof( PIXELFORMATDESCRIPTOR );
 stPixelFormatDescriptor.nVersion = 1;
 stPixelFormatDescriptor.dwFlags = 
 PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW ;
 stPixelFormatDescriptor.iPixelType = PFD_TYPE_RGBA;
 stPixelFormatDescriptor.cColorBits = 24;
 stPixelFormatDescriptor.cDepthBits = 32;
 stPixelFormatDescriptor.cStencilBits = 8;
 stPixelFormatDescriptor.iLayerType = PFD_MAIN_PLANE ;
 int nPixelFormat = ChoosePixelFormat( hContext_i, 
 &stPixelFormatDescriptor ); //Collect the pixel format.if( nPixelFormat == 0 )
 {
 AfxMessageBox( _T( "Error while Choosing Pixel format" ));
 returnfalse;
 }
 //Set the pixel format to the current dialog.if(!SetPixelFormat( hContext_i, nPixelFormat, &stPixelFormatDescriptor ))
 {
 AfxMessageBox( _T( "Error while setting pixel format" ));
 returnfalse;
 }
 //Create a device context. m_hglContext = wglCreateContext( hContext_i );
 if(!m_hglContext )
 {
 AfxMessageBox( _T( "Rendering Context Creation Failed" ));
 returnfalse;
 }
 //Make the created device context as the current device context. BOOL bResult = wglMakeCurrent( hContext_i, m_hglContext );
 if(!bResult )
 {
 AfxMessageBox( _T( "wglMakeCurrent Failed" ));
 returnfalse;
 }
 glClearColor( 0.0f,0.0f, 0.0f, 0.0f );
 glewInit(); // For 3D texture supportif(GL_TRUE!= glewGetExtension("GL_EXT_texture3D"))
 {
 AfxMessageBox( _T( "3D texture is not supported!" ));
 returnfalse;
 }
 returntrue;
} void CRendererHelper::Resize( int nWidth_i, int nHeight_i )
{
 //Find the aspect ratio of the window. GLdouble AspectRatio = ( GLdouble )(nWidth_i)/( GLdouble )(nHeight_i ); 
 //glViewport( 0, 0, cx, cy ); glViewport( 0, 0, nWidth_i, nHeight_i );
 glMatrixMode( GL_PROJECTION );
 glLoadIdentity();
 //Set the orthographic projection.if( nWidth_i <= nHeight_i )
 {
 glOrtho( -dOrthoSize, dOrthoSize, -( dOrthoSize/AspectRatio ), 
 dOrthoSize/AspectRatio, 2.0f*-dOrthoSize, 2.0f*dOrthoSize );
 }
 else {
 glOrtho( -dOrthoSize * AspectRatio, dOrthoSize * AspectRatio, 
 -dOrthoSize, dOrthoSize, 2.0f*-dOrthoSize, 2.0f*dOrthoSize );
 }
 glMatrixMode( GL_MODELVIEW );
 glLoadIdentity();
}

STA  GET  Opengl    体绘制  
相关文章