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 Ojors · Sep 16, 2016 at 08:00 PM · shadershadersshader programmingshaderlabshader writing

A Cg shader semantic problem

Hi guys, I am a beginner to learn Unity Shader. There is a problem about CG Shader:

Why do some people define the semantics of the input and output structures in Shader, some of them can be defined as the same meaning?

for example:

 struct vertIn {
     float4 vertex : POSITION; 
     float3 normal : NORMAL; //semantic:NORMAL
 };

 struct vertOut {
     float4 pos : SV_POSITION;
     float3 worldNormal : NORMAL; //the same as vertIn.normal, but some people use TEXCOORD instead
     float3 color : COLOR
 };

How do I know when to use NORMAL and when to use TEXCOORD?

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

2 Replies

· Add your reply
  • Sort: 
avatar image
0

Answer by waller_g · Mar 27, 2019 at 12:00 AM

I think you're having an issue with concepts rather than semantics. A normal is how the vertex should react to light, and is usually a vector perpendicular to the intended surface, while textures are 2-dimensional constructs with coordinates ranging from 0,0 to 1,1 (thus giving a U and a V coordinate, rather than X,Y,Z).

The semantics attached to the shader inputs and outputs are there to show intent to the GPU, to tell it what you mean to use those registers for. It's very important that you do not confuse the intent of a normal with the intent of a texture coordinate.

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
avatar image
0

Answer by Iamu · Dec 07, 2020 at 11:32 PM

For some build targets, and/or years ago, "NORMAL" semantics were not valid for vertex-to-fragment interpolators, though they were valid for vertex input. Since normal vectors were being interpolated anyway, people used "TEXCOORD" semantics for normals.

By informing the render pipeline as to your intent for interpolators, it has an opportunity to optimize. For example, pure color interpolation might tolerate less precision than an actual texture coordinate, as textures could point to thousands of completely different pixels across a range 0 to 1, so color might be "easier" for the pipeline.

This does not guarantee that semantic hints will be used to optimize. However, per the answer by @waller_g, if your shader model and targets accept the "NORMAL" semantics for a true normal vector, then it could be optimized for speed and/or (domain) precision. For example, hypothetically, a "NORMAL" interpolator could prioritize maintaining directionality over maintaining scale of the vector.

So, if all your desired shader variants are compatible for "NORMAL" semantics for a normal vector, I suspect that's what you should use. (Some variants might not be, though.)

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.

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

How to adapt this shader into a transparent one (alpha blend) 0 Answers

Header for material properties in inspector? 2 Answers

Fog not working in my Shader~ 0 Answers

Addition to Standard Shader stopping it from batching? 0 Answers

Unity 3d Sprite Shader (How do I limit Max Brightness to 1 with Multiple Lights Hitting) 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