BLENDER • MATERIALS AND SHADERS

Image Texture Nodes — Add image texture nodes and connect them correctly (color space awareness)

Master color space settings so your textures render with physically accurate color, roughness, and surface detail.

Historical Context & Motivation

Before node-based shading existed, 3D artists assigned textures through rigid, layer-based material editors that offered little control over how image data was interpreted by the renderer. Early systems like those in 3ds Max R1 and Softimage simply mapped a bitmap onto geometry with minimal distinction between color images and data maps such as bump or specular textures. The consequence was subtle but pervasive: non-color data like normal maps would be incorrectly gamma-corrected, producing washed-out surface detail and physically implausible shading. The evolution toward node-based material systems—and the parallel rise of color management pipelines—was driven precisely by this need to treat different kinds of image data with the correct mathematical interpretation.

2004
Blender 2.34 — UV/Image Editor Overhaul
Blender's UV mapping tools matured, enabling artists to project textures onto meshes with precision, though materials were still edited through a panel-based interface with limited compositing capability.
2011
Blender 2.61 — Cycles Render Engine
The introduction of the Cycles path-tracing renderer brought a fully node-based shader editor, making the Image Texture node central to PBR workflows and exposing the color space dropdown for the first time.
2013
OpenColorIO Integration
Blender adopted the OpenColorIO (OCIO) color management framework, standardizing sRGB, Linear, and Non-Color interpretations across the pipeline and aligning Blender with VFX industry practices.
2018
Blender 2.80 — EEVEE & Principled BSDF
The Principled BSDF shader consolidated PBR inputs, making correct Image Texture node connections—and proper color space selection—essential for both real-time and offline rendering.
2023
Blender 3.5+ — AgX & Filmic Color Transforms
Advanced view transforms like AgX reinforced the importance of scene-referred linear workflows, where incorrect color space tagging on texture inputs produces visible errors in the final render.

The central question this lesson addresses is deceptively simple: when you plug an image into a shader, how does Blender decide whether the pixel values represent perceptual color (what your eyes see on a monitor) or raw numeric data (height, direction vectors, masks)? Misunderstanding this distinction is arguably the most common material error among intermediate Blender users, and correcting it will immediately elevate the physical accuracy of your renders.

Core Principles & Definitions

Understanding Image Texture nodes requires grasping several foundational ideas that connect digital imaging theory to real-time and offline rendering pipelines. These principles govern every texture you will ever connect in Blender's Shader Editor, whether you are building a photorealistic architectural visualization or a stylized game asset.

1

Color Space

A color space defines how numerical pixel values map to perceived colors. sRGB applies a non-linear transfer function (gamma ≈ 2.2) so mid-tones look correct on consumer displays. Linear stores values proportional to actual light intensity, which is what renderers need for physically correct math.
2

Non-Color (Data) Tag

Images that encode information rather than color—such as normal maps, roughness maps, displacement maps, and alpha masks—must be tagged as Non-Color. This prevents Blender from applying any gamma linearization, preserving the raw numeric meaning of each pixel.
3

Gamma Linearization

When the color space is set to sRGB, Blender automatically converts the image to linear light before shading calculations by applying the inverse transfer function. This ensures that lighting math (which operates in linear space) produces physically plausible results.
4

Principled BSDF Inputs

The Principled BSDF shader has multiple input sockets. The Base Color socket expects color data (sRGB → linearized). Sockets like Roughness, Metallic, and Normal expect raw data (Non-Color).
5

Image Texture Node Anatomy

Each Image Texture node exposes an image selector, a Color Space dropdown (sRGB, Non-Color, Linear, Raw, etc.), an interpolation method, and projection options. The Color and Alpha outputs carry float or vector data downstream to the shader.
KEY TAKEAWAY
Think of color space like the language a book is written in. A diffuse texture is written in sRGB—Blender knows to 'translate' it into the renderer's native linear language. A normal map, however, is already written in the renderer's native language (Non-Color); if Blender tries to 'translate' it again, the meaning gets scrambled. Choosing the right color space is simply telling Blender which language the image speaks.

Visual Explanation — Node Wiring Diagram

The following diagram illustrates a typical PBR material setup in Blender's Shader Editor. Three Image Texture nodes feed into a Principled BSDF shader, each configured with the appropriate color space. Pay close attention to the color space labels on each node and the socket connections—these two elements are where most errors occur.

The diffuse (Base Color) texture is set to sRGB because it represents perceptual color. Roughness and Normal textures are set to Non-Color because they encode numerical data. The Normal Map passes through a Normal Map node before reaching the Principled BSDF's Normal input.

Notice that each Image Texture node is a separate instance with its own color space setting—they are not shared. This is intentional because a single material often mixes color images and data images. The Color output socket on every Image Texture node transmits the same type of data (a vector of float values), but the color space tag determines how Blender interprets those floats before passing them into the shader's lighting calculations. When set to sRGB, the renderer linearizes the values; when set to Non-Color, it passes them through unchanged.

How Color Space Conversion Works

Although this is a visual arts course rather than a mathematics course, a basic understanding of the gamma transfer function clarifies why incorrect color space settings produce visible artifacts. The sRGB standard encodes luminance with a piecewise function that is approximately equivalent to raising the linear value to the power of 1/2.2 during encoding, and raising it to 2.2 during decoding (linearization). Blender performs this decoding automatically when you set an Image Texture to sRGB.

sRGB → LINEAR APPROXIMATION
V_linear ≈ V_sRGB ^ 2.2
Where V_sRGB is the pixel value stored in the image file (0–1 range) and V_linear is the value the renderer uses for lighting calculations. This power function stretches dark values and compresses bright values.

Consider what happens if a roughness map—whose pixel values represent a physical parameter from 0 (perfectly smooth) to 1 (fully rough)—is incorrectly left at sRGB. A mid-gray pixel stored as 0.5 in the file would be linearized to approximately 0.52.2 ≈ 0.217. The surface would appear far smoother than the texture artist intended, because the renderer is interpreting a roughness of 0.217 instead of 0.5. For normal maps, the distortion is even more severe: the X, Y, and Z direction vectors encoded in the RGB channels would be warped non-linearly, producing incorrect surface normals and bizarre shading artifacts under lighting.

ROUGHNESS ERROR EXAMPLE
Roughness_actual = 0.5^2.2 ≈ 0.217 (wrong!)
When a roughness map is incorrectly tagged as sRGB, Blender applies gamma linearization that was never intended, dramatically reducing the effective roughness and making the surface appear more glossy than the texture artist designed.
⚠️ Common Pitfall
Blender attempts to auto-detect color space when you load an image. It usually gets diffuse textures correct (sRGB) but may incorrectly assign sRGB to data textures if their filename does not contain keywords like 'normal', 'roughness', or 'displacement'. Always verify the color space manually after loading any texture.

Conversely, if a diffuse color texture is set to Non-Color, the renderer will use the raw sRGB-encoded values directly without linearization. Because lighting math assumes linear input, the result will look overly saturated and contrasty—the gamma curve that was baked in for display purposes is now compounding with the display's own gamma, effectively double-encoding the image.

Texture Types & Correct Color Space Settings

In a standard PBR (Physically Based Rendering) workflow, materials are composed from multiple texture maps, each serving a distinct purpose. The critical skill is classifying each map as either color data or non-color data and setting the Image Texture node accordingly. The following table provides a comprehensive reference.

Standard PBR texture map classification and Blender settings
Texture MapConnects ToColor SpaceRationale
Diffuse / Albedo / Base ColorBase ColorsRGBRepresents perceived surface color; needs linearization for physically correct lighting.
RoughnessRoughnessNon-ColorEncodes a scalar value (0–1); gamma correction would distort the physical parameter.
MetallicMetallicNon-ColorBinary or near-binary mask (0 = dielectric, 1 = metal); must remain unaltered.
Normal MapNormal Map node → NormalNon-ColorRGB channels encode XYZ direction vectors; gamma correction warps the vector math.
Displacement / HeightDisplacement node or Bump nodeNon-ColorScalar height data; linearization would shift the displacement midpoint.
Ambient Occlusion (AO)Multiply node → Base ColorNon-ColorGrayscale occlusion factor; should remain as authored.
Emission / Emissive ColorEmission ColorsRGBRepresents color of emitted light; needs linearization like any color image.
Opacity / Alpha MaskAlpha input or Mix Shader factorNon-ColorBinary or gradient transparency mask; must be interpreted as raw values.
This flowchart presents the core decision: ask whether the texture represents visible color or numerical data. The answer determines the color space setting for the Image Texture node.

Worked Example — Setting Up a Full PBR Material

In this worked example, you will set up a complete PBR material for a weathered brick wall using four texture maps downloaded from a PBR texture library (e.g., Poly Haven or ambientCG). The texture set includes a diffuse map, a roughness map, a normal map, and a displacement map.

Brick Wall PBR Material Setup
1
Step 1 — Open the Shader Editor and Add a Principled BSDFSelect your mesh object, navigate to the Shader Editor workspace, and ensure a Principled BSDF node is present (it is the default shader for new materials). If starting from scratch, click Add → Shader → Principled BSDF and connect its output to the Material Output's Surface input.
Principled BSDF connected to Material Output.
2
Step 2 — Add the Diffuse Texture (sRGB)Press Shift+A → Texture → Image Texture to add an Image Texture node. Click 'Open' and load the diffuse map (e.g., brick_diffuse.jpg). Verify that the Color Space dropdown says sRGB (Blender usually auto-detects this correctly for color images). Connect the Color output to the Principled BSDF's Base Color input.
Diffuse map → Base Color (sRGB).
3
Step 3 — Add the Roughness Texture (Non-Color)Add another Image Texture node (Shift+A → Texture → Image Texture) and load the roughness map (e.g., brick_roughness.jpg). Change the Color Space dropdown to Non-Color. This is critical: the roughness map encodes scalar data, not perceived color. Connect the Color output to the Principled BSDF's Roughness input.
Roughness map → Roughness (Non-Color). Surface now reflects realistically.
4
Step 4 — Add the Normal Map (Non-Color + Normal Map Node)Add a third Image Texture node and load the normal map (brick_normal.png). Set the Color Space to Non-Color. Now add a Normal Map node (Add → Vector → Normal Map). Connect the Image Texture's Color output to the Normal Map node's Color input, then connect the Normal Map node's Normal output to the Principled BSDF's Normal input. The Normal Map node performs the tangent-space-to-world-space conversion that the Principled BSDF expects.
Normal map → Normal Map node → Normal input (Non-Color). Surface detail now catches light correctly.
5
Step 5 — Add Displacement (Non-Color + Displacement Node)Add a fourth Image Texture node, load the displacement map (brick_disp.png), and set Color Space to Non-Color. Add a Displacement node (Add → Vector → Displacement). Connect the Image Texture's Color output to the Displacement node's Height input, then connect the Displacement node's output to the Material Output's Displacement input. In the Material Properties panel, set Displacement to 'Displacement and Bump' or 'Displacement Only' and ensure your mesh has sufficient geometry (e.g., a Subdivision Surface modifier with Adaptive Subdivision enabled).
Complete PBR material with diffuse (sRGB), roughness (Non-Color), normal (Non-Color), and displacement (Non-Color). Render to verify.

Correct vs. Incorrect Color Space — Visual Consequences

Understanding the visual consequences of incorrect color space settings is essential for debugging materials. The following table contrasts correct and incorrect configurations, describing the artifacts each error produces in your final render.

Impact of incorrect color space settings on render quality
Texture TypeCorrect SettingCommon MistakeVisible Artifact
Diffuse / AlbedosRGBNon-ColorOver-saturated, high-contrast colors. Skin tones look sunburned; shadows appear crushed because gamma is double-applied.
RoughnessNon-ColorsRGBSurface appears shinier than intended. Mid-range roughness values (0.5) drop to ~0.22 after unwanted linearization.
Normal MapNon-ColorsRGBFaceted, 'crunchy' shading. Light catches edges incorrectly. Flat areas may show false bevels or dimples.
MetallicNon-ColorsRGBPartially metallic areas lose their metal classification; edge transitions between metal and dielectric become muddy.
DisplacementNon-ColorsRGBGeometry deformation is weaker than designed; fine details flatten out because linearization compresses mid-range height values.
KEY TAKEAWAY
Think of it like a mixing board in a recording studio. The sRGB setting is like engaging an EQ curve on an audio channel—it reshapes the signal for human perception. The Non-Color setting is a flat, bypass mode—the signal passes through untouched. If you accidentally EQ a control signal (like a MIDI automation track), the automation data gets warped and your mix goes haywire. Similarly, EQ-ing a data texture (roughness, normals) warps the numbers the renderer depends on.

Connection to Advanced Color Management

The color space dropdown on the Image Texture node is one component of Blender's broader OpenColorIO (OCIO) pipeline. As you advance into professional VFX and film production workflows, you will encounter additional color spaces and view transforms that extend far beyond sRGB and Non-Color. Understanding the Image Texture node's color space setting is the foundational step toward mastering scene-referred, linear light workflows used in compositing software like Nuke and DaVinci Resolve.

From fundamental texture setup to advanced color management
ConceptCurrent Lesson (Fundamentals)Advanced Practice
Color Spaces AvailablesRGB and Non-ColorACEScg, Linear Rec.709, Linear FilmLight E-Gamut, Raw, custom OCIO configs
View TransformFilmic or AgX (default)ACES Output Transforms, custom LUTs for on-set color matching
Texture Format8-bit JPEG/PNG (sRGB encoded)16/32-bit EXR and HDR (already linear, set to Linear or Raw)
Workflow TypeStandard PBR with Principled BSDFMulti-pass compositing with AOVs, light groups, and per-channel color space control
HDR TexturesNot coveredHDRI environment maps: set to Linear because EXR files store data in linear light natively
🔭 Looking Ahead
When working with EXR or HDR images (common for HDRI environment maps and multi-pass renders), the data is typically stored in linear space already. In those cases, set the color space to Linear rather than sRGB, since applying an sRGB-to-linear conversion to data that is already linear would under-expose the image. This distinction becomes critical in ACES-based pipelines where precise color space management determines whether your renders integrate seamlessly into a film post-production workflow.

Practice Problems

PROBLEM 1CONCEPTUAL
Explain in your own words why a roughness map must be set to Non-Color rather than sRGB. What does the pixel value 0.5 represent in a roughness map, and what would happen to that value if the image were incorrectly linearized?
PROBLEM 2BASIC CALCULATION
A displacement map pixel has a stored value of 0.7. Using the simplified gamma approximation (V_linear ≈ V_sRGB^2.2), calculate the value the renderer would use if the map were incorrectly set to sRGB. By what percentage does the effective displacement decrease?
PROBLEM 3INTERMEDIATE
You download a PBR texture set that includes five maps: base_color.png, roughness.png, metallic.png, normal.png, and ao.png. Describe how you would set up each Image Texture node, specifying the color space and the exact connection path (including any intermediate nodes) for each map when using a Principled BSDF shader.
PROBLEM 4APPLIED
You are rendering a scene with a glazed ceramic vase. In the viewport, the vase appears far too glossy—almost mirror-like—even though the roughness map was painted with mid-range values (around 0.4–0.6) in Substance Painter. The diffuse color looks correct, and the normal map appears to be working. Diagnose the most likely cause and explain the fix.
PROBLEM 5CRITICAL THINKING
A colleague exports a 32-bit EXR diffuse texture from a linear compositing workflow and hands it to you for use in Blender. They tell you to 'just plug it in.' What color space should you assign to this Image Texture node, and why does the answer differ from a standard JPEG diffuse texture? Additionally, explain what would go wrong if you set it to sRGB, and what would go wrong if you set it to Non-Color.

Summary

The Image Texture node is the primary mechanism for bringing raster images into Blender's Shader Editor. Every texture you load requires a deliberate color space assignment. Textures that represent visible color—such as diffuse and emission maps—are set to sRGB so Blender can linearize the values for physically correct light calculations. Textures that encode numerical data—such as roughness, metallic, normal, displacement, and AO maps—must be set to Non-Color to prevent unwanted gamma correction from distorting the data.

The simplified gamma approximation (V_linear ≈ V_sRGB^2.2) explains why incorrect settings produce measurable errors: a roughness of 0.5 becomes 0.217, a displacement of 0.7 drops to 0.457. Normal maps require both Non-Color tagging and routing through a Normal Map node for tangent-space conversion. As you advance, you will extend these principles to OCIO-managed pipelines, EXR linear workflows, and ACES color spaces—but the foundational principle remains the same: always tell Blender what language your image speaks.

Varsity Tutors • Blender • Image Texture Nodes — Add image texture nodes and connect them correctly (color space awareness)