Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    Rendering into Multipassbitmap a "Depth Matte" Layer

    Cinema 4D SDK
    c++
    2
    5
    846
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • WickedPW
      WickedP
      last edited by ferdinand

      I have a follow-up question to this. I can't see the link between making a MultipassBitmap (MPB) and having a depth matte render.

      For example; when I hit the render button, it renders with a depth matte and it displays in the picture viewer. But if I do it myself (C++) using the same render settings, I don't get any depth matte. I'm guessing it has something to do with setting up layers in the MPB. But I can't see how this is done. I know how to make a layer. But I don't know how to say "this layer is for the depth matte".

      For however it's done, is there an example of this somewhere?

      WP.

      edit by @ferdinand : Forked from Render settings Multi-Pass flag. Please open new topics for new questions, your follow up questions were too broad to be put into the same topic.

      wickedp.com

      1 Reply Last reply Reply Quote 0
      • WickedPW
        WickedP
        last edited by

        I may have resolved this. It seems like I have to use SetParameter() with the flags MPBTYPE_USERID and VPBUFFER_DEPTH. This wasn't clear in the docs (my docs at least).

        Just a suggestion, it might be useful to have an example reference somewhere of how to setup a MultipassBitmap for rendering with all the layers needed as per the render settings. Something like how the Render To Picture Viewer button might do it behind the scenes.

        WP.

        wickedp.com

        ferdinandF 1 Reply Last reply Reply Quote 0
        • ferdinandF
          ferdinand @WickedP
          last edited by

          Hello @WickedP,

          Thank you for reaching out to us. It is great to hear that you did find your solution.

          Regarding your request for adding a code example: I do not fully understand what you were trying to do?

          For example; when I hit the render button, it renders with a depth matte and it displays in the picture viewer. But if I do it myself (C++) using the same render settings, I don't get any depth matte.

          What does constitute 'do[ing] it myself' for you here? When one implements a renderer, one usually does not have to deal with render bitmaps and instead operates on render buffers. When using RenderDocument or the things like the render queue, one does not have to manage bitmaps either.

          I assume you mean that you want to mimic the output of a renderer with a depth pass/channel. I am not totally against adding such an example, but what would be the content of it? Create an RGBA channel and an alpha channel for that? Recreating the whole structure of a multipass render output bitmap with all the layers unfortunately does not have a good relevance/effort ratio. So, I cannot do 'everything'.

          Cheers,
          Ferdinand

          MAXON SDK Specialist
          developers.maxon.net

          WickedPW 1 Reply Last reply Reply Quote 0
          • WickedPW
            WickedP @ferdinand
            last edited by

            Thanks @ferdinand, I don't expect you to do everything 🙂

            But I've reached a point where I've tried everything I can think of. I've spent too long going around in circles at this point. Here's what I'd like to get:

            A MultipassBitmap that I can pass to RenderDocument() that will give me

            • 1 layer for RGB (32bit)
            • 1 layer for alpha (32bit) <-- yes, I want a separate alpha layer
            • 1 layer for depth (32bit)

            for use with the standard renderer. For now, I must have these 3 layers.

            Here's some code I've experimented with to try and show you where I've been:

            MultipassBitmap *multi = MultipassBitmap::Alloc(width,height,COLORMODE_RGBf);
            
            if(multi)
            {
            	MultipassBitmap *colourMap = multi->GetLayerNum(0);
            
            	MultipassBitmap *alphaMap = multi->AddAlpha(nullptr,COLORMODE_GRAYf);
            							
            	if(alphaMap)
            	{
            		alphaMap->SetParameter(MPBTYPE_NAME,String("Alpha"));
            		alphaMap->SetParameter(MPBTYPE_USERID,VPBUFFER_ALPHA);
            		alphaMap->SetParameter(MPBTYPE_SAVE,TRUE);
            		alphaMap->SetParameter(MPBTYPE_SHOW,TRUE);
            	}
            
            	MultipassBitmap *depthMap = multi->AddAlpha(alphaMap,COLORMODE_GRAYf,FALSE);
            
            	if(depthMap)
            	{
            		depthMap->SetParameter(MPBTYPE_NAME,String("Depth"));
            		depthMap->SetParameter(MPBTYPE_USERID,VPBUFFER_DEPTH);
            		depthMap->SetParameter(MPBTYPE_SAVE,TRUE);
            		depthMap->SetParameter(MPBTYPE_SHOW,TRUE);
            	}
            
            	if(RenderDocument(doc,rdata,nullptr,nullptr,multi,RENDERFLAGS_0,nullptr) == RENDERRESULT_OK)
            	{
            		ShowBitmap(multi);
            	}
            }
            

            I've tried all sorts of variations of this, none of which produce the same as the Render to Picture Viewer command. Which is why I mentioned having that as an example would be useful.

            How do we do this?

            WP.

            wickedp.com

            ferdinandF 1 Reply Last reply Reply Quote 0
            • ferdinandF
              ferdinand @WickedP
              last edited by ferdinand

              Hey @wickedp,

              thank your for your reply. First of all,

              I don't expect you to do everything

              in case my answer gave the impression that I am unwilling to add such an example - that is not the case. I just must play a bit the gatekeeper for not letting our code examples become too convoluted and fringe. So, this was less a "ugh, we do not have time for this" than a "what demonstrates the general relevance of such example/information for most users?" thing.

              First of all, thank you for sharing what you would like to have documented as an example and your code. I personally would still say that this is an extremely specific example of a use case most users probably will never encounter. Which makes it a not so good example case. But we also have many fringe examples in our code base, and in the case one needs such example, it is quite helpful, as the parameter handling of bitmaps is a bit cryptic.

              I have added a task to our task pool to add such an example. I will add it in one of the next releases.

              Cheers,
              Ferdinand

              MAXON SDK Specialist
              developers.maxon.net

              1 Reply Last reply Reply Quote 0
              • First post
                Last post