Brighten A Texture¶
In this example, we’ll use SlangPy to read from and write to a texture, showcasing simple broadcasting and inout parameters. To view the results, you’ll need tev.
You can find the complete code for this example here.
Slang Code¶
This Slang code defines a simple function that adds a value to an inout parameter:
// Add an amount to a given pixel
void brighten(float4 amount, inout float4 pixel)
{
pixel += amount;
}
Generating the Texture¶
We’ll skip the device initialization and module loading steps and go straight to generating and displaying a random texture:
# ... device initialization and module loading here ...
# Generate a random image
rand_image = np.random.rand(128 * 128 * 4).astype(np.float32) * 0.25
tex = device.create_texture(
width=128,
height=128,
format=spy.Format.rgba32_float,
usage=spy.TextureUsage.shader_resource | spy.TextureUsage.unordered_access,
data=rand_image
)
# Display it with tev
spy.tev.show(tex, name='photo')
Note: The texture is created with both shader_resource and unordered_access usage flags, enabling it to be both read from and written to in a shader.
Brightening the Texture¶
Next, we call the brighten function and display the updated texture:
# Call the module's brighten function, passing:
# - a float4 constant broadcast to every pixel
# - the texture as an inout parameter
module.brighten(spy.float4(0.5), tex)
# Display the result
spy.tev.show(tex, name='brighter')
In this example:
SlangPy infers a 2D dispatch because a 2D texture of
float4is passed into the function.The first parameter (a single
float4) is broadcast to every thread.The second parameter (marked
inout) allows both reading from and writing to the texture.
Summary¶
In this example we’ve seen:
Textures: How to read and write each pixel of a texture.
Broadcasting: How a single scalar can be broadcast to every thread.
The same brighten function could also be used in many other ways, such as:
Adding two textures together.
Adding a buffer to a texture.
Adding a texture to a buffer.
SlangPy’s flexibility allows seamless integration between these types, making it easy to extend this example for more advanced scenarios.