OpenGL ES Using Xcode results in file not found error

Recommended Posts

Posted (edited)

I'm using Xcode on Mac OS X, and I've added a file called 'peacock.tga' into my project. I can't seem to open that file (using fopen) however. Is there anything special that I need to do in order for the file to be readable?

Edited by sjhalayka

Share this post


Link to post
Share on other sites

You need to make sure you use the correct path to the file. If you're just creating a regular, console-type application, the .tga is probably not being copied to the output directory of the executable. If you're creating an OS X bundle, you probably want to ensure the .tga is packaged into the bundle and that you use a path to where the file ends up in the Resources subdirectory of the bundle.

Share this post


Link to post
Share on other sites

If you're porting and building a Mac OSX bundle app, you've have some file handling rework ahead of you. First, I recommend that you add your assets as references rather than directly in the project. This is because XCode will preserve folder structure for referenced folders, while flattening file hierarchies that are directly included in the project. Second, you will need to follow these instructions to get a real file path:

https://stackoverflow.com/questions/8768217/how-can-i-find-the-path-to-a-file-in-an-application-bundle-nsbundle-using-c

You'll be able to use fopen as normal after that. While we're on the topic, I'll point out that this approach will not work on Android, where you have to go through explicit platform-specific IO APIs to load content embedded in your app.

Share this post


Link to post
Share on other sites

Thank you for the replies.

I managed to get it working using this code:

	    
    NSString *fileRoot = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"peacock.tga"];
	    tga_32bit_image peacock_img;
    peacock_img.load([fileRoot UTF8String]);
	

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Forum Statistics

    • Total Topics
      628751
    • Total Posts
      2984503
  • Similar Content

    • By lawnjelly
      Am currently debugging compatibility issues with my OpenGL ES 2.0 shaders across several different Android devices.
      One of the biggest problems I'm finding is how the different precisions in GLSL (lowp, mediump, highp) equate to actual precisions in the hardware. To that end I've been using glGetShaderPrecisionFormat to get the log2 of each precision for vertex and fragment shaders, and outputting this in-game to the game screen.
      On my PC the precision is coming back as 23, 23, 23 for all 3 (lo, medium, high), running under linux natively, or the Android Studio emulator. On my tablet, it is 23, 23, 23 also. On my phone it comes back with 8, 10, 23. If I get a precision issue on the phone I can always bump it up to the next level to cure it. However, the fun comes on my android TV box (Amlogic S905X) which seems to only support 10, 10, 0 for fragment shaders. That is, it doesn't even support high precision in fragment shaders.
      However being the only device with this problem it is incredibly difficult to debug the shaders, as I can't attach it via USB (unless I can get it connected via the LAN which I haven't tried yet). I'm having to compile the APK, put it on a usb stick, take into the other room, install and run. Which is ridiculous.
      My question is what method do other people use to debug these precision issues? Is there a way to get the emulator to emulate having rubbish precision? That would seem the most convenient solution (and if not, why haven't they implemented this?). Other than that it seems like I need to buy some old phones / tablets off Ebay, or 'downgrade' the precision in the shader (to mediump) and debug it on my phone...
       
    • By ORmorni
      I am working on a multiplayer Android game using OpenGL ES in Android Studio. The game is planned as a 2d top-down shooter, in which the players survive while defeating waves of enemies. Coordination between the players is required to defeat the enemies, due to the enemy design - for an example, some enemies can be seen only by the player they target, and must be killed by others.
      I have already implemented basic menus and mechanics for the game, and am currently searching for a 2d artist to create graphics for the game.
      I can be contacted at ron_solan@walla.com
    • By hiya83
      (Posted this in graphics forum too, which was perhaps the wrong forum for it)
      Hey, I was wondering if on mobile development (Android mainly but iOS as well if you know of it), if there is a GPUView equivalent for whole system debugging so we can figure out if the CPU/GPU are being pipelined efficiently, if there are bubbles, etc. Also slightly tangent question, but do mobile GPU's have a DMA engine exposed as a dedicated Transfer Queue for Vulkan?
      Thanks!
    • By hiya83
      Hey, I was wondering if on mobile development (Android mainly but iOS as well if you know of it), if there is a GPUView equivalent for whole system debugging so we can figure out if the CPU/GPU are being pipelined efficiently, if there are bubbles, etc. Also slightly tangent question, but do mobile GPU's have a DMA engine exposed as a dedicated Transfer Queue for Vulkan?
    • By ginxx tripplex
      I get 
      Shader error in 'Volund/Standard Character (Specular)': invalid subscript 'worldPos' at Assets/Features/Shared/Volund_UnityStandardCore.cginc(252) (on d3d11)
      Compiling Vertex program with DIRECTIONAL
      Platform defines: UNITY_NO_DXT5nm UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME
       
      Here is my shader code on Volund_UnityStandardCore.cginc
       
      // Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
      // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
      #ifndef UNITY_STANDARD_CORE_INCLUDED
      #define UNITY_STANDARD_CORE_INCLUDED
      #include "Volund_UnityStandardInput.cginc"
      #include "UnityCG.cginc"
      #include "UnityShaderVariables.cginc"
      #include "UnityStandardConfig.cginc"
      #include "UnityPBSLighting.cginc"
      #include "UnityStandardUtils.cginc"
      #include "UnityStandardBRDF.cginc"
      #include "AutoLight.cginc"
      #if defined(ORTHONORMALIZE_TANGENT_BASE)
          #undef UNITY_TANGENT_ORTHONORMALIZE
          #define UNITY_TANGENT_ORTHONORMALIZE 1
      #endif
      //-------------------------------------------------------------------------------------
      // counterpart for NormalizePerPixelNormal
      // skips normalization per-vertex and expects normalization to happen per-pixel
      half3 NormalizePerVertexNormal (half3 n)
      {
          #if (SHADER_TARGET < 30)
              return normalize(n);
          #else
              return n; // will normalize per-pixel instead
          #endif
      }
      half3 NormalizePerPixelNormal (half3 n)
      {
          #if (SHADER_TARGET < 30)
              return n;
          #else
              return normalize(n);
          #endif
      }
      //-------------------------------------------------------------------------------------
      UnityLight MainLight (half3 normalWorld)
      {
          UnityLight l;
          #ifdef LIGHTMAP_OFF
              
              l.color = _LightColor0.rgb;
              l.dir = _WorldSpaceLightPos0.xyz;
              l.ndotl = LambertTerm (normalWorld, l.dir);
          #else
              // no light specified by the engine
              // analytical light might be extracted from Lightmap data later on in the shader depending on the Lightmap type
              l.color = half3(0.f, 0.f, 0.f);
              l.ndotl  = 0.f;
              l.dir = half3(0.f, 0.f, 0.f);
          #endif
          return l;
      }
      UnityLight AdditiveLight (half3 normalWorld, half3 lightDir, half atten)
      {
          UnityLight l;
          l.color = _LightColor0.rgb;
          l.dir = lightDir;
          #ifndef USING_DIRECTIONAL_LIGHT
              l.dir = NormalizePerPixelNormal(l.dir);
          #endif
          l.ndotl = LambertTerm (normalWorld, l.dir);
          // shadow the light
          l.color *= atten;
          return l;
      }
      UnityLight DummyLight (half3 normalWorld)
      {
          UnityLight l;
          l.color = 0;
          l.dir = half3 (0,1,0);
          l.ndotl = LambertTerm (normalWorld, l.dir);
          return l;
      }
      UnityIndirect ZeroIndirect ()
      {
          UnityIndirect ind;
          ind.diffuse = 0;
          ind.specular = 0;
          return ind;
      }
      //-------------------------------------------------------------------------------------
      // Common fragment setup
      half3 WorldNormal(half4 tan2world[3])
      {
          return normalize(tan2world[2].xyz);
      }
      #ifdef _TANGENT_TO_WORLD
          half3x3 ExtractTangentToWorldPerPixel(half4 tan2world[3])
          {
              half3 t = tan2world[0].xyz;
              half3 b = tan2world[1].xyz;
              half3 n = tan2world[2].xyz;
          #if UNITY_TANGENT_ORTHONORMALIZE
              n = NormalizePerPixelNormal(n);
              // ortho-normalize Tangent
              t = normalize (t - n * dot(t, n));
              // recalculate Binormal
              half3 newB = cross(n, t);
              b = newB * sign (dot (newB, b));
          #endif
              return half3x3(t, b, n);
          }
      #else
          half3x3 ExtractTangentToWorldPerPixel(half4 tan2world[3])
          {
              return half3x3(0,0,0,0,0,0,0,0,0);
          }
      #endif
      #ifdef _PARALLAXMAP
          #define IN_VIEWDIR4PARALLAX(i) NormalizePerPixelNormal(half3(i.tangentToWorldAndParallax[0].w,i.tangentToWorldAndParallax[1].w,i.tangentToWorldAndParallax[2].w))
          #define IN_VIEWDIR4PARALLAX_FWDADD(i) NormalizePerPixelNormal(i.viewDirForParallax.xyz)
      #else
          #define IN_VIEWDIR4PARALLAX(i) half3(0,0,0)
          #define IN_VIEWDIR4PARALLAX_FWDADD(i) half3(0,0,0)
      #endif
      #if UNITY_SPECCUBE_BOX_PROJECTION
          #define IN_WORLDPOS(i) i.posWorld
      #else
          #define IN_WORLDPOS(i) half3(0,0,0)
      #endif
      #define IN_LIGHTDIR_FWDADD(i) half3(i.tangentToWorldAndLightDir[0].w, i.tangentToWorldAndLightDir[1].w, i.tangentToWorldAndLightDir[2].w)
      #define FRAGMENT_SETUP(x) FragmentCommonData x = \
          FragmentSetup(i.tex, i.eyeVec, WorldNormal(i.tangentToWorldAndParallax), IN_VIEWDIR4PARALLAX(i), ExtractTangentToWorldPerPixel(i.tangentToWorldAndParallax), IN_WORLDPOS(i), i.pos.xy);
      #define FRAGMENT_SETUP_FWDADD(x) FragmentCommonData x = \
          FragmentSetup(i.tex, i.eyeVec, WorldNormal(i.tangentToWorldAndLightDir), IN_VIEWDIR4PARALLAX_FWDADD(i), ExtractTangentToWorldPerPixel(i.tangentToWorldAndLightDir), half3(0,0,0), i.pos.xy);
      struct FragmentCommonData
      {
          half3 diffColor, specColor;
          // Note: oneMinusRoughness & oneMinusReflectivity for optimization purposes, mostly for DX9 SM2.0 level.
          // Most of the math is being done on these (1-x) values, and that saves a few precious ALU slots.
          half oneMinusReflectivity, oneMinusRoughness;
          half3 normalWorld, eyeVec, posWorld;
          half alpha;
      };
      #ifndef UNITY_SETUP_BRDF_INPUT
          #define UNITY_SETUP_BRDF_INPUT SpecularSetup
      #endif
      inline FragmentCommonData SpecularSetup (float4 i_tex)
      {
          half4 specGloss = SpecularGloss(i_tex.xy);
          half3 specColor = specGloss.rgb;
          half oneMinusRoughness = specGloss.a;
      #ifdef SMOOTHNESS_IN_ALBEDO
          half3 albedo = Albedo(i_tex, /*out*/ oneMinusRoughness);
      #else
          half3 albedo = Albedo(i_tex);
      #endif
          half oneMinusReflectivity;
          half3 diffColor = EnergyConservationBetweenDiffuseAndSpecular (albedo, specColor, /*out*/ oneMinusReflectivity);
          
          FragmentCommonData o = (FragmentCommonData)0;
          o.diffColor = diffColor;
          o.specColor = specColor;
          o.oneMinusReflectivity = oneMinusReflectivity;
          o.oneMinusRoughness = oneMinusRoughness;
          return o;
      }
      inline FragmentCommonData MetallicSetup (float4 i_tex)
      {
          half2 metallicGloss = MetallicGloss(i_tex.xy);
          half metallic = metallicGloss.x;
          half oneMinusRoughness = metallicGloss.y;
      #ifdef SMOOTHNESS_IN_ALBEDO
          half3 albedo = Albedo(i_tex, /*out*/ oneMinusRoughness);
      #else
          half3 albedo = Albedo(i_tex);
      #endif
          half oneMinusReflectivity;
          half3 specColor;
          half3 diffColor = DiffuseAndSpecularFromMetallic (albedo, metallic, /*out*/ specColor, /*out*/ oneMinusReflectivity);
          FragmentCommonData o = (FragmentCommonData)0;
          o.diffColor = diffColor;
          o.specColor = specColor;
          o.oneMinusReflectivity = oneMinusReflectivity;
          o.oneMinusRoughness = oneMinusRoughness;
          return o;

      inline FragmentCommonData FragmentSetup (float4 i_tex, half3 i_eyeVec, half3 i_normalWorld, half3 i_viewDirForParallax, half3x3 i_tanToWorld, half3 i_posWorld, float2 iPos)
      {
          i_tex = Parallax(i_tex, i_viewDirForParallax);
          half alpha = Alpha(i_tex.xy);
          #if defined(_ALPHATEST_ON)
              clip (alpha - _Cutoff);
          #endif
          #ifdef _NORMALMAP
              half3 normalWorld = NormalizePerPixelNormal(mul(NormalInTangentSpace(i_tex), i_tanToWorld)); // @TODO: see if we can squeeze this normalize on SM2.0 as well
          #else
              // Should get compiled out, isn't being used in the end.
               half3 normalWorld = i_normalWorld;
          #endif
          
          half3 eyeVec = i_eyeVec;
          eyeVec = NormalizePerPixelNormal(eyeVec);

          FragmentCommonData o = UNITY_SETUP_BRDF_INPUT (i_tex);
          o.normalWorld = normalWorld;
          o.eyeVec = eyeVec;
          o.posWorld = i_posWorld;
          // NOTE: shader relies on pre-multiply alpha-blend (_SrcBlend = One, _DstBlend = OneMinusSrcAlpha)
          o.diffColor = PreMultiplyAlpha (o.diffColor, alpha, o.oneMinusReflectivity, /*out*/ o.alpha);
          return o;
      }
      inline UnityGI FragmentGI (
          float3 posWorld, 
          half occlusion, half4 i_ambientOrLightmapUV, half atten, half oneMinusRoughness, half3 normalWorld, half3 eyeVec,
          UnityLight light )
      {
          UnityGI d;
          ResetUnityGI(d);
          d.light = light;
          d.worldPos = posWorld;
          d.worldViewDir = -eyeVec;
          d.atten = atten;
          #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON)
              d.ambient = 0;
              d.lightmapUV = i_ambientOrLightmapUV;
          #else
              d.ambient = i_ambientOrLightmapUV.rgb;
              d.lightmapUV = 0;
          #endif
              //change the above code with this
          #if UNITY_SPECCUBE_BLENDING || UNITY_SPECCUBE_BOX_PROJECTION
                  d.boxMin[0] = unity_SpecCube0_BoxMin;
                  d.boxMin[1] = unity_SpecCube1_BoxMin;
          #endif
          #if UNITY_SPECCUBE_BOX_PROJECTION
                  d.boxMax[0] = unity_SpecCube0_BoxMax;
                  d.boxMax[1] = unity_SpecCube1_BoxMax;
                  d.probePosition[0] = unity_SpecCube0_ProbePosition;
                  d.probePosition[1] = unity_SpecCube1_ProbePosition;
          #endif
      //lets change the code
              //d.boxMax[0] = unity_SpecCube0_BoxMax;
              //d.boxMin[0] = unity_SpecCube0_BoxMin;
              //d.probePosition[0] = unity_SpecCube0_ProbePosition;
              //d.probeHDR[0] = unity_SpecCube0_HDR;
              //d.boxMax[1] = unity_SpecCube1_BoxMax;
              //d.boxMin[1] = unity_SpecCube1_BoxMin;
              //d.probePosition[1] = unity_SpecCube1_ProbePosition;
              //d.probeHDR[1] = unity_SpecCube1_HDR;
              return UnityGlobalIllumination(
                  d, occlusion, oneMinusRoughness, normalWorld);
          }

          
          
      //-------------------------------------------------------------------------------------
      half4 OutputForward (half4 output, half alphaFromSurface)
      {
          #if defined(_ALPHABLEND_ON) || defined(_ALPHAPREMULTIPLY_ON)
              output.a = alphaFromSurface;
          #else
              UNITY_OPAQUE_ALPHA(output.a);
          #endif
          return output;
      }
      // ------------------------------------------------------------------
      //  Base forward pass (directional light, emission, lightmaps, ...)
      struct VertexOutputForwardBase
      {
          float4 pos                            : SV_POSITION;
          float4 tex                            : TEXCOORD0;
          half3 eyeVec                         : TEXCOORD1;
          half4 tangentToWorldAndParallax[3]    : TEXCOORD2;    // [3x3:tangentToWorld | 1x3:viewDirForParallax]
          half4 ambientOrLightmapUV            : TEXCOORD5;    // SH or Lightmap UV
          SHADOW_COORDS(6)
          UNITY_FOG_COORDS(7)
          // next ones would not fit into SM2.0 limits, but they are always for SM3.0+
          #if UNITY_SPECCUBE_BOX_PROJECTION
              float3 posWorld                    : TEXCOORD8;
          #endif
      };
      VertexOutputForwardBase vertForwardBase (VertexInput v) 
      {
          VertexOutputForwardBase o;
          UNITY_INITIALIZE_OUTPUT(VertexOutputForwardBase, o);
          float4 posWorld = mul(unity_ObjectToWorld, v.vertex);
          #if UNITY_SPECCUBE_BOX_PROJECTION
              o.posWorld = posWorld.xyz;
          #endif
          o.pos = UnityObjectToClipPos(v.vertex);
          o.tex = TexCoords(v);
          o.eyeVec = NormalizePerVertexNormal(posWorld.xyz - _WorldSpaceCameraPos);
          float3 normalWorld = UnityObjectToWorldNormal(v.normal);
          #ifdef _TANGENT_TO_WORLD
              float4 tangentWorld = float4(UnityObjectToWorldDir(v.tangent.xyz), v.tangent.w);
              float3x3 tangentToWorld = CreateTangentToWorldPerVertex(normalWorld, tangentWorld.xyz, tangentWorld.w);
              o.tangentToWorldAndParallax[0].xyz = tangentToWorld[0];
              o.tangentToWorldAndParallax[1].xyz = tangentToWorld[1];
              o.tangentToWorldAndParallax[2].xyz = tangentToWorld[2];
          #else
              o.tangentToWorldAndParallax[0].xyz = 0;
              o.tangentToWorldAndParallax[1].xyz = 0;
              o.tangentToWorldAndParallax[2].xyz = normalWorld;
          #endif
          //We need this for shadow receving
          TRANSFER_SHADOW(o);
          // Static lightmaps
          #ifndef LIGHTMAP_OFF
              o.ambientOrLightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw;
              o.ambientOrLightmapUV.zw = 0;
          // Sample light probe for Dynamic objects only (no static or dynamic lightmaps)
          #elif UNITY_SHOULD_SAMPLE_SH
              #if UNITY_SAMPLE_FULL_SH_PER_PIXEL
                  o.ambientOrLightmapUV.rgb = 0;
              #elif (SHADER_TARGET < 30)
                  o.ambientOrLightmapUV.rgb = ShadeSH9(half4(normalWorld, 1.0));
              #else
                  // Optimization: L2 per-vertex, L0..L1 per-pixel
                  o.ambientOrLightmapUV.rgb = ShadeSH3Order(half4(normalWorld, 1.0));
              #endif
              // Add approximated illumination from non-important point lights
              #ifdef VERTEXLIGHT_ON
                  o.ambientOrLightmapUV.rgb += Shade4PointLights (
                      unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0,
                      unity_LightColor[0].rgb, unity_LightColor[1].rgb, unity_LightColor[2].rgb, unity_LightColor[3].rgb,
                      unity_4LightAtten0, posWorld, normalWorld);
              #endif
          #endif
          #ifdef DYNAMICLIGHTMAP_ON
              o.ambientOrLightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;
          #endif
          
          #ifdef _PARALLAXMAP
              TANGENT_SPACE_ROTATION;
              half3 viewDirForParallax = mul (rotation, ObjSpaceViewDir(v.vertex));
              o.tangentToWorldAndParallax[0].w = viewDirForParallax.x;
              o.tangentToWorldAndParallax[1].w = viewDirForParallax.y;
              o.tangentToWorldAndParallax[2].w = viewDirForParallax.z;
          #endif
          
          UNITY_TRANSFER_FOG(o,o.pos);
          return o;
      }
      half4 fragForwardBase (VertexOutputForwardBase i, float face : VFACE) : SV_Target
      {
          // Experimental normal flipping
          if(_CullMode < 0.5f)
              i.tangentToWorldAndParallax[2].xyz *= face;
          
          FRAGMENT_SETUP(s)
          UnityLight mainLight = MainLight (s.normalWorld);
          half atten = SHADOW_ATTENUATION(i);
          half occlusion = Occlusion(i.tex.xy);
          
          UnityGI gi = FragmentGI (
              s.posWorld, occlusion, i.ambientOrLightmapUV, atten, s.oneMinusRoughness, s.normalWorld, s.eyeVec, mainLight);
          half4 c = UNITY_BRDF_PBS (s.diffColor, s.specColor, s.oneMinusReflectivity, s.oneMinusRoughness, s.normalWorld, -s.eyeVec, gi.light, gi.indirect);
          c.rgb += UNITY_BRDF_GI (s.diffColor, s.specColor, s.oneMinusReflectivity, s.oneMinusRoughness, s.normalWorld, -s.eyeVec, occlusion, gi);
          c.rgb += Emission(i.tex.xy);
          UNITY_APPLY_FOG(i.fogCoord, c.rgb);
          return OutputForward (c, s.alpha);
      }
      // ------------------------------------------------------------------
      //  Additive forward pass (one light per pass)
      struct VertexOutputForwardAdd
      {
          float4 pos                            : SV_POSITION;
          float4 tex                            : TEXCOORD0;
          half3 eyeVec                         : TEXCOORD1;
          half4 tangentToWorldAndLightDir[3]    : TEXCOORD2;    // [3x3:tangentToWorld | 1x3:lightDir]
          LIGHTING_COORDS(5,6)
          UNITY_FOG_COORDS(7)
          // next ones would not fit into SM2.0 limits, but they are always for SM3.0+
      #if defined(_PARALLAXMAP)
          half3 viewDirForParallax            : TEXCOORD8;
      #endif
      };
      VertexOutputForwardAdd vertForwardAdd (VertexInput v)
      {
          VertexOutputForwardAdd o;
          UNITY_INITIALIZE_OUTPUT(VertexOutputForwardAdd, o);
          float4 posWorld = mul(unity_ObjectToWorld, v.vertex);
          o.pos = UnityObjectToClipPos(v.vertex);
          o.tex = TexCoords(v);
          o.eyeVec = NormalizePerVertexNormal(posWorld.xyz - _WorldSpaceCameraPos);
          float3 normalWorld = UnityObjectToWorldNormal(v.normal);
          #ifdef _TANGENT_TO_WORLD
              float4 tangentWorld = float4(UnityObjectToWorldDir(v.tangent.xyz), v.tangent.w);
              float3x3 tangentToWorld = CreateTangentToWorldPerVertex(normalWorld, tangentWorld.xyz, tangentWorld.w);
              o.tangentToWorldAndLightDir[0].xyz = tangentToWorld[0];
              o.tangentToWorldAndLightDir[1].xyz = tangentToWorld[1];
              o.tangentToWorldAndLightDir[2].xyz = tangentToWorld[2];
          #else
              o.tangentToWorldAndLightDir[0].xyz = 0;
              o.tangentToWorldAndLightDir[1].xyz = 0;
              o.tangentToWorldAndLightDir[2].xyz = normalWorld;
          #endif
          //We need this for shadow receving
          TRANSFER_VERTEX_TO_FRAGMENT(o);
          float3 lightDir = _WorldSpaceLightPos0.xyz - posWorld.xyz * _WorldSpaceLightPos0.w;
          #ifndef USING_DIRECTIONAL_LIGHT
              lightDir = NormalizePerVertexNormal(lightDir);
          #endif
          o.tangentToWorldAndLightDir[0].w = lightDir.x;
          o.tangentToWorldAndLightDir[1].w = lightDir.y;
          o.tangentToWorldAndLightDir[2].w = lightDir.z;
          #ifdef _PARALLAXMAP
              TANGENT_SPACE_ROTATION;
              o.viewDirForParallax = mul (rotation, ObjSpaceViewDir(v.vertex));
          #endif
          
          UNITY_TRANSFER_FOG(o,o.pos);
          return o;
      }
      half4 fragForwardAdd (VertexOutputForwardAdd i, float face : VFACE) : SV_Target
      {
          // Experimental normal flipping
          if(_CullMode < 0.5f)
              i.tangentToWorldAndLightDir[2].xyz *= face;
          FRAGMENT_SETUP_FWDADD(s)
          UnityLight light = AdditiveLight (s.normalWorld, IN_LIGHTDIR_FWDADD(i), LIGHT_ATTENUATION(i));
          UnityIndirect noIndirect = ZeroIndirect ();
          half4 c = UNITY_BRDF_PBS (s.diffColor, s.specColor, s.oneMinusReflectivity, s.oneMinusRoughness, s.normalWorld, -s.eyeVec, light, noIndirect);
          
          UNITY_APPLY_FOG_COLOR(i.fogCoord, c.rgb, half4(0,0,0,0)); // fog towards black in additive pass
          return OutputForward (c, s.alpha);
      }
      // ------------------------------------------------------------------
      //  Deferred pass
      struct VertexOutputDeferred
      {
          float4 pos                            : SV_POSITION;
          float4 tex                            : TEXCOORD0;
          half3 eyeVec                         : TEXCOORD1;
          half4 tangentToWorldAndParallax[3]    : TEXCOORD2;    // [3x3:tangentToWorld | 1x3:viewDirForParallax]
          half4 ambientOrLightmapUV            : TEXCOORD5;    // SH or Lightmap UVs            
          #if UNITY_SPECCUBE_BOX_PROJECTION
              float3 posWorld                        : TEXCOORD6;
          #endif
      };
      VertexOutputDeferred vertDeferred (VertexInput v)
      {
          VertexOutputDeferred o;
          UNITY_INITIALIZE_OUTPUT(VertexOutputDeferred, o);
          float4 posWorld = mul(unity_ObjectToWorld, v.vertex);
          #if UNITY_SPECCUBE_BOX_PROJECTION
              o.posWorld = posWorld.xyz;
          #endif
          o.pos = UnityObjectToClipPos(v.vertex);
          o.tex = TexCoords(v);
          o.eyeVec = NormalizePerVertexNormal(posWorld.xyz - _WorldSpaceCameraPos);
          float3 normalWorld = UnityObjectToWorldNormal(v.normal);
          #ifdef _TANGENT_TO_WORLD
              float4 tangentWorld = float4(UnityObjectToWorldDir(v.tangent.xyz), v.tangent.w);
              float3x3 tangentToWorld = CreateTangentToWorldPerVertex(normalWorld, tangentWorld.xyz, tangentWorld.w);
              o.tangentToWorldAndParallax[0].xyz = tangentToWorld[0];
              o.tangentToWorldAndParallax[1].xyz = tangentToWorld[1];
              o.tangentToWorldAndParallax[2].xyz = tangentToWorld[2];
          #else
              o.tangentToWorldAndParallax[0].xyz = 0;
              o.tangentToWorldAndParallax[1].xyz = 0;
              o.tangentToWorldAndParallax[2].xyz = normalWorld;
          #endif
          #ifndef LIGHTMAP_OFF
              o.ambientOrLightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw;
              o.ambientOrLightmapUV.zw = 0;
          #elif UNITY_SHOULD_SAMPLE_SH
              #if (SHADER_TARGET < 30)
                  o.ambientOrLightmapUV.rgb = ShadeSH9(half4(normalWorld, 1.0));
              #else
                  // Optimization: L2 per-vertex, L0..L1 per-pixel
                  o.ambientOrLightmapUV.rgb = ShadeSH3Order(half4(normalWorld, 1.0));
              #endif
          #endif
          
          #ifdef DYNAMICLIGHTMAP_ON
              o.ambientOrLightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;
          #endif
          
          #ifdef _PARALLAXMAP
              TANGENT_SPACE_ROTATION;
              half3 viewDirForParallax = mul (rotation, ObjSpaceViewDir(v.vertex));
              o.tangentToWorldAndParallax[0].w = viewDirForParallax.x;
              o.tangentToWorldAndParallax[1].w = viewDirForParallax.y;
              o.tangentToWorldAndParallax[2].w = viewDirForParallax.z;
          #endif
          
          return o;
      }
      void fragDeferred (
          VertexOutputDeferred i,
          out half4 outDiffuse : SV_Target0,            // RT0: diffuse color (rgb), occlusion (a)
          out half4 outSpecSmoothness : SV_Target1,    // RT1: spec color (rgb), smoothness (a)
          out half4 outNormal : SV_Target2,            // RT2: normal (rgb), --unused, very low precision-- (a) 
          out half4 outEmission : SV_Target3,            // RT3: emission (rgb), --unused-- (a)
          float face : VFACE
      )
      {
          #if (SHADER_TARGET < 30)
              outDiffuse = 1;
              outSpecSmoothness = 1;
              outNormal = 0;
              outEmission = 0;
              return;
          #endif
          // Experimental normal flipping
          if(_CullMode < 0.5f)
              i.tangentToWorldAndParallax[2].xyz *= face;
          FRAGMENT_SETUP(s)
          
          // no analytic lights in this pass
          UnityLight dummyLight = DummyLight (s.normalWorld);
          half atten = 1;
          
          half occlusion = Occlusion(i.tex.xy);
          // only GI
          UnityGI gi = FragmentGI (
              s.posWorld, occlusion, i.ambientOrLightmapUV, atten, s.oneMinusRoughness, s.normalWorld, s.eyeVec, dummyLight);
          half3 color = UNITY_BRDF_PBS (s.diffColor, s.specColor, s.oneMinusReflectivity, s.oneMinusRoughness, s.normalWorld, -s.eyeVec, gi.light, gi.indirect).rgb;
          color += UNITY_BRDF_GI (s.diffColor, s.specColor, s.oneMinusReflectivity, s.oneMinusRoughness, s.normalWorld, -s.eyeVec, occlusion, gi);
          #ifdef _EMISSION
              color += Emission (i.tex.xy);
          #endif
          #ifndef UNITY_HDR_ON
              color.rgb = exp2(-color.rgb);
          #endif
          outDiffuse = half4(s.diffColor, occlusion);
          outSpecSmoothness = half4(s.specColor, s.oneMinusRoughness);
          outNormal = half4(s.normalWorld*0.5+0.5,1);
          outEmission = half4(color, 1);
      }                    
                  
      #endif // UNITY_STANDARD_CORE_INCLUDED
       
      I really don't know what is happening there i've been stuck there for 2 days.
  • Popular Now