07-06-2021 08:47 AM
I want to submit an app for the Quest. I am using Quest v.1
The submission details asks for 5 screenshots with resolution 2560 x 1440px. Taking screenshots in the game, the images are 1440 x 1440. Should I just slap the banner behind the shots to make up the width? Seems weird to me.
Also the video, not sure about the resolution when I take it in game will be, but the cover image for the trailer asks for 2560 x 1440px. Pretty sure the video won't be that. And that image is basically supposed to be the first frame of the video.
07-14-2021 03:58 AM
I use a script in Unity to take screen shots at the required resolution - doing something like that will result in more professional images on your store page than capturing from inside the headset and adding a banner.
This is the script in case it's helpful to you:
using UnityEngine;
using System.Collections;
public class HighResScreenshot : MonoBehaviour
{
public int resWidth = 2560;
public int resHeight = 1440;
public string filenamePrefix = "screen";
public static string ScreenShotName(string filenamePrefix, int width, int height)
{
return string.Format("{0}/../Screenshots/{4}_{1}x{2}_{3}.png",
Application.dataPath,
width, height,
System.DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss")
, filenamePrefix);
}
private void Awake()
{
#if !UNITY_EDITOR
enabled = false;
#endif
}
void LateUpdate()
{
if(Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown(KeyCode.Joystick1Button5)) {
TakeScreenShot();
}
}
[Sirenix.OdinInspector.Button]
void TakeScreenShot()
{
//Camera Mcamera = Camera.main;
GameObject rig = GameObject.Find("OVRCameraRig");
Transform centreEye = rig != null ? rig.transform.FindChildRecursive("CenterEyeAnchor") : null;
Camera Mcamera = centreEye != null ? centreEye.GetComponentInChildren<Camera>() : Camera.main;
if(Mcamera == null) {
Mcamera = GameObject.FindObjectOfType<Camera>();
}
/*var farRig = GameObject.Find("OVRCameraRigFar");
Camera farCam = farRig != null ? farRig.GetComponentInChildren<Camera>() : null;*/
int rw = resWidth;
int rh = resHeight;
RenderTexture rt = new RenderTexture(rw, rh, 24);
/*if(farCam) {
farCam.targetTexture = rt;
}*/
if(Mcamera) {
Mcamera.targetTexture = rt;
}
Texture2D ss = new Texture2D(rw, rh, TextureFormat.RGB24, false);
//float a = Mcamera.aspect;
//Mcamera.aspect = rw / rh;
GameObject[] disableForSceenshot = GameObject.FindGameObjectsWithTag("RemoveForScreenshot");
bool[] enableGameObject = new bool[disableForSceenshot.Length];
for(int i = 0; i < disableForSceenshot.Length; i++) {
enableGameObject[i] = disableForSceenshot[i].activeSelf;
disableForSceenshot[i].SetActive(false);
}
/*if(farCam) {
farCam.Render();
}*/
if(Mcamera) {
// The near camera doesn't show the 'one draw call' space box - this code changes that just for the screenshot rendering
// Rendering the far cam then the near cam doesn't work - the near cam clears the background to blue.
int zCullingMask = Mcamera.cullingMask;
Mcamera.cullingMask |= LayerMask.GetMask("FarOnly");
float zOldFar = Mcamera.farClipPlane;
Mcamera.farClipPlane = 600000;
Mcamera.Render();
Mcamera.cullingMask = zCullingMask;
Mcamera.farClipPlane = zOldFar;
}
RenderTexture.active = rt;
ss.ReadPixels(new Rect(0, 0, rw, rh), 0, 0);
for(int i = 0; i < disableForSceenshot.Length; i++) {
disableForSceenshot[i].SetActive(enableGameObject[i]);
}
/*if(farCam) {
farCam.targetTexture = null;
}*/
if(Mcamera) {
Mcamera.targetTexture = null;
}
RenderTexture.active = null;
//Mcamera.aspect = a;
Destroy(rt);
byte[] bytes = ss.EncodeToPNG();
string filename = ScreenShotName(filenamePrefix, rw, rh);// "screenshot.png";
System.IO.File.WriteAllBytes(filename, bytes);
Debug.Log(string.Format("Took screenshot to: {0}", filename));
}
}
07-14-2021 10:00 AM
Thanks, appreciated, but I am using Unreal Engine. What I did for now, was just to take screenshots from inside the GUI. I had to scale them up a bit but they look ok.