WinCNT

Texture를 PNG파일로 저장하기 본문

Unity/Unity 관련

Texture를 PNG파일로 저장하기

WinCNT_SSS 2023. 3. 23. 10:59

서론

일종의 Baking Tool과 같은 스트립트를 만들고 있다

물론 방법은 1도 몰랐기 때문에 조사해가면서 진행 중인데,

알게 된 내용 하나씩 정리해보려고 한다

 

우선은 Texture를 PNG파일로 저장에 대해서다!


Texture를 PNG파일로 저장

뭐가 되었든 최종적으로는 Texture를 PNG파일로 저장하는 마무리가 필요할 것이다

다행히도 이 부분은 인터넷에 레퍼런스가 많았다

 

핵심 키워드는 Graphics.Blit와 Texture2D의 ReadPixels()과 EncodeToPNG()인 것 같다

실험삼아 만들어 본 함수는 다음과 같다

private void SaveBakeResultToTexture()
{
    RenderTexture buffer = new RenderTexture(
        textureSize, 
        textureSize, 
        0,                         // No depth/stencil buffer
        RenderTextureFormat.ARGB32,     // Standard colour format
        RenderTextureReadWrite.Linear   // No sRGB conversions
    );
		
    // (머테리얼의) 셰이더를 사용하여 원본 텍스처를 대상 렌더링 텍스처로 복사한
    Graphics.Blit(texture, buffer, bakeMaterial);

    // 현재 Render Target에 Render Texture를 설정한다(Graphics.SetRenderTarget과 같음)
    RenderTexture.active = buffer;

    Texture2D outputTex = new Texture2D(textureSize, textureSize, TextureFormat.ARGB32, false);    
    // 현재 Render Target(Screen, 혹은 RenderTexture)에서 픽셀을 읽고 Texture2D에 쓴다
    outputTex.ReadPixels(
        new Rect(0, 0, textureSize, textureSize),
        0, 0, // Write starting at the top-left texel
        false // No mipmaps
    );

    var pngByte = outputTex.EncodeToPNG();

    string filePath = directoryPath + "/" + fileName + ".png";
    
    File.WriteAllBytes(filePath, pngByte);

    //clean up variables
    RenderTexture.active = null;
    DestroyImmediate(outputTex);
}

결과

위의 함수를 이용해서 만든 스크립트이다

지정한 텍스처를 지정한 매테리얼(의 셰이더)을 통한 결과를 png로 저장한다

(포스트 프로세스 같은 느낌)

 

참고로 지정한 텍스처는 다음과 같다(유니티짱의 텍스처)

Gary 매테리얼의 프래그먼트 셰이더의 는 다음과 같다

half4 frag(Varyings IN) : SV_Target
{
    half4 finalColor = 0.0;
    
    half4 color = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, IN.uv);
    color.rgb = pow(color.rgb, 1/2.2);  // Gamma Correction
    finalColor.rgb = dot(color.rgb, float3(0.3, 0.59, 0.11));
    finalColor.a = 1.0f;
    
    return finalColor;
}

실행하면 다음과 같이 그레이 스케일이 적용된 파일이 생성된다


마무리

다음으로는 스크립트에서 텍스처 맵을 만드는 방법을 생각해보자…


참고 사이트

Unity Texture를 PNG 파일로 저장하기

 

Unity Texture를 PNG 파일로 저장하기

해당 포스팅은 말 그대로 Texture를 PNG 파일로 저장하는 방법이다. Texture를 PNG로 변환하려면 ...

blog.naver.com

How to write from shader to a texture to a PNG in Unity?

 

How to write from shader to a texture to a PNG in Unity?

I want to write the information from my shader into a texture and save it in a png. I found this: http://forum-old.unity3d.com/threads/save-texture-generated-by-a-shader.326561/ and this System...

gamedev.stackexchange.com

unity_script_texture2d_save_png_file - FreeStyleWiki

 

unity_script_texture2d_save_png_file - FreeStyleWiki

「Texture2Dをpngに変換」の処理の後、そのままファイルに保存します。 pngに変換するにはTexture2DのTextureFormatが RGBA32/ARGB32/RGB24、である必要があります。 ファイル保存時に、ファイルダイアロ

ft-lab.ne.jp

Baking Shaders into Textures

 

Baking Shaders into Textures

Calculating everything ony the fly in the shader gives us the most flexibility and is even needed for many effects, but if we don’t need the noise to be dynamic we can save it to a texture to save a lot of performance in the shader. You can bake all shad

www.ronja-tutorials.com