[MSCE] 构件透明度问题

请问老师:

       如下图,为什么transparency是0,但是实际看到在却不是非透明?

Parents Reply Children
  • 进一步写代码分析,发现这个透明度是依靠TransmitIntensity来控制的。材质编程这一块极其复杂。

    virtual void _AnnounceElemMatSymb(ElemMatSymbCR matSymb) override
    	{
    		WChar materialName[256];
    		MaterialCP pMat = matSymb.GetMaterial();
    		pMat->GetName(materialName);
    		MaterialSettingsCR matSet = pMat->GetSettings();
    		WPrintfString wStr(L"material name = %s\nmaps count = %d", materialName, matSet.GetMaps().Size());
    		mdlDialog_dmsgsPrint(wStr);
    		wStr.Sprintf(L"translucencyScale = %.4f\ntransmitIntensity = %.4f", matSet.GetTranslucencyScale(), matSet.GetTransmitIntensity());
    		mdlDialog_dmsgsPrint(wStr);
    		for (auto iter : matSet.GetMaps())
    		{
    			MaterialMapLayerCollectionCR layers = iter.second->GetLayers();
    			for (MaterialMapLayerConstIterator iter2 = layers.begin(); iter2 != layers.end(); ++iter2)
    			{
    				WPrintfString wStr2(L"MapType = %d, LayerType = %d, Opacity=%.4f", iter.second->GetType(), 
    					                iter2->GetType(), iter2->GetOpacity());
    				mdlDialog_dmsgsPrint(wStr2);
    			}
    		}
    	}

    即:matSymb.GetMaterial()->GetSettings().GetTransmitIntensity()可获得0.9这个值,正好对应界面中的opacity为10。因为transmit表示透过度,而opacity表示不透明度,两者的值是相反的。再者,transmit的取值范围是0~1,而界面上的Opacity取值范围是0~100.

    故opacity = (1-matSymb.GetMaterial()->GetSettings().GetTransmitIntensity()) * 100;



  • 嗯,非常感谢符老师,说明非常详细。