• Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by D.Gavilan · Feb 22, 2012 at 07:10 AM · texturegraphics

Texture2D looks blank in after using ReadPixels, but it's not when saved

I am trying to replace a texture in a GameObject with a custom one. The new texture looks blank, but if I save it to disk and load that image into the GameObject, then it works fine. I want to avoid that saving step, because I'm not sure I'm allowed to do that in mobile platforms...

Here's what I did:

  • I created a class that it does not inherit from MonoBehaviour.

  • The class has a Texture2D member _texture.

  • The class has a method that uses a custom shader to draw something on a RenderTexture.

  • I use ReadPixels to copy the contents of this RenderTexture to _texture.

The method does something like this:

 public void myFunction() {
    WWW _texLoader = new WWW("file://"+Application.dataPath+"sometexture.png");
    Texture2D source = new Texture2D(W, H, TextureFormat.ARGB32, false);
    _texLoader.LoadImageIntoTexture(source);
    RenderTexture rTexture = RenderTexture.GetTemporary(W, H, 0, RenderTextureFormat.ARGB32 );
    Material material = new Material(Shader.Find("MyMaterial"));
    Graphics.Blit(source, rTexture, material);
    // activate rTexture as current render target, so ReadPixels reads from it
    RenderTexture.active = rTexture ;
    Rect sourceRect = new Rect(0,0,W,H);
    _texture.ReadPixels(sourceRect, 0, 0);
    // go back to main context
    RenderTexture.active = null ;
    RenderTexture.ReleaseTemporary(rTexture);  
 }
 public Texture2D GetTexture() {
    return _texture;
 }

After that, the image is set somewhere else to a GameObject using GetTexture(), but it looks blank. However, if I apply the function below, then it works.

 public Texture2D GetAnotherTexture() {
     Texture2D texture = new Texture2D(W, H, TextureFormat.ARGB32, false);
     texture.LoadImage(File.ReadAllBytes(GetMyPath()));
     return texture ;
 }

I have tried the things below, but nothing seems to work:

  • Making _texture static

  • Waiting 1 frame before setting the texture to the GameObject

Do I have to WaitForEndOfFrame()? I am writing to my own RenderTarget with RenderTexture.active, right? So I guess it should work (it actually works, since the saved image is fine...) I guess it has something to do with the state of the Texture2D image, but I can't find any help in the documentation. Any suggestions? Thanks in advance.

Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

1 Reply

· Add your reply
  • Sort: 
avatar image
0

Answer by D.Gavilan · Feb 22, 2012 at 03:35 PM

I just realized that the problem is that I should call _texture.Apply() after reading the pixels... orz. I thought that the default behavior of ReadPixels is that automatically calls Apply. Also, since saving works, I was convinced that the pixels "were there"...

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Welcome to Unity Answers

If you’re new to Unity Answers, please check our User Guide to help you navigate through our website and refer to our FAQ for more information.

Before posting, make sure to check out our Knowledge Base for commonly asked Unity questions.

Check our Moderator Guidelines if you’re a new moderator and want to work together in an effort to improve Unity Answers and support our users.

Follow this Question

Answers Answers and Comments

5 People are following this question.

avatar image avatar image avatar image avatar image avatar image

Related Questions

EPIC GIANT TEXTURE - possible? 3 Answers

Copying Textures and transparency. 0 Answers

is using OnPostRender to draw textures Pro only? 3 Answers

Tracing in Unity3D 2 Answers

Problem with graphics after restarting a unity application 0 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges