Search Unity

Typogenic - Advanced Text Rendering [FREE]

Discussion in 'Assets and Asset Store' started by Chman, Jul 2, 2014.

  1. Chman

    Chman

    Unity Technologies

    Joined:
    Feb 6, 2010
    Posts:
    721
    I needed a way to render good quality 3D text at any size so I took a few hours to make a small asset. I figure it could be useful to someone else.

    Introducing Typogenic !


    Typogenic is an easy to use, fast and high-quality 3D text renderer with a low memory footprint. It's based on a well-known technique called "signed-distance field rendering" used in Team Fortress 2 and documented in this Valve paper.

    And it's free.





    It's available on the Asset Store but you can also grab it on GitHub (don't hesitate to fork it an do pull requests !). You can take a look at the online documentation as well (highly recommended).

    Typogenic requires Unity 4.3+ and works with the free version. It's currently untested on mobile devices but I see no reason why it wouldn't work there.

    If you like it don't forget check out my other assets, Colorful and Chromatica ! Feel free to leave any feedback here, I'll monitor this topic.
     
    Last edited: Aug 25, 2014
  2. ZJP

    ZJP

    Joined:
    Jan 22, 2010
    Posts:
    2,649
    Good move. Thanks a lot. :cool:
     
  3. SpookyCat

    SpookyCat

    Joined:
    Jan 25, 2010
    Posts:
    3,765
    What a great system. I have just used your system to show how text can be added to each page in my MegaBook system and it works perfectly. Will be pointing everyone at this great text system.
    megabooktext2.jpg
     
    JohnRossitter and Chman like this.
  4. StarManta

    StarManta

    Joined:
    Oct 23, 2006
    Posts:
    8,775
    One suggestion I would have would be to automatically rebuild the mesh when the text or other values change, instead of forcing me to call the function manually. This would not only make the component easier to use, but would also enable animation of the properties using Unity's animation system. (I'm going to write this anyway, as I need to be able to animate properties for my project. I can post the changed TypogenicText.cs script when I'm done if you guys would like.)
     
  5. StarManta

    StarManta

    Joined:
    Oct 23, 2006
    Posts:
    8,775
    Eh, here it is. All the changes are between lines 72 and 132.
     

    Attached Files:

  6. Chman

    Chman

    Unity Technologies

    Joined:
    Feb 6, 2010
    Posts:
    721
    Indeed, it's on my list of things to do because right know I'm not very happy with the necessity of calling RebuildMesh() manually...

    Ah, you just posted your code (this new forum realtime update thing is nice!). Yeah it's a bit verbose but it does the job. It's too bad Unity can't serialize property fields as using a simple dirty flag would do the trick quite easily...
     
  7. StarManta

    StarManta

    Joined:
    Oct 23, 2006
    Posts:
    8,775
    Yeah, that would be nice. I'll take no offense if you figure out a cleaner way of doing it instead ;)
     
  8. Chman

    Chman

    Unity Technologies

    Joined:
    Feb 6, 2010
    Posts:
    721
    Update 1.1 has been sent to the Asset Store (should be up in a few days) ! In the meantime, you can grab it on Github (simply grab Typogenic.unitypackage).

    Changelog :
    • For some reason, the Asset Store version was in a /Assets/Package/Typogenic subfolder instead of /Assets/Typogenic. This has been fixed and will probably break your Typogenic installation. Sorry for the trouble...
    • Added a Global Color Multiplier to the shaders. It can be used to quickly change the text color or alpha without rebuilding the mesh, which can be useful to do quick animated color or fade effects.
    • RebuildMesh() is now called automatically at the end of the frame if needed (can be disabled by setting AutoRebuild to false, see the doc) which makes it easier to tween / animate each value !
    • Added a quick Set() method on TypogenicText with support for named parameters :
    Code (CSharp):
    1. var component = GetComponent<TypogenicText>();
    2. component.Set(
    3.   text: "Lorem Ipsum",
    4.   alignement: TTextAlignment.Center,
    5.   size: 24f
    6. );
    • Added a public Mesh getter on TypogenicText.
    • Better documentation.
    Enjoy !
     
    StarManta likes this.
  9. abertronski

    abertronski

    Joined:
    Mar 14, 2013
    Posts:
    1
    I will be testing with a mobile app I am working on. Hit a stump with updating, but of course read the documentation and threw in the RebuildMesh() and it works great now, thanks for making!
     
  10. Chman

    Chman

    Unity Technologies

    Joined:
    Feb 6, 2010
    Posts:
    721
    Update 1.2 is available on Github (grab Typogenic.unitypackage) ! I'll send it to the Asset Store asap (1.1 isn't there yet, I don't feel comfortable spamming the Asset Store team with my updates :p).

    Changelog :
    • Glow effect !
    • Support for texturing the text (two different modes).
    • Performance improvement in the editor when editing text materials.
    • Code refactoring : TColorMode is now TFillMode and TypogenicText.ColorMode is now TypogenicText.FillMode, if you use these you'll have to update your scripts, sorry about that.
    That's it for now !
     
    StarManta likes this.
  11. JohnRossitter

    JohnRossitter

    Joined:
    Dec 18, 2013
    Posts:
    1,027
    Great Job!
     
  12. StarManta

    StarManta

    Joined:
    Oct 23, 2006
    Posts:
    8,775
    I have just built my first build with this text system, and the text mesh is displaying the "I have no shader!" bright magenta mesh. I'm guessing it did not include the material or shader file in the build? Have you come across this when testing?
     
  13. Chman

    Chman

    Unity Technologies

    Joined:
    Feb 6, 2010
    Posts:
    721
    Hmm no, it builds fine here, the shader is embedded correctly. As long as the shader and material are referenced in the scene it should work.

    The purple can also mean a shader compilation error. What is your build target / OS ?
     
  14. StarManta

    StarManta

    Joined:
    Oct 23, 2006
    Posts:
    8,775
    iOS. I tested on 1st gen iPad (iOS 5.1) and iPad 4 (iOS 7), same result on both.
     
  15. Chman

    Chman

    Unity Technologies

    Joined:
    Feb 6, 2010
    Posts:
    721
    That's unfortunate :/ Thing is, I don't have the means to test on iOS by myself, I'll try to get to a friend tomorrow and get back to you as soon as I can. It works on Android though, so I'd be surprised if it wouldn't on iOS. Do the demo scenes work on your iPad ?
     
  16. Chman

    Chman

    Unity Technologies

    Joined:
    Feb 6, 2010
    Posts:
    721
    So, I had a chance to test it on iOS (iPhone 4 on iOS 7.1, same A4 chip as the 1st gen iPad), and it works fine...

    - Do the demo scenes work on your devices ?
    - Do you create your material entirely in code ? If so the shaders may not be embedded in the build, just move them into a /Resources/ directory and that should fix it.
    - If there's a shader compilation error you should get some data in the logs. I'm not familiar with Xcode but according to the unity doc :
     
  17. StarManta

    StarManta

    Joined:
    Oct 23, 2006
    Posts:
    8,775
    - Demo scene works
    - The text is not built in code. I've attached a screenshot of the editor showing its configuration.
    - Nothing useful on the device's Console log.
     

    Attached Files:

  18. Chman

    Chman

    Unity Technologies

    Joined:
    Feb 6, 2010
    Posts:
    721
    I have to admit I'm a bit confused right now... Especially if demo scenes do work and the log is empty (speaking of which, make sure you select Development Build).

    What are your player settings for iOS (Edit -> Project Settings -> Player -> iOS tab) ? Mainly, Resolution and Presentation and Other Settings. Not that it would make a difference if demo scenes work but I'm not sure what to look for, so...
     
    Last edited: Jul 8, 2014
  19. gnustoboz

    gnustoboz

    Joined:
    Jun 5, 2013
    Posts:
    2
    Typogenic definitely fits a need I had here. So, in the same spirit of figuring it might be useful to someone else, I've been playing around with it and adding some things, and I thought I should run those changes by Chman and anybody else using Typogenic to see if any of this might be useful.

    The additions I've made can be grouped into three main features:
    1. Shadow casters - I created versions of each of the Typogenic shaders that add a separate shadow caster pass, so the text casts appropriate shadows. These shaders have a Shadow Cutoff setting to fine-tune the shape of the shadow, and I modified the custom material editor to support this setting if present in the selected shader. Outlines cast shadows while glow does not, and the textured versions of the shaders honor transparency in the texture and create matching "holes" in the shadow.
    2. Mixed materials - If multiple materials are added to the Mesh Renderer for the object, the Typogenic text can include simple escape sequences (\0, \1, etc.) to switch between these materials within a single text component.
    3. Clickable - The Typogenic component will react to mouse clicks, and broadcast a message indicating what index of the display text was clicked, e.g. clicking the "p" in "Example" results in an OnGlyphClicked message being broadcast indicating that the character at index 4 was clicked. As part of this functionality, I also modified the TypogenicText object so that anytime the text mesh gets rebuilt, it also looks for BoxColliders attached to the same object, and if found, resizes them to the bounds of the new text mesh so that collider can be used for click detection.
    Here's a screencap of my testing project showing all three of those features in use:



    Obviously there's more work being done under the hood to support this, nothing major but potentially enough to matter on a low-end or mobile device:
    1. The shadow shaders just add a quick fragment shader pass and shouldn't be too bad, but my shader knowledge is still somewhat limited so I wouldn't be surprised if they can be improved. I made new shaders instead of adding shadow support to the existing ones to avoid this performance hit if shadows aren't needed.
    2. The multiple material support just breaks the mesh into submeshes and assigns different materials to them, so the code itself isn't particularly more complex, but the additional materials do add more draw calls.
    3. The clickable text support adds some memory overhead if used on a large block of text since it saves the bounds of each glyph for comparison later, and the hit detection iterates over those bounds so it's very fast on its own but will become slower linearly as the length of the text increases. I tested on some multiple-paragraph samples and it seemed to still work fine but I wouldn't put a whole book in there or anything. This could be refactored to calculate the glyph locations on the fly instead of saving them, if the extra processing overhead is less of a problem than the increased memory footprint, but that could also cause problems with large blocks of text.
    Anyway, Typogenic is much appreciated Chman, and if anybody is interested in any of the above, just let me know.
     
    hopeful and StarManta like this.
  20. Chman

    Chman

    Unity Technologies

    Joined:
    Feb 6, 2010
    Posts:
    721
    This is awesome ! Shadows were on my todo list, so thanks for the hard work ;)

    Any chance you could do a pull request on GitHub so I can review and merge your additions to the official branch ? Or simply upload the source somewhere, I'll merge it. That is, if you're willing to share it :)

    Typogenic could become a nice community effort !
     
    StarManta likes this.
  21. gnustoboz

    gnustoboz

    Joined:
    Jun 5, 2013
    Posts:
    2
    Sure thing, I figured if anybody was interested I'd offer up the source. I'll take another pass over everything tonight to see if I find any remaining bugs, clean everything up, maybe even add some comments to the changes ;) and then I'll send it your way, hopefully tomorrow. If you want to use any/all of it, by all means merge it.
     
    Chman likes this.
  22. Dadaze

    Dadaze

    Joined:
    Sep 21, 2012
    Posts:
    24
    Wow, that is really neat job! I'm really impressed, it's like magic! But I figured you could learn a little from Toolkid2D's TextMesh component for your "// Not the best way to track changes but Unity can't serialize properties".

    I see that each of your text component listen to LateUpdate to check if they must rebuild their mesh. Would it be better that everytime you change something (through a set method), it puts it in the static list of components to be updated. Then have only one kind of static component listen to LateUpdate, then check the list of components that need to be updated, and update them?

    I would gladly pay the asset, but I've been pretty sad to find out that I couldn't use your solution because I can't make my text flash in white or become more transparent because I don't have access to per-instance outline color. I'm talking about my case, but I believe this would be the case of many people out there too, also I really have no idea how shaders work so maybe what I'm about to say is totally invalid.

    I see you have a Global Color multiplier which is on the material and that also changes the color of the outline. As usually I would use one material per type of font (outline and filling), but it is pretty frequent for me to change the overall color of it to make it fade out or flash white. Would it be better to make the border and filling bound the material, then being able to change the overall color (outline and filling) of each instance individually through a color parameter in the component?

    I know that there is much branching in the selection of the type of filling, but using a shader per type of filling could fix it too, even make the textured filling more elegant to use. But I know nothing of shaders so I could be totally wrong on everything I said.
     
  23. StarManta

    StarManta

    Joined:
    Oct 23, 2006
    Posts:
    8,775
    Since I was the one that initially made that change to it, I'll defend it. Unity can't animate properties via get/set methods, unfortunately, and (at least in my use case) I needed it to support animation.
     
  24. Chman

    Chman

    Unity Technologies

    Joined:
    Feb 6, 2010
    Posts:
    721
    Yes except Unity can't serialize properties for obvious reasons (which is what a "get/set" would be), which I need for the editor gui and is required for animation as well. Else I would simply set IsDirty to true on any parameter change and I wouldn't need to test every parameter. Right now it works (and performance wise the hit is so tiny I don't think you'd notice any difference) but I agree, it's not practical and I'll have to refactor it one day.

    The outline has to be defined in the material as it's done in the shader, not on the geometry, so there's no way around that...

    Hmm it makes sense even though I use it the other way :p But you'd loose the ability to apply gradients (directional & quad). Well, gradients could be made in the shader but there would be a performance loss compared to using vertex colors as its doing at the moment.

    Let me think about it, I'll see what I can do :)

    I have some work to do on the face section anyway (right now you can't have a gradient + texture, which I'd like to have, etc).
     
  25. StarManta

    StarManta

    Joined:
    Oct 23, 2006
    Posts:
    8,775
    The script can easily have a property which force-sets the shader's property.
     
  26. Chman

    Chman

    Unity Technologies

    Joined:
    Feb 6, 2010
    Posts:
    721
    Yeah but a shader is tied to a material, so any text using this material would be affected as well, unless I misunderstood what you meant.
     
  27. StarManta

    StarManta

    Joined:
    Oct 23, 2006
    Posts:
    8,775
    If it was set from the script, then using material.whatever would automatically spawn a clone of the material when the property is changed.
     
  28. Dadaze

    Dadaze

    Joined:
    Sep 21, 2012
    Posts:
    24
    Oh ok, so unity has trouble animating these, thanks for the info! Not sure if you have access to Toolkit2D, but I looked into it's text mesh more deeply, and he proceeds with a [System.Serializable] Data class that contains every data of the text field. Getters and setters of the text field change this data. I don't know much, but I know that tk2d works with any type of tweening/animation I've tried yet, and that it works with getters and setters. Of course you'd have to make an Editor script to be able to access these parameters, I don't know how much effort you are willing to put on this, but if you are looking to improve the thing, you could try looking this way ;)

    That is too bad for the gradient performance hit :/ But anyway, only a color parameter that would affect the outline as well as the filling and it would be perfect.
     
  29. Chman

    Chman

    Unity Technologies

    Joined:
    Feb 6, 2010
    Posts:
    721
    Update 1.3 is on GitHub and should be on the Asset Store in a bit.

    Changelog :
    • Shadow casting (thanks to gnustoboz).
    • Mixed materials (thanks to gnustoboz).
    • Advanced click detection (thanks to gnustoboz).
    • New demos to showcase every new feature.
    • Icon for the font assets (easier to spot in the Project tab).
    • More documentation.
     
  30. ZJP

    ZJP

    Joined:
    Jan 22, 2010
    Posts:
    2,649
    Thanks to both of you : Chman & Gnutoboz. :cool::cool:
     
  31. StarManta

    StarManta

    Joined:
    Oct 23, 2006
    Posts:
    8,775
    Bug: the yellow square representing word wrap area does not respond correctly with center- or right-aligned text.

    My quick & dirty fixed version of OnSceneGUI in TypogenicTextEditor.cs:
    Code (csharp):
    1.  
    2.    void OnSceneGUI()
    3. {
    4. TypogenicText src = (TypogenicText)target;
    5.  
    6. if (src.WordWrap > 0f)
    7. {
    8. Vector3 alignmentOffset = Vector3.zero;
    9. if (src.Alignment == TTextAlignment.Center) alignmentOffset = new Vector3(-src.WordWrap * 0.5f, 0f, 0f);
    10. if (src.Alignment == TTextAlignment.Right) alignmentOffset = new Vector3(-src.WordWrap, 0f, 0f);
    11.  
    12. Vector3v1 = src.transform.position + alignmentOffset; //topleft
    13. Vector3v2 = v1 + src.transform.rotation * new Vector3(src.WordWrap, 0f, 0f); //topright
    14. Vector3v3 = v1 + src.transform.rotation * new Vector3(0f, -src.Height, 0f); //bottomleft
    15. Vector3v4 = v3 + src.transform.rotation * new Vector3(src.WordWrap, 0f, 0f); //bottomright
    16. Handles.color = Color.yellow;
    17. Handles.DrawLine(v1, v2);
    18. Handles.DrawLine(v1, v3);
    19. Handles.DrawLine(v4, v3);
    20. Handles.DrawLine(v2, v4);
    21. }
    22. }
    Update: It also appears to not respond correctly to transform.scale changes; haven't fixed this yet.
     
    Last edited: Aug 11, 2014
    Chman likes this.
  32. Chman

    Chman

    Unity Technologies

    Joined:
    Feb 6, 2010
    Posts:
    721
  33. StarManta

    StarManta

    Joined:
    Oct 23, 2006
    Posts:
    8,775
    Just noticed the box also doesn't respond correctly to transform.scale changes.
     
  34. StarManta

    StarManta

    Joined:
    Oct 23, 2006
    Posts:
    8,775
    Recommended convenience function:
    Code (csharp):
    1.  
    2.    public Color SingleColor {
    3. set {
    4. FillMode = TFillMode.SingleColor;
    5. ColorTopLeft = value;
    6. }
    7. }
    8.  
    Took me a few minutes to figure out how I was supposed to change the color via script.
     
  35. Chman

    Chman

    Unity Technologies

    Joined:
    Feb 6, 2010
    Posts:
    721
    Fixed.

    There's a paragraph about that in the doc ;)
     
  36. StarManta

    StarManta

    Joined:
    Oct 23, 2006
    Posts:
    8,775
    Who reads those?
     
  37. StarManta

    StarManta

    Joined:
    Oct 23, 2006
    Posts:
    8,775
    If I'm reading the fix correctly - wouldn't that only apply the immediate transform's scale? What if the parent is scaled?

    Why not simply use src.transform.TransformPoint on the four corners?
     
  38. Chman

    Chman

    Unity Technologies

    Joined:
    Feb 6, 2010
    Posts:
    721
    Indeed, stupid me.
    Fixed.
     
    StarManta likes this.
  39. thylaxene

    thylaxene

    Joined:
    Oct 10, 2005
    Posts:
    716
    Does the "Typogenic/Unlit Font" shader work on devices? I'm building to iPad and the shader errors out during the build process.

    I getting this error:
    Shader compiler: internal error compiling shader snippet type=0 platform=9: Error polling external process
    Shader compiler: internal error compiling shader snippet type=0 platform=5: Error polling external process
    Shader error in 'Typogenic/Unlit Font': Internal error communicating with the shader compiler process

    Am I missing something? Yes I'm shader challenged. ;-)
     
  40. StarManta

    StarManta

    Joined:
    Oct 23, 2006
    Posts:
    8,775
    I'm using that shader on iPad, iPhone, and at least one Android device without issue.
     
  41. Chman

    Chman

    Unity Technologies

    Joined:
    Feb 6, 2010
    Posts:
    721
    This is an I/O error unrelated to Typogenic. Something's gone wrong with Unity's shader compiler process on your computer. Maybe try to restart Unity, see if it goes away ?
     
  42. Pameton

    Pameton

    Joined:
    Aug 8, 2014
    Posts:
    2
    It's weird, it did just follow your tutorial on your website but instead of my text i do have pink squares...
    any idea ?
     

    Attached Files:

  43. Chman

    Chman

    Unity Technologies

    Joined:
    Feb 6, 2010
    Posts:
    721
    Drag'n'drop the font material on your game object :)

    Edit: indeed, i need to fix the doc, it´s not clear enough...
     
    Last edited: Aug 23, 2014
  44. Pameton

    Pameton

    Joined:
    Aug 8, 2014
    Posts:
    2
    works fine, thank you^^
     
  45. Kybernetik

    Kybernetik

    Joined:
    Jan 3, 2013
    Posts:
    2,570
    Thanks for the great tool. I reviewed it 5 stars on the asset store.

    Improvement suggestions:

    1. The documentation should have a word document and/or PDF version because opening index.html in the editor makes it open the code in visual studio rather than the actual web page, so you have to open the folder in explorer then open the file.

    2. The font creation window should try to figure out the name of the texture or font file, based on whichever one you give it (since they are saved by littera with the same name). Also, the doc should tell you to create the font using Right Click->Create instead of Assets->Create because the former creates the font in the folder where you right clicked instead of in your root assets folder.

    3. TypogenicText.AutoRebuild should be exposed by the custom editor so that you can have static text in a scene that doesn't need to keep checking for rebuilds.

    Some bugs:

    4. The text never seems to be aligned properly, so I've had to use arbitrary position offsets everywhere.
    - Left alignment has the text start a little to the right of the game object's position.
    - Center alignment isn't centered, it is off to the right a bit.
    - Right alignment has the object's position near the middle of the last letter instead of at its right edge.
    Vertical alignment options would also be nice.

    5. When building for android, it throws a warning about OnMouseUpAsButton saying that it might impact performance on handheld devices. I haven't looked into how your letter targeting thing works (because I have no use for it), but I think it should just be a public method that my scripts could call to check any screen or world position rather than something that automatically triggers on any mouse input for every text object in the scene.

    6. Because you're setting HideFlags.HideAndDontSave on the mesh and recreating it in OnEnable, every time unity recompiles the scripts (because I'm editing them as I make the game), it drops the previous mesh and creates a new one. This works fine, but creating the new mesh causes unity to treat the current scene as modified. So if I save the scene, change a script, then go back to unity and try to load a different scene, it asks if I want to save the current one even though I haven't done anything since I last saved it. I think it would work fine if you don't set the hide flags and just let unity save the mesh as part of the scene. My next suggestion should help to ensure that the mesh gets rebuilt when it needs to so that you don't have to do so in OnEnable. You might not even need [ExecuteInEditMode] on the class at all since the properties and custom editor would handle everything (you might, I don't know).

    And some optimizations:

    7. I have a potential solution for the serialization problem:
    - Use private fields for everything: "m_text, m_size, etc". This stops other scripts from directly accessing things.
    - Give each field the [SerializedProperty] attribute. This makes unity serialize them as if they were public.
    - Make a public property for each field that sets an isDirty bool whenever the property is changed.
    - Now you don't have to check heaps of things each frame to know if the text is dirty and you don't have to have a second copy of every variable.

    8. You could replace your OnDisable method with:
    #if UNITY_EDITOR
    void OnDisable()
    {
    GetComponent<MeshFilter>().mesh = null;
    DestroyImmediate(m_Mesh);
    }
    #endif
    This means that the OnDisable method won't even exist outside the editor, so unity doesn't have to waste time calling it and checking if it is the editor or not.

    9. Instead of using an isDirty bool, you could use the MonoBehaviour.enabled property.
    - Replace the current OnEnable with Awake, since awake gets called only once and doesn't care if the object is enabled or not. Awake doesn't need to rebuild the mesh because LateUpdate will.
    - Replace OnDisable with OnDestroy.
    - Those two changes mean that disabling and enabling the TypogenicText component will no longer hide and show the text. But that's fine, because you can do that by disabling and enabling the MeshRenderer anyway.
    - Whenever any of the properties are changed (the ones I suggested in number 5 above), you set enabled = true.
    - Now that the component is enabled, LateUpdate will get called. So it can just check if autoRebuild is true to rebuild the mesh. Then it can set enabled = false because it doesn't need to check again next frame unless something gets changed again.
     
  46. Chman

    Chman

    Unity Technologies

    Joined:
    Feb 6, 2010
    Posts:
    721
    Thanks a lot for the massive feedback ! At the moment I'm a bit low on free time but I keep this post at hand for the next update and will take each of your points under consideration.
     
  47. WishesMachine

    WishesMachine

    Joined:
    Aug 3, 2014
    Posts:
    10
    Hello.First i want to thank you for sharing this great tool.
    I am using Typogenic in my game. It is working great but on Samsung 10 inch tablets ,fonts have some display problems.

    Do you have any idea ,what can cause this?
     
  48. Chman

    Chman

    Unity Technologies

    Joined:
    Feb 6, 2010
    Posts:
    721
    What is the problem exactly in this case ? The character spacing ? The diagonal lines ?
     
  49. WishesMachine

    WishesMachine

    Joined:
    Aug 3, 2014
    Posts:
    10
    That black diagonal lines.Like it is outlining mesh renderer.That lines should not appears normally.
     
  50. Chman

    Chman

    Unity Technologies

    Joined:
    Feb 6, 2010
    Posts:
    721
    Indeed. It only happens on the Samsung 10" ? How's your material setup ?