Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Q3DSurface:半透明QSurface3DSeries_C++_Qt5 - Fatal编程技术网

C++ Q3DSurface:半透明QSurface3DSeries

C++ Q3DSurface:半透明QSurface3DSeries,c++,qt5,C++,Qt5,我尝试使用alpha通道渲染曲面,但在设置alpha值时,它使用随机颜色渲染,而不是半透明 // Init memory Q3DSurface *poSurface = new Q3DSurface(); QSurface3DSeries *poSeries = new QSurface3DSeries(); QSurfaceDataArray *poDataArray = new QSurfaceDataArray(); // Generating test surface series f

我尝试使用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();
//初始化内存
Q3DSurface*possurface=新的Q3DSurface();
QSurface3DSeries*poSeries=新QSurface3DSeries();
QSurfaceDataArray*poDataArray=新的QSurfaceDataArray();
//生成测试曲面系列
对于(int i=0,k=0;i<10;++i)
{
QSurfaceDataRow*poRow=新的QSurfaceDataRow();
对于(int j=0;j<10;++j)
{
浮动x=j;
浮动y=i;
浮动z=k;
poRow->append(QSurfaceDataItem(QVector3D(x,y,z));
}
poDataArray->append(poRow);
如果(i%2==0)
{
++k;
}
}
//
poSeries->dataProxy()->resetArray(poDataArray);
poSurface->addSeries(poSeries);
//使用alpha值设置颜色
poSeries->setBaseColor(QColor(100100100100));
//显示表面小部件
QWidget*poWidget=QWidget::createWindowContainer(poSurface);
poWidget->setWindowTitle(“测试”);
poWidget->show();

我做错了什么?

我不确定你所说的“随机颜色”是什么意思,但猜猜看,你是在考虑默认照明吗?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本身,但我希望这能有所帮助。

我无法解释随机颜色。当我将灰度设置为alpha级别小于255时,当我重新启动测试示例时,颜色args r=100、g=100、b=100(灰色)的曲面图形将作为随机颜色(红色、蓝色、绿色、黑色、灰色或白色)。我无法附加图像为您显示(低评级)。您可以复制我的示例,构建它并开始几次—您将看到这个问题。嗨,Jarex,我复制了您的代码并运行了几次。我看不到同样的问题。根据RGBA设置,它始终以灰色运行(随着alpha值接近0,从灰色逐渐变为灰白色)。这可能是图形驱动程序的问题吗?当我使用poSeries->setBaseColor(QColor(100100100100))时,我看到了这个问题;我在另外两台电脑上试用了我的代码,使用了其他(NVIDIA)驱动程序版本(以及最新版本),我还使用了其他Qt版本-5.7和5.12。若alpha参数将从QColor构造函数中删除,则一切都将正常,颜色始终保持灰色。alpha通道出现问题,可能是场景选项或曲面格式不正确,我尝试了默认和自定义。没有结果。我不明白问题是什么:(