C++ Q3DSurface:半透明QSurface3DSeries
我尝试使用alpha通道渲染曲面,但在设置alpha值时,它使用随机颜色渲染,而不是半透明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
// 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通道出现问题,可能是场景选项或曲面格式不正确,我尝试了默认和自定义。没有结果。我不明白问题是什么:(