HDR Skybox Creation: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
m (Setting bug notice hidetested=1 param on page where the bug might not need tested in param specified)
 
(91 intermediate revisions by 27 users not shown)
Line 1: Line 1:
[[Image:Ldrvshdr.jpg|thumb|200px|A Low Dynamic sky, compared to the same sky in High Dynamic.]]
{{LanguageBar}}


An LDR (Low Dynamic Range) skybox is made up of six 24-bit [[TGA|targa (.tga)]] images (front, left, back, right, up, and down). This format does not contain enough information to look good when adjusted by large exposure values, and will not produce high contrast lightmaps and reflections. An [[HDR]] (High Dynamic Range) skybox is a 32-bit floating-point format, saved out from an application that supports HDR as a .[[PFM]] file. This format contains the multiple exposure information required for exposure adjustments, high contrast lightmaps, and reflections.
[[File:Skybox ldr hdr.jpg|thumb|250px|HDR skyboxes (left) benefit from a wider range of brightness values.]]


{{note|The examples in this document assume you are creating an HDR skybox for Day of Defeat: Source. For other games, substitute the <code>day of defeat source/dod</code> in directory locations for the appropriate game directory of the game you are creating the skybox for (e.g. <code>hl2</code> or <code>hl2dm</code>). Currently, HDR is only supported in [[Day of Defeat: Source]], [[Counter-Strike: Source]], [[Half-Life 2: Episode 1]] and [[Half-Life 2: Lost Coast]]}}
{{Tutorial Skill Level|skill=2}}


You should have a basic understanding of the [[material]] system and creating Source materials to use this information.
Unlike most textures in a game, a [[skybox]] typically represents a collection of very large and very bright objects. This makes the need for [[high dynamic range]] imaging far more pressing.


== Understanding the Sky at different exposures ==
[[VTF]] textures used for HDR skyboxes store their colors either lightly compressed in 16-bit [[Float|floating point]] (RGBA16161616f) or heavily compressed as 8-bit [[integer]] values (BGRA8888). In either case, they are created by [[Vtex (Source 1)|VTEX]] from uncompressed 32-bit floating point Portable Float Map (.pfm) files.


[[Image:hdr_sky_reference.jpg|thumb|250px|An example of photos of the sky at various exposures. Click to enlarge.]]
{{tip|Uncompressed HDR VTFs can be converted back PFMs by [[VTF2TGA|vtf2tga]] (despite the name).<br>Compressed HDR VTFs can be decompressed to EXRs by {{no_vtf|3.1}}.}}
{{todo|Create {{src2}} version of this page's information}}


Before creating a HDR skybox we need to know what the sky looks like at different exposures. The following images are a series of photos taken of the sky at different exposures. As you can see the sun is still bright even at the camera's fastest shutter speed&#8230;1/4000<sup>th</sup> of a second.<br style="clear:both">
== Creating PFMs ==
=== Creating Proper PFMs With Photoshop ===
Creating HDR PFMs is very easy, but the way of doing this is not stated anywhere:


== Create your base skybox ==
#Obtain a common format HDR file, like .hdr or .exr (the most popular one). It could have any bit-depth you like: both 16 and 32 bit should work fine.
#Import it to Photoshop (Adobe srgb 1998 or REC709 should work fine) and make sure that the Photoshop file is set to 32/16 bit-depth (Image --> Mode --> 32 Bits/Channel OR 16 Bits/Channel).
#Go to File --> Save As...* or Press {{Key|Ctrl|Shift|S}} (or {{Key|Alt|Ctrl|S}}).
#From the dropdown of available formats choose "Portable Bit Map", change the .pbm in the file name to .pfm and click "Save" . You now have a proper .pfm file for further use with VTEX.
{{Warning|There's a thing called "Endianess" or "Byte order", for VTEX to properly convert your 16/32 bit HDR files it has to be set to little endian, not big endian. (This doesn't seem to apply to 8 bit non-hdr files, like .png, .jpg, .tga and so on).
{{tip|To set the endianness when converting using ImageMagick, use the {{code|-endian LSB}} parameter.}}}}
{{Note|* - On newer version of {{Photoshop|3.1}} (since 2021), you need to click "Save a Copy..." instead. However you can change the "Save As..." behavior back to previous version of Photoshop by going to {{code|Preferences > File Handling >}} ''check'' "{{code|'''Enable legacy "Save As"'''}}".}}


First you need to create the base .TGA files that make your skybox cube. This is done using the same method as standard (LDR) skyboxes. See [[Skybox (2D)|Skybox (2D)]] for information on how to create base skybox materials.
{{tip|[[File:Skybox half.jpg|thumb|240px|Half the size, all of the (actually visible) image]] Since the lower halves of skybox sides generally aren't seen, it's often wise to cut away that area. For this trick to work, you must compile the side VTFs with these extra commands:


== Organize the skybox images into a single file ==
<source lang=php>
clamps 1
clampt 1
</source>


[[Image:hdr_skybox_sides.jpg|thumb|250px|An example skybox with labels for each side of the cube. Click to enlarge.]]
And add this command to the materials:


Once you've made the base skybox images, use your image editing software to assemble the separate six .TGA sides into one large single .TGA file, as shown in this sample image. For demonstration purposes, text was inserted into this image to show which piece of the skybox should go into each position. If you add this text yourself, it will show up in-game when the skybox is compiled.
<source lang=cpp>
$basetexturetransform "center 0 0 scale 1 2 rotate 0 translate 0 0"
</source>


The SDK includes this sample skybox. The .TGA files can be found in: <code>sdk_content\dod\materialsrc\skybox\sdk_sky_example_hdr.tga</code>
See [[#Creating the materials]] for details on how to use the commands.
<br style="clear:both">


== Edit and Save an HDR skybox ==
Additionally, an unseen bottom skybox face can be made a single color and a small resolution, such as 4x4.
}}


The following will demonstrate the basic steps for painting a "sun" effect into the different exposures and saving the file as a .PFM. We'll use HDR Shop for this demonstration. The HDR Shop program can be downloaded from [http://gl.ict.usc.edu/HDRShop/ www.hdrshop.com]. After it is installed, launch the application, and then open the above .TGA you created above.
=== Skies at different exposures ===


When this window appears leave the default settings and Select '''OK''''.
Before creating a HDR skybox we need to know what the sky looks like at different exposures:


[[Image:hdrshop_curvedialog.png]]
[[File:hdr_sky_reference.jpg|700px|center|Photos of the sky at various exposures.]]


[[Image:hdrshop_adjustedsky.jpg|thumb|250px|The skybox after the response curve has been adjusted in HDR Shop. Click to enlarge.]]
As you can see, the captured image changes as the exposure is altered. A single 8-bit image could never be used to create those effects: at 8-bit white is white, and the sun would only stand out if it was literally a different colour from the rest of the sky.


To paint the 'sun' into the skybox you must first choose an exposure to edit. The '+' and '-' keys are used to adjust the image exposure up and down. The lower right hand corner of the screen indicates the exposure level, '+0.00 stops' indicates the base exposure level that was imported into HDR Shop. Adjust the exposure level so it reads '-3.00 stops' Then, go to the menu: File -> Edit in [[image editor]]. The image-editing program you have associated with .BMP format will automatically open up this file as <code>HDRShopTEMP.bmp</code> Now paint the sun into this file.
=== Create a Base Skybox ===
First you need to create a basic skybox cube, as you would for an LDR skybox. See [[Skybox (2D)]].  


When finished save the image and return to HDR Shop.<br style="clear:both">
With your images ready, arrange them in one large file as seen below. This step is required only if you are using the [[splitskybox]] tool. If you aren't then you are quite free to handle each texture separately.


After clicking '''OK''' in this dialog, the current exposure level will be updated with the image that was just painted with the image-editing program.
[[File:hdr_skybox_sides.jpg|center|Recommended skybox layout (labelled)]]
 
Save this assembled image as a TGA file. If you are prompted, do ''not'' use RLE compression and ''do'' place the origin at the bottom left.
 
=== Adding HDR Data ===
The following will demonstrate the basic steps for painting a "sun" effect into the different exposures and saving the file as a [[PFM]]. We'll use [https://vgl.ict.usc.edu/HDRShop HDR Shop] for this demonstration.
 
{{warning|HDR Shop is free for non-commercial use, but commercial usage requires a pricey license. You will have to search the internet for the freeware version.}}
 
After it is installed, launch the application, and then open the above [[TGA]] you created above. When this window appears leave the default settings and Select '''OK''''.
 
[[File:hdrshop_curvedialog.png]]
 
[[File:hdrshop_adjustedsky.jpg|thumb|250px|The skybox after the response curve has been adjusted in HDR Shop. Click to enlarge.]]


[[Image:hdrshop_OKdialog.png]]
HDR Shop works by taking files created by other [[Image Manipulation Programs|image editors]] for different exposures and merging them together at 32-bit floating point. To paint the "sun" into the skybox you must first choose an exposure to edit. The {{key|+}} and {{key|-}} keys are used to adjust the image exposure up and down. The lower right hand corner of the screen indicates the exposure level, {{code|+0.00 stops}} indicates the base exposure level that was imported into HDR Shop. Adjust the exposure level so it reads {{code|-3.00 stops}} Then, go to the menu: {{code|File -> Edit in Image Editor}}. The [[image editor|image-editing program]] you have associated with [[BMP]] format will automatically open up this file as a 24-bit {{file|HDRShopTEMP|bmp}}. Now paint the sun into this file.


[[Image:hdrshop_saveas.png|right]]
When finished save the image and return to HDR Shop.{{clr}}


Try adjusting the exposure up and down in HDR Shop with the '+' and '-' keys and you'll see that the sun is now integrated into the other exposures. Continue editing the different exposures until the desired result is achieved. It will be a good idea to spend some time emulating the blown-out effects around the sun and the highlights on the clouds as seen in the photographic reference.
After clicking '''OK''' in this dialog, the current exposure level will be updated with the image that was just painted with the image-editing program.


When finished go to the '''File''' menu and choose '''Save as&#8230;''' and Select '''Portable Floatmap (.PFM)''' Save this file into your materialsrc content directory (e.g. <code>sdk_content\dod\materialsrc\skybox</code>).<br style="clear:both">
[[File:hdrshop_OKdialog.png]]


== Creating the auxiliary skybox files ==
[[File:hdrshop_saveas.png|right|150px]]
'''Note* The method descibed in the next step of this tutorial doesnt work, To achive finishing a HDR skybox for Source you must render out individual skyboxes as .pfm files as the splitskybox.exe does not function.'''


The next stage is to create all the auxiliary skybox files: separate .PFM, .TXT, and .VMT files. A new application called <code>splitskybox.exe</code> was created to split the single .PFM skybox into the six separate files needed by the Source Engine. Copy a shortcut of the <code>Splitskybox.bat</code> (located in the <code>sourcesdk\bin\</code> directory) onto your desktop, then drag the .PFM file onto this shortcut.
Try adjusting the exposure up and down in HDR Shop with the {{key|+}} and {{key|-}} keys and you'll see that the sun is now integrated into the other exposures. Continue editing the different exposures until the desired result is achieved. It will be a good idea to spend some time emulating the blown-out effects around the sun and the highlights on the clouds as seen in the photographic reference.


When finished go to the {{code|File}} menu and choose {{code|Save as&#8230;}} and Select {{code|Portable Floatmap (.PFM)}} Save this file into your {{path|materialsrc}} content directory (e.g. {{path|steamapps\common\[[Day of Defeat: Source|Day of Defeat Source]]\dod\materialsrc\skybox}}).


Which should give you output similar to this:
{{note|There is a more detailed tutorial [https://web.archive.org/web/20130514222309/http://gl.ict.usc.edu/HDRShop/tutorial/tutorial07.php available on HDR Shop's website].}}{{clr}}


<pre>
==== {{mono|sdk_sky_exampleup}} ====
splitskybox.exe "C:\Program Files\Steam\SteamApps\username\sourcesdk_content\dod\materialsrc\skybox\sdk_sky_example_hdr.pfm"


filename: C:\Program Files\Steam\SteamApps\username\sourcesdk_content\dod\materialsrc\skybox\sdk_sky_example_hdrft.pfm
[[File:Sdk sky exampleup.jpg|right|thumb|200px|sdk_sky_exampleup]]
filename: C:\Program Files\Steam\SteamApps\username\sourcesdk_content\dod\materialsrc\skybox\sdk_sky_example_hdrlf.pfm
filename: C:\Program Files\Steam\SteamApps\username\sourcesdk_content\dod\materialsrc\skybox\sdk_sky_example_hdrbk.pfm
filename: C:\Program Files\Steam\SteamApps\username\sourcesdk_content\dod\materialsrc\skybox\sdk_sky_example_hdrrt.pfm
filename: C:\Program Files\Steam\SteamApps\username\sourcesdk_content\dod\materialsrc\skybox\sdk_sky_example_hdrup.pfm
filename: C:\Program Files\Steam\SteamApps\username\sourcesdk_content\dod\materialsrc\skybox\sdk_sky_example_hdrdn.pfm
Press any key to continue . . .
</pre>


When finished the content directory (e.g. <code>sdk_content\dod\materialsrc\skybox</code>) will include six new files based one the same name but appended with (ft, lf, bk, rt, up, and dn) this designates the different directions of the skybox (front, left, back, right, up, and down).
Let's do this with {{file|sourcesdk_content\dod\materialsrc\skybox\sdk_sky_exampleup|tga}}. Open it up and adjust the exposure to -3 stops, then edit the image externally. Now paint in a sun.


Next, create six new .TXT files based on the new file names in the same directory. These .TXT files tell the Source Engine that the skybox is a .PFM file for compression reasons, and that the base exposure level matches '+0.00' in HDR Shop. If needed you can adjust the "pfmscale" so the base level is either higher or lower, but it is recommended to author skybox textures for a scale of 1.
After returning to HDR Shop and OKing the dialogue, the current exposure level will be updated with the image that you just painted.


With Notepad or another [[text editor]], create these files:
Try adjusting the exposure up and down and you'll see that the sun is now integrated into the other exposures as well. Continue editing the different exposures until the desired result is achieved. It will be a good idea to spend some time emulating the blown-out effects around the sun and the highlights on the clouds as seen in the photographic reference.{{clr}}
* sdk_sky_example_hdr'''ft'''.txt
* sdk_sky_example_hdr'''lf'''.txt
* sdk_sky_example_hdr'''bk'''.txt
* sdk_sky_example_hdr'''rt'''.txt
* sdk_sky_example_hdr'''up'''.txt
* sdk_sky_example_hdr'''dn'''.txt


With the following text in each file:
=== Split the Skybox ===
<pre>
If you created your skyboxes in a single file as in the above image, you will need to use {{code|splitskybox.exe}} to split it into six. Just drag the PFM onto it.
"pfm" "1"
"pfmscale" "1"
</pre>


Then, create six new .vmt files in the Game Directory (e.g. <code>day&nbsp;of&nbsp;defeat&nbsp;source\dod\materials\skybox</code>) and enter the following into each.
{{note|[[splitskybox]] Ep1 does not currently function. However, the OB version will work with either version of the engine.}}
{{note|In {{l4d2|4}}, Splitskybox is not a required step. And in fact will not work without lots of retyping of suffixes of multiple files. ''Left 4 Dead 2'''s iteration of [[Vtex (Source 1)|VTEX]] is able to take your "T" image array (both tga into LDR and pfm into HDR) and process it directly into the proper <name_bk>vtf format. In order to do this, create your "T" array as above. Recommended simply for the sake of sanity to get proper orientation for the top (and bottom if needed) images in your custom skybox. Create your txt file as normal and drag it onto Left 4 Dead 2's Vtex. Create materials and use in game as normal. A caveat here is, although the vtf files are compiled properly for LDR, if you are opting out of an HDR skybox and plan to use a LDR skybox only, the supplied LDR material template in the [[Skybox (2D)]] tutorial does not work. You will get the checkerboard pattern.
If you are trying to import an HDR skybox (meaning, if you rendered out a set of skybox textures in your external software, and then used HDRShop to create the hdr data) of a night sky, you will experience extreme banding in the darker areas which resemble dx compression. This banding is actually a result of the way HDRShop handles color information and can be observed directly in HDRShop if you adjust down the exposure and inspect your image.}}


{{note|The file names should all match depending upon the skybox side. These .VMT files are the same from standard, non-HDR Source skyboxes except that there is now a <code>$hdrbasetexture</code> field for HDR. The standard <code>$basetexture</code> field is used for the LDR skybox fallback.}}
== Creating the Materials ==
At this stage you should have six files:


* sdk_sky_example_hdr'''ft'''.vmt
*{{file|<skyname>_hdr'''ft'''|pfm}}
<pre>
*{{file|<skyname>_hdr'''lf'''|pfm}}
"sky"
*{{file|<skyname>_hdr'''bk'''|pfm}}
{
*{{file|<skyname>_hdr'''rt'''|pfm}}
    "$hdrbaseTexture" "skybox/sdk_sky_example_hdrft"
*{{file|<skyname>_hdr'''up'''|pfm}}
    "$nofog" "1"
*{{file|<skyname>_hdr'''dn'''|pfm}}
    "$ignorez" "1"
    "$basetexture" "skybox/sdk_sky_exampleft"
}
</pre>


* sdk_sky_example_hdr'''lf'''.vmt
Make sure they are under {{path|your_mod\materialsrc\skybox\}}. You now need to create '''six corresponding TXT files''' (e.g. {{file|<nowiki><skyname>_hdrft</nowiki>|txt}}) alongside them, in order to compile to VTF. Each must contain:
<pre>
"sky"
{
    "$hdrbaseTexture" "skybox/sdk_sky_example_hdrlf"
    "$nofog" "1"
    "$ignorez" "1"
    "$basetexture" "skybox/sdk_sky_examplelf"
}
</pre>


* sdk_sky_example_hdr'''bk'''.vmt
<source lang=php>
<pre>
pfm 1 // tells vtex to load a a .pfm file instead of a .tga file
"sky"
pfmscale 1 // brightness multiplier
{
nonice 1 // prevent seams appearing at low texture detail
    "$hdrbaseTexture" "skybox/sdk_sky_example_hdrbk"
skybox 1 // alternative to nonice, if NICE filtering is desired
    "$nofog" "1"
nocompress 1 // optional; removing halves file size, but causes color banding under close inspection
    "$ignorez" "1"
</source>
    "$basetexture" "skybox/sdk_sky_examplebk"
}
</pre>


* sdk_sky_example_hdr'''rt'''.vmt
Drag these text files onto VTEX and it will compile them (unfortunately [[VTFEdit]] doesn't import PFMs, nor properly handle other formats when HDR). The VTFs will appear in the corresponding materials subfolder (e.g., {{file|your_mod\materials\skybox\}}).
<pre>
"sky"
{
    "$hdrbaseTexture" "skybox/sdk_sky_example_hdrrt"
    "$nofog" "1"
    "$ignorez" "1"
    "$basetexture" "skybox/sdk_sky_examplert"
}
</pre>


* sdk_sky_example_hdr'''up'''.vmt
Now you just need to '''create six VMTs named {{file|<nowiki><skyname>_hdr<face></nowiki>|vmt}}'''. These should read:
<pre>
"sky"
{
    "$hdrbaseTexture" "skybox/sdk_sky_example_hdrup"
    "$nofog" "1"
    "$ignorez" "1"
    "$basetexture" "skybox/sdk_sky_example_01up"
}
</pre>


* sdk_sky_example_hdr'''dn'''.vmt
<source lang=cpp>
<pre>
Sky
"sky"
{
{
    "$hdrbaseTexture" "skybox/sdk_sky_example_hdrdn"
// if you compiled with nocompress:
    "$nofog" "1"
$hdrbasetexture "skybox/sdk_sky_example_hdrft"
    "$ignorez" "1"
    "$basetexture" "skybox/sdk_sky_exampledn"
}
</pre>


== Creating LDR fallbacks ==
// if you didn't:
$hdrcompressedtexture "skybox/sdk_sky_example_hdrft"


The LDR fallback for the skybox will be based on the original six .TGA files that were used to create the HDR version.
// LDR fallback
 
$basetexture "skybox/sdk_sky_exampleft"
Go ahead and save these six files into your content directory (e.g. <code>sdk_content\dod\materialsrc\skybox</code>):
}
* sdk_sky_example'''ft'''.tga
</source>
* sdk_sky_example'''lf'''.tga
{{bug|hidetested=1|If an {{code|$hdrbasetexture}} or an {{code|$hdrcompressedtexture}} is not specified, the skybox will appear as missing texture with HDR enabled. If you don't have an HDR version of the skybox you can use the LDR version as a {{code|$hdrbasetexture}}.}}
* sdk_sky_example'''bk'''.tga
* sdk_sky_example'''rt'''.tga
* sdk_sky_example'''up'''.tga
* sdk_sky_example'''dn'''.tga


Create these text files into the same directory (just like standard LDR skybox [[Material Creation|materials]]):
=== Creating LDR Fallbacks ===
* sdk_sky_example'''ft'''.txt
{{tip|{{l4d2|since}} LDR fallbacks aren't necessary for games that are normally HDR-only.}}
* sdk_sky_example'''lf'''.txt
You must also create standard dynamic range VTFs (LDR fallbacks) for users who do not play in HDR. Compile with these settings:
* sdk_sky_example'''bk'''.txt
* sdk_sky_example'''rt'''.txt
* sdk_sky_example'''up'''.txt
* sdk_sky_example'''dn'''.txt


With the following text in each file:
<source lang=php>
<pre>
nonice 1
"dxt5" "1"
dxt5 1 // or nocompress
"skybox" "1"
</source>
</pre>
{{clarify|Why is DXT5 necessary? Skyboxes aren't translucent, so shouldn't DXT1 be sufficient? The LDR skyboxes in {{hls}} are BGR888, with no alpha channel. The "hint DXT5" flag may be sufficient, if that even does anything.}}


== Compiling the skybox ==
These are ordinary textures, so you can use [[VTFEdit]] if you prefer. There is no need to create new materials for LDR users; they will load the {{code|_hdr}} ones.


The final stage is to compile all these files so they can be used in the engine. Copy a shortcut of the <code>[[Vtex|vtex.exe]]</code> (from the <code>sourcesdk\bin\</code> directory) onto your desktop, then drag the following .TGA and .PFM files onto this shortcut. For a full description of how to compile textures, see [[Vtex]].
=== Additional creation notes ===
{{modernImportant|To avoid seams appearing at the edges of skies, open the resulting VTFs in {{vtfedit|4}}, then add the Clamp S + Clamp T flags and/or the "no mipmaps" flag. For compressed LDR skyboxes, use the "hint DXT5" flag.}}
{{tip|If an LDR fallback is present, the HDR skybox is compressed, and mipmaps are disabled, then open the compressed HDR skybox in VTFEdit, export as TGA, and reimport the exported images back into VTFEdit with mipmaps disabled. This will remove mipmaps from the file, saving a significant amount of space. {{note|This does not work properly for uncompressed HDR, as VTFLib doesn't properly handle import and export of HDR formats. Additionally, mipmaps should be left in the LDR fallback, so that the skybox materials display correctly in Hammer's texture browser.}} }}


* sdk_sky_example_hdr'''ft'''.pfm
== Usage ==
* sdk_sky_example_hdr'''lf'''.pfm
In {{hammer4|4.1}}, go to ''Main Menu > Map > Map Properties > Skybox Texture Name'' and type the name of your skybox, relative to {{path|materials\skybox\}} and without any of the face suffixes. (e.g., {{code|mysky_hdr}} if the VMTs are {{file|materials\skybox\mysky_hdrXX|vmt}}.)
* sdk_sky_example_hdr'''bk'''.pfm
* sdk_sky_example_hdr'''rt'''.pfm
* sdk_sky_example_hdr'''up'''.pfm
* sdk_sky_example_hdr'''dn'''.pfm


* sdk_sky_example'''ft'''.tga
If there is an underscore before the face names, then these must be included as well (ex: {{code|mysky_hdr_}} if the VMTs are {{file|materials\skybox\mysky_hdr_XX|vmt}}.)
* sdk_sky_example'''lf'''.tga
* sdk_sky_example'''bk'''.tga
* sdk_sky_example'''rt'''.tga
* sdk_sky_example'''up'''.tga
* sdk_sky_example'''dn'''.tga


If all went well, there should be 12 new .VTF files in your Game directory (e.g. <code>day&nbsp;of&nbsp;defeat&nbsp;source\dod\materials\skybox</code>) for a HDR skybox with a LDR fallback.
{{note|Skybox selection is based on the VMT names, not the VTF names. Multiple faces of the same skybox can share a VTF, provided they have separate VMTs, and multiple skyboxes can use the same VTFs.}}
{{bug|hidetested=1|Skyboxes may fail to load if placed in a subfolder of {{path|materials\skybox\}}; use a prefix if organization is necessary.}}


== See also ==
== See also ==
* [[HDR Lighting Basics]] - How to add basic HDR lighting effects.
* [[HDR Lighting Basics]] - How to add basic HDR lighting effects.
* [[HDR Lighting Settings]] - Information on customizing HDR lighting settings.
* [[HDR Lighting Settings]] - Information on customizing HDR lighting settings.
* [[Skybox (2D)|Skybox (2D)]]
* [[Sky (shader)]]
* [[Skybox (2D)]]
* [[Sky Writer]] - 3ds Max tool that renders your scene into PFM and compiles to VTF.
* [[Material]]
* [[Material]]
{{envart}}
{{envart}}
 
[[Category:HDR]][[Category:Material System]]
[[Category:Material System]]

Latest revision as of 07:12, 20 May 2025

English (en)Русский (ru)Translate (Translate)
HDR skyboxes (left) benefit from a wider range of brightness values.


Skill Level

This tutorial expects you to have this amount of knowledge within the topic to follow along smoothly.

Novice Familiar Competent Proficient Expert


Unlike most textures in a game, a skybox typically represents a collection of very large and very bright objects. This makes the need for high dynamic range imaging far more pressing.

VTF textures used for HDR skyboxes store their colors either lightly compressed in 16-bit floating point (RGBA16161616f) or heavily compressed as 8-bit integer values (BGRA8888). In either case, they are created by VTEX from uncompressed 32-bit floating point Portable Float Map (.pfm) files.

Tip.pngTip:Uncompressed HDR VTFs can be converted back PFMs by vtf2tga (despite the name).
Compressed HDR VTFs can be decompressed to EXRs by no_vtf.
Todo: Create Source 2 version of this page's information

Creating PFMs

Creating Proper PFMs With Photoshop

Creating HDR PFMs is very easy, but the way of doing this is not stated anywhere:

  1. Obtain a common format HDR file, like .hdr or .exr (the most popular one). It could have any bit-depth you like: both 16 and 32 bit should work fine.
  2. Import it to Photoshop (Adobe srgb 1998 or REC709 should work fine) and make sure that the Photoshop file is set to 32/16 bit-depth (Image --> Mode --> 32 Bits/Channel OR 16 Bits/Channel).
  3. Go to File --> Save As...* or Press Ctrl+ Shift+S (or Alt+Ctrl+S).
  4. From the dropdown of available formats choose "Portable Bit Map", change the .pbm in the file name to .pfm and click "Save" . You now have a proper .pfm file for further use with VTEX.
Warning.pngWarning:There's a thing called "Endianess" or "Byte order", for VTEX to properly convert your 16/32 bit HDR files it has to be set to little endian, not big endian. (This doesn't seem to apply to 8 bit non-hdr files, like .png, .jpg, .tga and so on).
Tip.pngTip:To set the endianness when converting using ImageMagick, use the -endian LSB parameter.
Note.pngNote:* - On newer version of Adobe Photoshop (since 2021), you need to click "Save a Copy..." instead. However you can change the "Save As..." behavior back to previous version of Photoshop by going to Preferences > File Handling > check "Enable legacy "Save As"".
Tip.pngTip:
Half the size, all of the (actually visible) image
Since the lower halves of skybox sides generally aren't seen, it's often wise to cut away that area. For this trick to work, you must compile the side VTFs with these extra commands:
clamps 1
clampt 1

And add this command to the materials:

$basetexturetransform "center 0 0 scale 1 2 rotate 0 translate 0 0"

See #Creating the materials for details on how to use the commands.

Additionally, an unseen bottom skybox face can be made a single color and a small resolution, such as 4x4.

Skies at different exposures

Before creating a HDR skybox we need to know what the sky looks like at different exposures:

Photos of the sky at various exposures.

As you can see, the captured image changes as the exposure is altered. A single 8-bit image could never be used to create those effects: at 8-bit white is white, and the sun would only stand out if it was literally a different colour from the rest of the sky.

Create a Base Skybox

First you need to create a basic skybox cube, as you would for an LDR skybox. See Skybox (2D).

With your images ready, arrange them in one large file as seen below. This step is required only if you are using the splitskybox tool. If you aren't then you are quite free to handle each texture separately.

Recommended skybox layout (labelled)

Save this assembled image as a TGA file. If you are prompted, do not use RLE compression and do place the origin at the bottom left.

Adding HDR Data

The following will demonstrate the basic steps for painting a "sun" effect into the different exposures and saving the file as a PFM. We'll use HDR Shop for this demonstration.

Warning.pngWarning:HDR Shop is free for non-commercial use, but commercial usage requires a pricey license. You will have to search the internet for the freeware version.

After it is installed, launch the application, and then open the above TGA you created above. When this window appears leave the default settings and Select OK'.

Hdrshop curvedialog.png

The skybox after the response curve has been adjusted in HDR Shop. Click to enlarge.

HDR Shop works by taking files created by other image editors for different exposures and merging them together at 32-bit floating point. To paint the "sun" into the skybox you must first choose an exposure to edit. The + and - keys are used to adjust the image exposure up and down. The lower right hand corner of the screen indicates the exposure level, +0.00 stops indicates the base exposure level that was imported into HDR Shop. Adjust the exposure level so it reads -3.00 stops Then, go to the menu: File -> Edit in Image Editor. The image-editing program you have associated with BMP format will automatically open up this file as a 24-bit 🖿HDRShopTEMP.bmp. Now paint the sun into this file.

When finished save the image and return to HDR Shop.

After clicking OK in this dialog, the current exposure level will be updated with the image that was just painted with the image-editing program.

Hdrshop OKdialog.png

Hdrshop saveas.png

Try adjusting the exposure up and down in HDR Shop with the + and - keys and you'll see that the sun is now integrated into the other exposures. Continue editing the different exposures until the desired result is achieved. It will be a good idea to spend some time emulating the blown-out effects around the sun and the highlights on the clouds as seen in the photographic reference.

When finished go to the File menu and choose Save as… and Select Portable Floatmap (.PFM) Save this file into your 🖿materialsrc content directory (e.g. 🖿steamapps\common\Day of Defeat Source\dod\materialsrc\skybox).

Note.pngNote:There is a more detailed tutorial available on HDR Shop's website.

sdk_sky_exampleup

sdk_sky_exampleup

Let's do this with 🖿sourcesdk_content\dod\materialsrc\skybox\sdk_sky_exampleup.tga. Open it up and adjust the exposure to -3 stops, then edit the image externally. Now paint in a sun.

After returning to HDR Shop and OKing the dialogue, the current exposure level will be updated with the image that you just painted.

Try adjusting the exposure up and down and you'll see that the sun is now integrated into the other exposures as well. Continue editing the different exposures until the desired result is achieved. It will be a good idea to spend some time emulating the blown-out effects around the sun and the highlights on the clouds as seen in the photographic reference.

Split the Skybox

If you created your skyboxes in a single file as in the above image, you will need to use splitskybox.exe to split it into six. Just drag the PFM onto it.

Note.pngNote:splitskybox Ep1 does not currently function. However, the OB version will work with either version of the engine.
Note.pngNote:In Left 4 Dead 2 Left 4 Dead 2, Splitskybox is not a required step. And in fact will not work without lots of retyping of suffixes of multiple files. Left 4 Dead 2's iteration of VTEX is able to take your "T" image array (both tga into LDR and pfm into HDR) and process it directly into the proper <name_bk>vtf format. In order to do this, create your "T" array as above. Recommended simply for the sake of sanity to get proper orientation for the top (and bottom if needed) images in your custom skybox. Create your txt file as normal and drag it onto Left 4 Dead 2's Vtex. Create materials and use in game as normal. A caveat here is, although the vtf files are compiled properly for LDR, if you are opting out of an HDR skybox and plan to use a LDR skybox only, the supplied LDR material template in the Skybox (2D) tutorial does not work. You will get the checkerboard pattern. If you are trying to import an HDR skybox (meaning, if you rendered out a set of skybox textures in your external software, and then used HDRShop to create the hdr data) of a night sky, you will experience extreme banding in the darker areas which resemble dx compression. This banding is actually a result of the way HDRShop handles color information and can be observed directly in HDRShop if you adjust down the exposure and inspect your image.

Creating the Materials

At this stage you should have six files:

  • 🖿<skyname>_hdrft.pfm
  • 🖿<skyname>_hdrlf.pfm
  • 🖿<skyname>_hdrbk.pfm
  • 🖿<skyname>_hdrrt.pfm
  • 🖿<skyname>_hdrup.pfm
  • 🖿<skyname>_hdrdn.pfm

Make sure they are under 🖿your_mod\materialsrc\skybox\. You now need to create six corresponding TXT files (e.g. 🖿<skyname>_hdrft.txt) alongside them, in order to compile to VTF. Each must contain:

pfm 1 // tells vtex to load a a .pfm file instead of a .tga file
pfmscale 1 // brightness multiplier
nonice 1 // prevent seams appearing at low texture detail
skybox 1 // alternative to nonice, if NICE filtering is desired
nocompress 1 // optional; removing halves file size, but causes color banding under close inspection

Drag these text files onto VTEX and it will compile them (unfortunately VTFEdit doesn't import PFMs, nor properly handle other formats when HDR). The VTFs will appear in the corresponding materials subfolder (e.g., 🖿your_mod\materials\skybox\).

Now you just need to create six VMTs named 🖿<skyname>_hdr<face>.vmt. These should read:

Sky
{
	// if you compiled with nocompress:
	$hdrbasetexture		"skybox/sdk_sky_example_hdrft"

	// if you didn't:
	$hdrcompressedtexture	"skybox/sdk_sky_example_hdrft"

	// LDR fallback
	$basetexture		"skybox/sdk_sky_exampleft"
}
Icon-Bug.pngBug:If an $hdrbasetexture or an $hdrcompressedtexture is not specified, the skybox will appear as missing texture with HDR enabled. If you don't have an HDR version of the skybox you can use the LDR version as a $hdrbasetexture.

Creating LDR Fallbacks

Tip.pngTip:(in all games since Left 4 Dead 2) LDR fallbacks aren't necessary for games that are normally HDR-only.

You must also create standard dynamic range VTFs (LDR fallbacks) for users who do not play in HDR. Compile with these settings:

nonice 1
dxt5 1 // or nocompress
Clarify: Why is DXT5 necessary? Skyboxes aren't translucent, so shouldn't DXT1 be sufficient? The LDR skyboxes in Half-Life: Source are BGR888, with no alpha channel. The "hint DXT5" flag may be sufficient, if that even does anything.

These are ordinary textures, so you can use VTFEdit if you prefer. There is no need to create new materials for LDR users; they will load the _hdr ones.

Additional creation notes

Icon-Important.pngImportant:To avoid seams appearing at the edges of skies, open the resulting VTFs in VTFEdit VTFEdit, then add the Clamp S + Clamp T flags and/or the "no mipmaps" flag. For compressed LDR skyboxes, use the "hint DXT5" flag.
Tip.pngTip:If an LDR fallback is present, the HDR skybox is compressed, and mipmaps are disabled, then open the compressed HDR skybox in VTFEdit, export as TGA, and reimport the exported images back into VTFEdit with mipmaps disabled. This will remove mipmaps from the file, saving a significant amount of space.
Note.pngNote:This does not work properly for uncompressed HDR, as VTFLib doesn't properly handle import and export of HDR formats. Additionally, mipmaps should be left in the LDR fallback, so that the skybox materials display correctly in Hammer's texture browser.

Usage

In Hammer Hammer 4.x, go to Main Menu > Map > Map Properties > Skybox Texture Name and type the name of your skybox, relative to 🖿materials\skybox\ and without any of the face suffixes. (e.g., mysky_hdr if the VMTs are 🖿materials\skybox\mysky_hdrXX.vmt.)

If there is an underscore before the face names, then these must be included as well (ex: mysky_hdr_ if the VMTs are 🖿materials\skybox\mysky_hdr_XX.vmt.)

Note.pngNote:Skybox selection is based on the VMT names, not the VTF names. Multiple faces of the same skybox can share a VTF, provided they have separate VMTs, and multiple skyboxes can use the same VTFs.
Icon-Bug.pngBug:Skyboxes may fail to load if placed in a subfolder of 🖿materials\skybox\; use a prefix if organization is necessary.

See also

Environment articles:
Skies and environment maps Source Source: Skybox (2D)Skybox (3D)HDR SkiesSkybox with TerragenSkybox with Terragen - AdvancedList of skies


Source 2 Source 2: Skybox (3D)

Terrain and displacement mapping DisplacementsCreating Holes in DisplacementsDigital Elevation ModelsCreating custom terrain with Worldmachine