Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python 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

    Custom Multipass Anti Aliasing

    SDK Help
    0
    2
    295
    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.
    • H
      Helper
      last edited by

      On 12/01/2016 at 03:20, xxxxxxxx wrote:

      User Information:
      Cinema 4D Version:   R14+ 
      Platform:      
      Language(s) :     C++  ;

      ---------
      Hey there,

      so a very basic example from VideoPostData::Execute() :

        // Render the color and object buffer data.
        if (vps->vd && vps->render && vps->vp == VIDEOPOSTCALL_RENDER
            && !vps->open && colorBuffer_ != 0) {
        
          VPBuffer* colorBuf = vps->render->GetBuffer(VPBUFFER_POSTEFFECT, colorBuffer_);
          LONG const xres = colorBuf->GetInfo(VPGETINFO_XRESOLUTION);
          LONG const yres = colorBuf->GetInfo(VPGETINFO_YRESOLUTION);
          LONG const cpp = colorBuf->GetInfo(VPGETINFO_CPP);
        
          Bool hit;
          Ray ray;
          SurfaceIntersection si;
        
          for (LONG y = 0; y < yres; ++y) {
            for (LONG x = 0; x < xres; ++x) {
              // Find the first polygon that hits the ray for the current pixel.
              vps->vd->GetRay(x, y, &ray);
              hit = vps->vd->TraceGeometry(&ray, MAXREALr, vps->vd->lhit, &si);
              if (!hit || !si.op || !si.op->link) {
                continue;
              }
        
              SReal pixel[3] = {1.0, 1.0, 1.0};
              colorBuf->SetLine(x, y, 1, &pixel, 32, false);
            }
          }
        }
      

      This works perfectly fine. Example for a simple cube:

      My problem is that I have no idea how to apply anti aliasing to the buffer. Ideally it should be the
      same anti aliasing that is defined in the render settings. Are there any examples that I might have
      missed in my searches? Or does anyone have an idea how to do it?

      Thanks in advance,
      Niklas

      1 Reply Last reply Reply Quote 0
      • H
        Helper
        last edited by

        On 12/01/2016 at 11:38, xxxxxxxx wrote:

        in general, antialisaing is a "blurring" filter. "it is not actually blurring, but just understand it like this"

                colorBuf->SetLine(x, y, 1, &pixel, 32, false);
        

        here lies the problem, for a simple Gaussian AA filter, you need to set the current pixel,
        and weighting the neighboring pixels! for example "value[x - 1] = v * 0.6", "weight[x - 1] += .." at the end, value[x - 1] /= weight[x - 1] "if weight != 0" this will blend pixels together. some good references:
        https://github.com/mmp/pbrt-v2/blob/master/src/filters/gaussian.cpp
        https://github.com/mmp/pbrt-v2/blob/master/src/film/image.cpp

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