Q3DSurface:半透明QSurface3DSeries

时间:2019-02-04 20:15:53

标签: c++ qt5

我尝试使用Alpha通道渲染表面,但是当我设置Alpha值时,它使用随机颜色而不是半透明渲染

// Init memory
Q3DSurface *poSurface = new Q3DSurface();
QSurface3DSeries *poSeries = new QSurface3DSeries();
QSurfaceDataArray *poDataArray = new QSurfaceDataArray();

// Generating test surface series
for ( int i = 0, k = 0; i < 10; ++i)
{
  QSurfaceDataRow *poRow = new QSurfaceDataRow();

  for ( int j = 0; j < 10; ++j )
  {
    float x = j;
    float y = i;
    float z = k;
    poRow->append( QSurfaceDataItem( QVector3D( x, y, z ) ) );
  }
  poDataArray->append( poRow );

  if ( i % 2 == 0 )
  {
    ++k;
  }
}

//
poSeries->dataProxy()->resetArray( poDataArray );
poSurface->addSeries( poSeries );

// Setting color with alpha value
poSeries->setBaseColor( QColor( 100, 100, 100, 100 ));

// Show surface widget
QWidget *poWidget = QWidget::createWindowContainer( poSurface );
poWidget->setWindowTitle( "test ");
poWidget->show();

我在做什么错了?

1 个答案:

答案 0 :(得分:0)

我不确定您所说的“随机颜色”是什么意思,但是您猜得出您是在考虑默认照明吗? 3d照明的效果可使颜色看起来与显式设置的颜色有所不同。 关于您的透明度设置,我认为这段代码看起来不错。您将RGBA值设置为R = 100,G = 100,B = 100,A = 100,这将产生灰色。在默认的灯光下,由于您已绘制图形的功能以及灯光从边缘“反弹”的方式,因此看起来可能像是浅色/深色补丁。 尝试稍微更改代码,看看这是否真的发生了:

    poSeries->dataProxy()->resetArray( poDataArray );
    poSurface->addSeries( poSeries );
    //PICK A DARK THEME THAT WILL HELP TO ILLUSTRATE THE EFFECT
    poSurface->activeTheme()->setType(Q3DTheme::ThemeEbony);
    //TURN THE AMBIENT LIGHTING UP TO FULL
    poSurface->activeTheme()->setAmbientLightStrength(1.0f);

   // Setting color with alpha value
   //SET IT TO RED WITH A FULL ALPHA CHANNEL
   poSeries->setBaseColor( QColor( 100, 0, 0, 255 ));



// Show surface widget
QWidget *poWidget = QWidget::createWindowContainer( poSurface );
poWidget->setWindowTitle( "test ");
poWidget->show();

这应该会产生一个带有深色背景的深红色图像(只是为了使情况更清楚)。现在,将Alpha值恢复为您最初想要的颜色,您将看到它对着色有什么影响:

    // Setting color with alpha value: "washed out" red colour
poSeries->setBaseColor( QColor( 100, 0, 0, 100 ));

您可能会看到,是通过“ setBaseColor”设置的透明度设置呈现的颜色(而不是网格)。

不幸的是,我无法告诉您如何透明地渲染Q3DSurface本身,但我希望能有所帮助。