シェーディング・ノード・プラグインによって、Maya のシェーディング・ノードを作成することができます。
以下のアトリビュート名は、シェーダ用に予約されているダイナミックアトリビュート(<レンダリングアトリビュート)の名前です。
これらの名前をアトリビュート名として使用すると、特別な意味になります。
blobbySurfaceFactor , displacement , easMask , farPointCamera , farPointObj , farPointWorld , filterSize , flippedNormal , illuminationIndex , infoBits , lightData , lightTable , matrixObjectToWorld , matrixWorldToObject , mediumRefractiveIndex , normalCamera , numShadingSamples , objectId , objectType , opticalDepth , outColor , outGlowColor , outMatteOpacity , outParticleEmission , outTransparency , particleAge , particleAttrArray , particleColor , particleEmission , particleEntryParam , particleExitParam , particleIncandescence , particleLifespan , particleOrder , particleTransparency , particleWeight , pixelCenter , pixelCoverage , pointCamera , pointObj , pointWorld , primitiveId , rayDepth , rayDirection , rayOrigin , receiveShadows , refPointCamera , refPointObj , refPointWorld , renderState , shadowAttenuation , tangentUCamera , tangentVCamera , translucenceDepth , triangleNormalCamera , uvCoord , uvFilterSize , vertexCameraOne , vertexCameraThree , vertexCameraTwo , vertexUvOne , vertexUvThree , vertexUvTwo
オブジェクトのノーマルベクトルの X 成分が 0 のときに黒、0 以上のときは指定した色になるシェーダを作成してみましょう。
import sys import maya.OpenMaya import maya.OpenMayaMPx kPluginNodeName = 'myShader1' kPluginNodeId = maya.OpenMaya.MTypeId(0x87004) class myShader1(maya.OpenMayaMPx.MPxNode): aInColor = maya.OpenMaya.MObject() aNormalCamera = maya.OpenMaya.MObject() aOutColor = maya.OpenMaya.MObject() def __init__(self): maya.OpenMayaMPx.MPxNode.__init__(self) def compute(self, plug, block): if plug == myShader1.aOutColor or plug.parent() == myShader1.aOutColor: resultColor = maya.OpenMaya.MFloatVector(0.0, 0.0, 0.0) inColor = block.inputValue(myShader1.aInColor).asFloatVector() normalCamera = block.inputValue(myShader1.aNormalCamera).asFloatVector() if normalCamera.x >= 0: resultColor.x = inColor.x resultColor.y = inColor.y resultColor.z = inColor.z outColorHandle = block.outputValue(myShader1.aOutColor) outColorHandle.setMFloatVector(resultColor) outColorHandle.setClean() else: return maya.OpenMaya.kUnknownParameter def nodeCreator(): return maya.OpenMayaMPx.asMPxPtr(myShader1()) def nodeInitializer(): nAttr = maya.OpenMaya.MFnNumericAttribute() myShader1.aNormalCamera = nAttr.createPoint('normalCamera', 'n') nAttr.setKeyable(True) nAttr.setStorable(True) nAttr.setReadable(True) nAttr.setWritable(True) nAttr.setDefault(1.0, 1.0, 1.0) myShader1.aInColor = nAttr.createColor('inColor', 'ic') nAttr.setStorable(True) nAttr.setReadable(True) nAttr.setWritable(True) nAttr.setDefault(1.0, 1.0, 1.0) myShader1.aOutColor = nAttr.createColor('outColor', 'oc') nAttr.setStorable(False) nAttr.setHidden(False) nAttr.setReadable(True) nAttr.setWritable(False) myShader1.addAttribute(myShader1.aInColor) myShader1.addAttribute(myShader1.aNormalCamera) myShader1.addAttribute(myShader1.aOutColor) myShader1.attributeAffects (myShader1.aInColor, myShader1.aOutColor) myShader1.attributeAffects (myShader1.aNormalCamera, myShader1.aOutColor) def initializePlugin(mobject): mplugin = maya.OpenMayaMPx.MFnPlugin(mobject) try: mplugin.registerNode( kPluginNodeName, kPluginNodeId, nodeCreator, nodeInitializer, maya.OpenMayaMPx.MPxNode.kDependNode, 'utility/color' ) except: sys.stderr.write( 'Failed to register node: %s' % kPluginNodeName ) raise def uninitializePlugin(mobject): mplugin = maya.OpenMayaMPx.MFnPlugin(mobject) try: mplugin.deregisterNode( kPluginNodeId ) except: sys.stderr.write( 'Failed to deregister node: %s' % kPluginNodeName ) raise
import sys
import maya.OpenMaya
import maya.OpenMayaMPx
kPluginNodeName = 'myShader1'
kPluginNodeId = maya.OpenMaya.MTypeId(0x87004)
class myShader1(maya.OpenMayaMPx.MPxNode):
aInColor = maya.OpenMaya.MObject()
aNormalCamera = maya.OpenMaya.MObject()
aOutColor = maya.OpenMaya.MObject()
def __init__(self):
maya.OpenMayaMPx.MPxNode.__init__(self)
def compute(self, plug, block):
if plug == myShader1.aOutColor or plug.parent() == myShader1.aOutColor:
resultColor = maya.OpenMaya.MFloatVector(0.0, 0.0, 0.0)
inColor = block.inputValue(myShader1.aInColor).asFloatVector()
normalCamera = block.inputValue(myShader1.aNormalCamera).asFloatVector()
if normalCamera.x >= 0:
resultColor.x = inColor.x
resultColor.y = inColor.y
resultColor.z = inColor.z
outColorHandle = block.outputValue(myShader1.aOutColor)
outColorHandle.setMFloatVector(resultColor)
outColorHandle.setClean()
else:
return maya.OpenMaya.kUnknownParameter
def nodeCreator():
return maya.OpenMayaMPx.asMPxPtr(myShader1())
def nodeInitializer():
nAttr = maya.OpenMaya.MFnNumericAttribute()
myShader1.aNormalCamera = nAttr.createPoint('normalCamera', 'n')
nAttr.setKeyable(True)
nAttr.setStorable(True)
nAttr.setReadable(True)
nAttr.setWritable(True)
nAttr.setDefault(1.0, 1.0, 1.0)
myShader1.aInColor = nAttr.createColor('inColor', 'ic')
nAttr.setStorable(True)
nAttr.setReadable(True)
nAttr.setWritable(True)
nAttr.setDefault(1.0, 1.0, 1.0)
myShader1.aOutColor = nAttr.createColor('outColor', 'oc')
nAttr.setStorable(False)
nAttr.setHidden(False)
nAttr.setReadable(True)
nAttr.setWritable(False)
myShader1.addAttribute(myShader1.aInColor)
myShader1.addAttribute(myShader1.aNormalCamera)
myShader1.addAttribute(myShader1.aOutColor)
myShader1.attributeAffects (myShader1.aInColor, myShader1.aOutColor)
myShader1.attributeAffects (myShader1.aNormalCamera, myShader1.aOutColor)
def initializePlugin(mobject):
mplugin = maya.OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.registerNode( kPluginNodeName, kPluginNodeId, nodeCreator,
nodeInitializer, maya.OpenMayaMPx.MPxNode.kDependNode, 'utility/color' )
except:
sys.stderr.write( 'Failed to register node: %s' % kPluginNodeName )
raise
def uninitializePlugin(mobject):
mplugin = maya.OpenMayaMPx.MFnPlugin(mobject)
,,
try:
mplugin.deregisterNode( kPluginNodeId )
except:
sys.stderr.write( 'Failed to deregister node: %s' % kPluginNodeName )
raise