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 float4 is 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.