Create Shader Not Rendering

On 05/03/2013 at 15:45, xxxxxxxx wrote:

I have a problem where I have code that creates a shader and loads a file into the color and alpha channel and activates the alpha channel, but then nothing will render in either the viewport or the Picture Viewer. If I disable the alpha I can render again, but I dont know why I can render with both? Any ideas? Thanks!
Using R14 Studio

import c4d
from c4d import documents
#Welcome to the world of Python
  
  
def main() :
  
                #replace with your path
                file = "/Volumes/Textures/Leaves/Leaf1.tif"
                
                def insertobj() :
                    obj = c4d.BaseObject(c4d.Oplane)
                    doc.InsertObject(obj)        
                    c4d.EventAdd()                 
    
                doc = documents.GetActiveDocument()    
                
                mat = c4d.BaseMaterial(c4d.Mmaterial)  
                sha = c4d.BaseList2D(c4d.Xbitmap)
                sha[c4d.BITMAPSHADER_FILENAME]  = file
                mat.InsertShader( sha )
                mat[c4d.MATERIAL_COLOR_SHADER]  = sha
                mat[c4d.MATERIAL_USE_ALPHA]=True
                mat[c4d.MATERIAL_ALPHA_SHADER]  = sha
                
                mat.Message( c4d.MSG_UPDATE )
                mat.Update( True, True )
                doc.InsertMaterial( mat )
                
                insertobj()
                mat = doc.SearchMaterial("Mat")
                obj = doc.SearchObject("Plane")
                doc.SetActiveObject(obj)
                doc.SetActiveMaterial(mat)
                c4d.CallCommand(12169);
                
                
        
         
  
if __name__=='__main__':
    main()

On 05/03/2013 at 16:18, xxxxxxxx wrote:

you cannot assign the same instance of a shader to multiple channels. that is a limitation of
the c4d material system. you have to create a copy first.

mat[c4d.MATERIAL_ALPHA_SHADER] = sha.GetClone()

edit : note that you might run into more problems, when you try to copy more complex
shader setups this way, due to the unpredictable way c4d.c4datom.getclone() works.
copying shaders which contain object (instance) references themselves will not always 
return the expected results.

On 06/03/2013 at 07:22, xxxxxxxx wrote:

The shader also has to be inserted into the material's shader-list. Use BaseMaterial.InsertShader()
for this. This has to be done for every single clone of the shader as well. Do not invoke it twice
per shader.

Best,
-Niklas

On 06/03/2013 at 08:18, xxxxxxxx wrote:

Thanks for your responses, that makes sense. However, when add the .GetClone() on the end it doesn't load the image into the alpha for me? was there more that has to be done?

I tried what Niklas said about inserting the shader again with something like this:

mat[c4d.MATERIAL_ALPHA_SHADER] = sha.GetClone()
mat.InsertShader( sha.GetClone() )

Edit: ok I got it, I think it was a newb thing. I assigned the sha.GetClone to variable first then it worked. Thanks again guys!

sha2 = sha.GetClone()
mat[c4d.MATERIAL_ALPHA_SHADER] = sha2
mat.InsertShader( sha2 )