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 /
avatar image
0
Question by jehovah0121qq · Oct 23, 2015 at 11:57 AM · shaderprojectormatrix

Why does not perspective projectors work well?

With Unity 5.2.1f1, I'm trying to use a Projector to project an image to a given mesh. I have a simple scene that contains a camera, a directional light source, a plane as the mesh to project things on and a fourth GameObject that has a Projector component.

When I set the Projector to be orthographic, it works pretty good.

alt text

But I hope to use it as a mock light source that works on a baked scene, so I wish it to work well when perspective. Now the problem shows up.

alt text

My shader on the plane is simply Legacy Shaders/Diffuse, and the shader used for the projector is as follows.

 Shader "Cg projector shader for adding light"
 {
     Properties
     {
         _ShadowTex("Projected Image", 2D) = "white" {}
         _AlphaFactor("Alpha Factor", Range(0.0, 3.0)) = 1.0
         _MainColor("Color", Color) = (1, 1, 1, 0)
     }
         
     SubShader
     {
         Pass
         {
             Blend SrcAlpha OneMinusSrcAlpha
             ZWrite Off
             Offset -1, -1
 
             CGPROGRAM
 
             #pragma vertex vert  
             #pragma fragment frag 
 
             uniform sampler2D _ShadowTex;
             uniform fixed _AlphaFactor;
             uniform fixed4 _MainColor;
 
             // Projector-specific uniforms
             uniform float4x4 _Projector; // transformation matrix from object space to projector space 
 
             struct vertexInput
             {
                 float4 vertex : POSITION;
                 float3 normal : NORMAL;
             };
 
             struct vertexOutput
             {
                 float4 pos : SV_POSITION;
                 float4 posProj : TEXCOORD0; // position in projector space
             };
 
             vertexOutput vert(vertexInput input)
             {
                 vertexOutput output;
 
                 output.posProj = mul(_Projector, input.vertex);
                 output.pos = mul(UNITY_MATRIX_MVP, input.vertex);
                 return output;
             }
 
             fixed4 frag(vertexOutput input) : COLOR
             {
                 // In front of projector and within the boundary of the texture.
                 if (input.posProj.w > 0.0 && input.posProj.x <= 1.0 && input.posProj.y <= 1.0 && input.posProj.x >= 0.0 && input.posProj.y >= 0.0)
                 {
                     fixed4 retColor = tex2Dproj(_ShadowTex, input.posProj) * _MainColor;
                     retColor.a = clamp(retColor.a * _AlphaFactor, 0.0, 1.0);
                     return retColor;
                 }
         
                 return fixed4(0.0, 0.0, 0.0, 0.0);
             }
 
             ENDCG
         }
     }
         
     Fallback "Mobile/Diffuse"
 }

This shader comes from the internet, and the main change I made is adding x and y restrictions to the if statement in the fragment function, because I don't want the clamp or repeated effects of the projected image is shown anywhere outside the frustrum. So is there anything I can do with matrices and apply them to the boundary of the if statement? Or, am I totally doing wrong?

Thanks.

orthographic.png (40.4 kB)
perspective.png (18.4 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

3 People are following this question.

avatar image avatar image avatar image

Related Questions

What is the value of unity_ProjectorClip ? 0 Answers

UnityObjectToClipPos is inverted? 0 Answers

How to render projector in front of walls but behind player? 1 Answer

Projectors are supposed to go through objects? 1 Answer

I want to create Google Earth style Image Overlays (projections) 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