topical media & game development

talk show tell print

graphic-shader-sepia.pbk / pbk



  
*************************************************************************** Copyright (C) 2008 Adobe Systems Incorporated All Rights Reserved. NOTICE: All information contained herein is, and remains the property of Adobe Systems Incorporated and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to Adobe Systems Incorporated and its suppliers and may be covered by U.S. and Foreign Patents, patents in process, and are protected by trade secret or copyright law. Dissemination of this information or reproduction of this material is strictly forbidden unless prior written permission is obtained from Adobe Systems Incorporated. ***************************************************************************

  
  
  <languageVersion: 1.0;>
   
  // sepia: A simple example to demonstrate the use of the hydra to perform 
  //        pointwise pixel processing on an image.  The filter uses matrix math
  //        to perform a simple color space transformation to achieve the sepia 
  //        coloration.
  kernel sepia
  <   namespace : "AIF";
      vendor : "Adobe Systems";
      version : 2;
      description : "a variable sepia filter"; >
  {
      // An input parameter used to specify the intensity of the sepia coloration.  
      // The parameters come directly from the user by way of the UI that gets 
      // created for the filter.
      parameter float intensity;
  
      input image4 src;
      output float4 dst;
  
      // evaluatePixel(): The function of the filter that actually does the 
      //                  processing of the image.  This function is called once 
      //                  for each pixel of the output image.
      void
      evaluatePixel()
      {
          // temporary variables to hold the colors.
          float4 rgbaColor;
          float4 yiqaColor;
  
          // The language implements matrices in column major order.  This means
          // that mathematically, the transform will look like the following:
          // |Y|   |0.299     0.587   0.114   0.0| |R|
          // |I| = |0.596     -0.275  -0.321  0.0| |G|
          // |Q|   |0.212     -0.523  0.311   0.0| |B|
          // |A|   |0.0       0.0     0.0     1.0| |A|
          float4x4 YIQMatrix = float4x4(
              0.299,  0.596,  0.212, 0.000,
              0.587, -0.275, -0.523, 0.000,
              0.114, -0.321,  0.311, 0.000,
              0.000,  0.000,  0.000, 1.000
          );
          
          // Similar to the above matrix, the matrix is in column order.  Thus, 
          // the transform will look like the following:
          // |R|   |1.0   0.956   0.621   0.0| |Y|
          // |G| = |1.0   -0.272  -0.647  0.0| |I|
          // |B|   |1.0   -1.11   1.70    0.0| |Q|
          // |A|   |0.0   0.0     0.0     1.0| |A|
          float4x4 inverseYIQ = float4x4(
              1.0,    1.0,    1.0,    0.0,
              0.956, -0.272, -1.10,  0.0,
              0.621, -0.647,  1.70,   0.0,
              0.0,    0.0,    0.0,    1.0
          );
  
          // get the pixel value at our current location
          rgbaColor = sampleNearest(src, outCoord());
  
          yiqaColor = YIQMatrix * rgbaColor;
  
          // Here we set the I value of the YIQ color to the intensity
          // specified in the UI.  This is a good demonstration of how 
          // to use swizzling to access vector elements.  The different
          // options are the following:
          //    rgba, xyzw, stuv  where:
          //    r, x, or s correspond to the first element
          //    g, y, or t correspond to the second element
          //    etc.
          yiqaColor.y = intensity; 
          // zero out the Q to apply the sepia tone
          yiqaColor.z = 0.0;
  
          // convert back to RGBA and set the output value to the modified color.
          dst = inverseYIQ * yiqaColor;
      }
  }
  
  


(C) Æliens 20/2/2008

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.