[/b][/callout] [section]Project Setup[/section] [list] [*][b]Enable OpenXR[/b] - (Project / Project settings / XR / OpenXR) and enable stereo shaders (Project / Project settings / XR / Shaders) [*][b]OpenXR Vendors Plugin[/b] - Optionally install the [url=https://godotengine.org/asset-library/asset/3768]Godot OpenXR vendors plugin[/url] from the AssetLib tab. …
[section]Foveated Rendering[/section] Steam Frame supports the Foveated Rendering functionality in Godot via the [url=https://godotvr.github.io/godot_openxr_vendors/]OpenXR Vendors Plugin[/url] (or releases [url=https://github.com/GodotVR/godot_openxr_vendors/releases]here[/url]). [callout]Version 4.2.x is needed for vendor extension support including foveated rendering. 4.2.3 is the minimum version with Linux Arm64 support. 5.x or newer recommended.…
[section=supported_languages]Supported Languages[/section] For a full list of supported languages and their associated API language code, please see [doclink=store/localization/languages][/doclink] [section]Working With Translation Vendors[/section] There are many great translation companies around the world that specialize in translating gaming content. As you consider your options for who to work with for translating your game content, there are a few things to consider: [list] [*][b] Determine your target languages[/b] - Some companies are known to focus or be strong with certain regions’ languages than others. [*] [b]Compare price sheets to know how expensive services are. …
Is it text heavy/lore heavy/easy to relate to globally? This can impact which translation vendor may be better suited for particular languages. [*] [b]Ask for a deck or list of games that a vendor has worked on and ask them exactly what work they did on those games.…
[/list] [/list] [/list] [b]Example Response:[/b] [code=json] { "response": { "result": "OK", "params": { "count": 4, "orders": [ { "orderid": "1233", "transid": "1234567890123456788", "steamid": "76561197972751825", "status": "PartialRefund", "currency": "USD", "time": "2024-01-23T18:30:00Z", "country": "US", "usstate": "WA", "timecreated": "2024-01-23T18:15:00Z", "items": [ { "itemid": 100, "qty": 1, "amount": 99, "vat": 9, "itemstatus": "Refunded" }, { "itemid": 101, "qty": 1, "amount": 1299, "vat": 116, "itemstatus": "Succeeded" } ] }, { "orderid": "1234", "transid": "1234567890123456789", "steamid": "76561197972751825", "status": "Failed", "currency": "USD", "time": "2024-01-23T18:40:30Z", "country": "US", "usstate": "WA", "timecreated": "2024-01-23T18:39:00Z", "items": [ { "itemid": 100, "qty": 1, "amount": 99, "vat": 9, "itemstatus": "Failed" } ] }, { "orderid": "1235", "transid": "1234567890123456790", "steamid": "76561197972751825", "status": "Succeeded", "currency": "USD", "time": "2024-01-23T18:40:40Z", "country": "US", "usstate": "WA", "timecreated": "2024-01-23T18:39:30Z", "items": [ { "itemid": 101, "qty": 1, "amount": 1299, "vat": 116, "itemstatus": "Succeeded" } ] }, { "orderid": "1236", "transid": "1234567890123456791", "steamid": "76561197972751825", "status": "Chargedback", "currency": "USD", "time": "2024-01-23T19:55:00Z", "country": "US", "usstate": "WA", "timecreated": "2024-01-23T18:40:00Z", "items": [ { "itemid": 102, "qty": 1, "amount": 999, "vat": 89, "itemstatus": "Chargedback" } ] } ] } } } [/code] [section=GetUserAgreementInfo]GetUserAgreementInfo[/section] [code=http]GET https://partner.steam-api.com/ISteamMicroTxn/GetUserAgreementInfo/v2/[/code] [table] [tr][th]Name[/th][th]Type[/th][th]Required[/th][th]Description[/th][/tr] [tr] [td][b]key[/b][/td][td]string[/td] [td]✔[/td] [td]Steamworks Web API [url=https://partner.steamgames.com/doc/webapi_overview/auth#publisher-keys]publisher key[/url] with [b]Microtransaction[/b] permissions.…
[/list] [/list] [/list] [b]Example Response:[/b] [code=xml] <response> <result>OK</result> <params> <state>WA</state> <country>US</country> <currency>USD</currency> </params> </response> [/code] [section=InitTxn]InitTxn[/section] [code=http]POST https://partner.steam-api.com/ISteamMicroTxn/InitTxn/v3/[/code] [table] [tr][th]Name[/th][th]Type[/th][th]Required[/th][th]Description[/th][/tr] [tr] [td][b]key[/b][/td][td]string[/td] [td]✔[/td] [td]Steamworks Web API [url=https://partner.steamgames.com/doc/webapi_overview/auth#publisher-keys]publisher key[/url] with [b]Microtransaction[/b] permissions.…
Try automating it using the Automated Steam Wrapper process documented above. [b]Q. An Anti-virus vendor has detected my binary as having a virus after applying the Steam DRM wrapper. What can I do?[/b] [b]A.[/b] False positives like this can happen, as the DRM injection process is modifying your binary in the same way a virus might do. Feel free to contact the vendor, or use the API instead of the Steam DRM wrapper. …
Some examples of additional content that could be delivered as DLC include: [list] [*]Expansions [*]New maps or levels [*]Additional characters [/list] DLC could be used for supplemental content that does not show up in-game such as [list] [*]Artbooks or wallpapers [/list] [doclink=store/application/soundtrackapp][/doclink] are handled with a special type of App ID that's different from DLC. …
[section]Overview[/section] OpenVR is an API and runtime that allows access to VR hardware from multiple vendors without requiring that applications have specific knowledge of the hardware they are targeting. This repository on GitHub is an SDK that contains the API and samples. …
If your solution currently isn't working, please reach out to both your vendor and Valve for support. [*]Anti-tamper / DRM: In general we don't recommend use of such solutions across any PC platforms, as they may impact disk usage and overall performance. …
To diagnose overlay crashes with DirectX for example, try to determine how D3D got into a bad state by using the d3d debug runtime with all (info/warning/error/notice) level spew turned on. It might give some hints to orphaned d3d resources. …
If you do meet the requirements and it's still not showing up, make sure you're launching the app through the Steam client, either directly from the lobby/quick launch list, or by calling [api]steam_api::SteamAPI_RestartAppIfNecessary[/api]. [h4]Q. My game is using D3D12 on Win7, and the Steam overlay is not working. Why?[/h4] [b]A.[/b] Please refer to this [url=https://microsoft.github.io/DirectX-Specs/d3d/D3D12onWin7.html#add-support-to-d3d11on12]Microsoft document[/url] on how to add Steam overlay support. …
[subsection]Common Build Problems[/subsection] [list] [*] [b]Cannot open include file: 'd3d9.h'[/b] If you encounter this error it means that your systems include path does not include the D3D include path, or that you have not installed the D3D SDK. …
If you copy your compiled binary to another machine you may need to install the D3D redistributables to obtain the same version of D3D9X that you compiled against on your development machine. [/list] [section]Code Overview[/section] Once you have the [b]Spacewar!…
[table] [tr] [td]OpenVR (Depth-assisted reprojection)[/td] [td][url=https://github.com/ValveSoftware/openvr/wiki/IVRCompositor::Submit]IVRCompositor::Submit[/url] with [url=https://github.com/ValveSoftware/openvr/blob/v2.15.6/headers/openvr.h#L191]VRTextureWithPoseAndDepth_t[/url][/td] [/tr] [tr] [td]OpenVR (Depth+Motion-assisted reprojection)[/td] [td][url=https://github.com/ValveSoftware/openvr/wiki/IVRCompositor::Submit]IVRCompositor::Submit[/url] with [url=https://github.com/ValveSoftware/openvr/blob/v2.15.6/headers/openvr.h#L202]VRTextureWithMotion_t[/url][/td] [/tr] [tr] [td]OpenXR (Depth-assisted reprojection)[/td] [td][url=https://registry.khronos.org/OpenXR/specs/1.0/man/html/XR_KHR_composition_layer_depth.html]XR_KHR_composition_layer_depth[/url][/td] [/tr] [tr] [td]OpenXR (Depth+Motion-assisted reprojection) Vendor-agnostic[/td] [td][url=https://registry.khronos.org/OpenXR/specs/1.1/man/html/XR_EXT_frame_synthesis.html]XR_EXT_frame_synthesis[/url][/td] [/tr] [tr] [td]OpenXR (Depth+Motion-assisted reprojection) Oculus[/td] [td][url=https://registry.khronos.org/OpenXR/specs/1.0/man/html/XR_FB_space_warp.html]XR_FB_space_warp[/url][/td] [/tr] [/table] You can visualize the depth or motion vectors submitted by using the [doclink=steamframe/debugging#GameTextures]Draw Performance Assessment Game Textures in Headset[/doclink] option. …
.) [*][b]Video/Audio Codecs[/b]: We recommend using standalone codecs (eg., VP9 or AV1) rather than codecs that are tied to a specific vendor (eg., WMF). [/list] [subsection]Game Features[/subsection] [list] [*][b]Clouded Saves[/b]: For games that allow saving, we recommend enabling automatic clouding of saved games: users should be able to save their game on a Deck or Steam Machine and resume on a different PC, and vice versa, without manually transferring files. …
[/callout] [section]Eye Tracking[/section] Our current support for eye tracking in Unity uses the Eye Gaze Interaction feature. There’s examples of using this in the [url=https://docs.unity3d.com/Packages/com.unity.xr.interaction.toolkit@3.1/manual/index.html]XR Interaction Toolkit samples[/url]. You can learn more about the feature here: [url=https://docs.unity3d.com/Packages/com.unity.xr.openxr@1.0/manual/features/eyegazeinteraction.html]Eye Gaze Interaction | OpenXR Plugin | 1.0.3[/url] [section]Notes[/section] [list] [*][b]Unity Profiler[/b] - Once adb is connected the Unity Profiler should be able to connect as well. [*][b]Android Logcat[/b] - The Android Logcat package found in the Unity Registry section of the Package Manager should work once adb is connected. This gives you nice filtered logs from your game. [url=https://docs.unity3d.com/Packages/com.unity.mobile.android-logcat@0.1/manual/index.html]See the Unity documentation[/url] [*][b]Multiple HMDs[/b] - Disconnect other HMDs, (such as Quest), from your USB while building and debugging. …
[docimg=2019-09-18_16-41-17.png]2019-09-18_16-41-17.png[/docimg] [subsection=sketchfab]Sketchfab[/subsection] It is possible to share awesome 3D models that the development team or that your community have created in a way that is easily explorable by your fan. We use a service called Sketchfab to host the models and to render them into the browser for people to explore. …
[code] https://sketchfab.com/models/<model id> https://sketchfab.com/models/7b08add6fb40478a9bc465a8ef0d8ffb [/code] That would automatically generate a summary block about the 3D model in the event description. This summary includes the items name and authors name. [docimg=2020-03-05_17-48-05.png]2020-03-05_17-48-05.png[/docimg] Then when a user clicks on the summary it will expand into an interactive 3D item explorer. …
[section]Localized Image Management[/section] If you are uploading images that contain text, you can now easily manage localized version of those images all together in an image group. [docimg=b10a3f4768ef3d833c7922d6981fa5f7df4ecbe8.png]b10a3f4768ef3d833c7922d6981fa5f7df4ecbe8.png[/docimg] This gives you one single entry in your list of images and a quick menu option to edit the group. …
Steam Audio offers a wide variety of features, including: [subsection]Overview[/subsection] [list] [*] [b]Render 3D positional audio.[/b] Steam Audio binaurally renders direct sound using HRTFs to accurately model the direction of a sound source relative to the listener. Users can get an impression of the height of the source, as well as whether the source is in front of or behind them. [*] [b]Render 3D audio for Ambisonic content.[/b] Steam Audio can also spatialize Ambisonics audio clips, rotating them based on the listener’s orientation in the virtual world. …
[url=https://steamcommunity.com/games/250820/announcements/detail/1256913672017157095]Read the launch announcement for SteamVR Home here[/url] [subsection]SteamVR Collectibles[/subsection] SteamVR Collectibles are 3D items granted to players based on ownership and playtime of VR games. Developers can create custom items that will drop to players to be used as decoration in SteamVR Home environments. …
The Tag Wizard helps you create a tag profile which includes: [list] [*] [b]Genres[/b], with particular attention to the most specific Genre or Sub-Genre [list] [*] Example: [i]Super Meat Boy[/i] can most specifically be described as a Precision Platformer [*][b]Super-Genre[/b]: Action [*][b]Genre[/b]: Platformer [*][b]Sub-Genre[/b]: Precision Platformer [/list] [*] [b]Visual properties[/b], such as [list] [*] [b]Dimensions[/b]: 2D, 2.5D, 3D [*] [b]Camera Perspective[/b]: Third-Person, First-Person, Top-Down, Isometric, Side-Scroller, etc. [*] [b]Visual Style[/b]: Pixel Graphics, Realistic, Abstract, Anime, Cute, Stylized, Minimalist, etc. …
You can remove any tags you find unwanted ("family friendly" for a horror game) or inaccurate ("2D" for a 3D game). [subsection]Tag page visibility[/subsection] The top 20 tags on your game determine the tag pages and similar browse views that your game can appear on. …
If the latter, you'll need some help from Valve to get this set up, so please [url=https://help.steampowered.com/en/wizard/Login?redir=%2Fen%2Fwizard%2FHelpWithPublishing%3Fissueid%3D903&title=Sign+in]contact Valve[/url] if this is the case. [*][h4]If my game is published by a different company, how do I create a new Steamworks account without creating a new app and paying the app fee?…
PowerFormId=1b290fb6-bf33-4529-b6b4-0c05174271f7&env=na1&acct=8eb740d5-3d42-42a7-b032-df44d160f47f&v=2]commercial/government use license[/url]. A PDF copy for your prior review can be downloaded [docfile=2023STEAMVRCOMMERCIALINSTALLATIONLICENSE.pdf]here[/docfile]. …
= (UINT)-1 && GetRawInputDeviceInfoA( devices[i].hDevice, RIDI_DEVICENAME, devName, &nameSize ) != (UINT)-1 ) { if ( rdi.hid.dwVendorId == VALVE_DIRECTINPUT_GAMEPAD_VID && rdi.hid.dwProductId == VALVE_DIRECTINPUT_GAMEPAD_PID ) { uint32 ulVID = strtoul( &devName[STEAM_INPUT_VID_INDEX], NULL, 16 ); uint32 ulPID = strtoul( &devName[STEAM_INPUT_PID_INDEX], NULL, 16 ); uint64 ulDeviceHandle = strtoull( &devName[STEAM_INPUT_SIAPI_HANDLE_INDEX], NULL, 16 ); uint32 unGamepadIndex = strtoul( &devName[STEAM_INPUT_GAMEPAD_INDEX], NULL, 16 ); Log( "Raw input device: VID = 0x%x, PID = 0x%x, handle = 0x%llx, index = 0x%x, %s\n", ulVID, ulPID, ulDeviceHandle, unGamepadIndex, devName ); // You can now use either the VID/PID to identify the device directly or use ulDeviceHandle with GetInputTypeForHandle ESteamInputType inputType = SteamInput()->GetInputTypeForHandle( ulDeviceHandle ); switch( inputType ) { case k_ESteamInputType_Unknown: printf( "unknown!…