Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • 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 /
  • Help Room /
avatar image
0
Question by skowronski · Jan 17, 2018 at 02:10 PM · c#shadervrshader programming

Outline Shader in VR

Hi,

I have a problem with implementing an outline shader (based on this tutorial: https://willweissman.wordpress.com/tutorials/shaders/unity-shaderlab-object-outlines/) in VR.

When running the game without an attached Vive, everything displays correctly:

alt text

As you can see the block in the front is correctly outlined.

When I run it in VR, two things happen:

1) When I look at the selected object I see the outline twice 2) If I look away from the object, I see the outline only once, but at the wrong position.

This seems to be due to the shader being performed twice (maybe only on the screen space) and therefore not correctly displaying the shader in VR. Can anyone clarify? Here's my sample code:

Script attached to the camera:

 using UnityEngine;
 using System.Collections;
  
 public class PostEffect : MonoBehaviour 
 {
     Camera AttachedCamera;
     public Shader Post_Outline;
     public Shader DrawSimple;
     Camera TempCam;
     Material Post_Mat;
  
  
     void Start () 
     {
         AttachedCamera = GetComponent<Camera>();
         TempCam = new GameObject().AddComponent<Camera>();
         TempCam.enabled = false;
         Post_Mat = new Material(Post_Outline);
     }
  
     void OnRenderImage(RenderTexture source, RenderTexture destination)
     {
         //set up a temporary camera
         TempCam.CopyFrom(AttachedCamera);
         TempCam.clearFlags = CameraClearFlags.Color;
         TempCam.backgroundColor = Color.black;
  
         //cull any layer that isn't the outline
         TempCam.cullingMask = 1 << LayerMask.NameToLayer("Outline");
  
         //make the temporary rendertexture
         RenderTexture TempRT = new RenderTexture(source.width, source.height, 0, RenderTextureFormat.ARGB32);
  
         //put it to video memory
         TempRT.Create();
  
         //set the camera's target texture when rendering
         TempCam.targetTexture = TempRT;
          
         //flip the camera, since VR image is somehow upside down
         TempCam.ResetWorldToCameraMatrix();
         TempCam.ResetProjectionMatrix();
         TempCam.projectionMatrix = TempCam.projectionMatrix * Matrix4x4.Scale(new Vector3(1, -1, 1));
 
         //render all objects this camera can render, but with our custom shader.
         TempCam.RenderWithShader(DrawSimple,"");
 
         Graphics.Blit(source, destination);
  
         //copy the temporary RT to the final image
         Graphics.Blit(TempRT, destination, Post_Mat);
  
         //release the temporary RT
         TempRT.Release();
     }
  
 }

Shader that renders selected objects in white:

 //This shader goes on the objects themselves. It just draws the object as white, and has the "Outline" tag.
  
 Shader "Custom/DrawSimple"
 {
     SubShader 
     {
         ZWrite Off
         ZTest Always
         Lighting Off
         Pass
         {
             CGPROGRAM
             #pragma vertex VShader
             #pragma fragment FShader
  
             struct VertexToFragment
             {
                 float4 pos:POSITION;
             };
  
             //just get the position correct
             VertexToFragment VShader(VertexToFragment i)
             {
                 VertexToFragment o;
                 o.pos=UnityObjectToClipPos(i.pos);
                 return o;
             }
  
             //return white
             fixed4 FShader():COLOR0
             {
                 return fixed4(1,1,1,1);
             }
  
             ENDCG
         }
     }
 }


Post-Processing shader that does the actual outline:

 Shader "Custom/Post Outline"
 {
     Properties
     {
         _MainTex("Main Texture",2D)="white"{}
     }
     SubShader 
     {
     Blend SrcAlpha OneMinusSrcAlpha
         Pass 
         {
             CGPROGRAM
      
             sampler2D _MainTex;
  
             //<SamplerName>_TexelSize is a float2 that says how much screen space a texel occupies.
             float2 _MainTex_TexelSize;
  
             #pragma vertex vert
             #pragma fragment frag
             #include "UnityCG.cginc"
              
             struct v2f 
             {
                 float4 pos : POSITION;
                 float2 uvs : TEXCOORD0;
             };
              
             v2f vert (appdata_base v) 
             {
                 v2f o;
                  
                 //Despite the fact that we are only drawing a quad to the screen, Unity requires us to multiply vertices by our MVP matrix, presumably to keep things working when inexperienced people try copying code from other shaders.
                 o.pos = UnityObjectToClipPos(v.vertex);
                  
                 //Also, we need to fix the UVs to match our screen space coordinates. There is a Unity define for this that should normally be used.
                 o.uvs = o.pos.xy / 2 + 0.5;
                  
                 return o;
             }
              
              
             half4 frag(v2f i) : COLOR 
             {
                 //arbitrary number of iterations for now
                 int NumberOfIterations=5;
  
                 //split texel size into smaller words
                 float TX_x=_MainTex_TexelSize.x;
                 float TX_y=_MainTex_TexelSize.y;
  
                 //and a final intensity that increments based on surrounding intensities.
                 float ColorIntensityInRadius;
  
                 //if something already exists underneath the fragment, discard the fragment.
                 if(tex2D(_MainTex,i.uvs.xy).r>0)
                 {
                     discard;
                 }
  
                 //for every iteration we need to do horizontally
                 for(int k=0;k<NumberOfIterations;k+=1)
                 {
                     //for every iteration we need to do vertically
                     for(int j=0;j<NumberOfIterations;j+=1)
                     {
                         //increase our output color by the pixels in the area
                         ColorIntensityInRadius+=tex2D(
                                                       _MainTex, 
                                                       i.uvs.xy+float2
                                                                    (
                                                                         (k-NumberOfIterations/2)*TX_x,
                                                                         (j-NumberOfIterations/2)*TX_y
                                                                    )
                                                      ).r;
                     }
                 }
  
                 //output some intensity of teal
                 return ColorIntensityInRadius*half4(0,1,1,1);
             }
              
             ENDCG
  
         }
         //end pass        
     }
     //end subshader
 }
 //end shader



bildschirmfoto-2018-01-17-um-150146.png (467.8 kB)
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

0 Replies

· Add your reply
  • Sort: 

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.

Follow this Question

Answers Answers and Comments

519 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Oculus Rift with LWRP shader problem 1 Answer

Help with a custom "painting" shader 1 Answer

Issues when using Unity's new PBR Dissolve Shader 0 Answers

Help Please,Help Pease 0 Answers

Custom Surface shader don't work with fresnel reflection and normal map at the same time 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