topical media & game development
graphic-player-10-pixel-sample-store-simpleBoxBlur.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;>
// simpleBoxBlur: A simple example to demonstrate how to implement a simple
// blur filter. This filter is a good demonstration on how to
// access pixels in addition to the one at the current output
// coordinate.
kernel simpleBoxBlur
< namespace : "AIF";
vendor : "Adobe Systems";
version : 2;
description : "A simple fixed-size box blur"; >
{
input image4 src;
output float4 dst;
// Region functions are not available in Flash targets, so we only define
// the functions if we are executing on a different backend.
if !AIF_FLASH_TARGET
// needed(): Indicates what area of the input is needed to fulfill the
// requested output region. In this case, we consider a
// radius = 1.0 area of the input for each output pixel, so we
// need to outset the area by one.
region needed(region outputRegion, imageRef inputRef)
{
float2 singlePixel = pixelSize(src);
return outset(outputRegion, float2(singlePixel.x, singlePixel.y));
}
// changed(): Indicates what area of the output is affected by the
// specified input. In this case, we will blur out the image
// by exactly one pixel, so the output is the input outset by
// one.
region changed(region inputRegion, imageRef inputRef)
{
float2 singlePixel = pixelSize(src);
return outset(inputRegion, float2(singlePixel.x, singlePixel.y));
}
endif
// 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()
{
float denominator = 0.0;
float4 colorAccumulator = float4(0.0, 0.0, 0.0, 0.0);
float2 singlePixel = pixelSize(src);
// Access the nine pixels surrounding the current coordinate location.
// We access the pixels in the following order assuming that the
// current coordinate is located in the center of the matrix:
// 1 4 7
// 2 5 8
// 3 6 9
colorAccumulator += sampleNearest(src,
outCoord() + float2(-singlePixel.x, -singlePixel.y));
denominator++;
colorAccumulator += sampleNearest(src,
outCoord() + float2(-singlePixel.x, 0.0));
denominator++;
colorAccumulator += sampleNearest(src,
outCoord() + float2(-singlePixel.x, singlePixel.y));
denominator++;
colorAccumulator += sampleNearest(src,
outCoord() + float2(0.0, -singlePixel.y));
denominator++;
colorAccumulator += sampleNearest(src,
outCoord());
denominator++;
colorAccumulator += sampleNearest(src,
outCoord() + float2(0.0, singlePixel.y));
denominator++;
colorAccumulator += sampleNearest(src,
outCoord() + float2(singlePixel.x, -singlePixel.y));
denominator++;
colorAccumulator += sampleNearest(src,
outCoord() + float2(singlePixel.x, 0.0));
denominator++;
colorAccumulator += sampleNearest(src,
outCoord() + float2(singlePixel.x, singlePixel.y));
denominator++;
// calculate the resultant pixel value which is the accumulated color
// divided by the total number of pixels.
// In this case, the denominator is 9.
dst = colorAccumulator / denominator;
}
}
(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.