public void Init(bgfx.ProgramHandle program)
 {
     m_prog         = program;
     m_clipRect     = bgfx.create_uniform("u_ClipRect", bgfx.UniformType.Vec4, 1);
     m_maskSoftness = bgfx.create_uniform("u_MaskSoftness", bgfx.UniformType.Vec4, 1);
     m_mainTex      = bgfx.create_uniform("u_MainTex", bgfx.UniformType.Sampler, 1);
 }
Exemple #2
0
        private void InitShader(ref bgfx.ProgramHandle dest, Entity src, bgfx.ProgramHandle defValue)
        {
            dest = defValue;
            if (src == Entity.Null || !EntityManager.HasComponent <CustomShader>(src))
            {
                return;
            }
            var shader = EntityManager.GetComponentData <CustomShader>(src);

            if (shader.Status == ShaderStatus.Loaded && EntityManager.HasComponent <ShaderBGFX>(src))
            {
                ShaderBGFX shaderBGFX = EntityManager.GetComponentData <ShaderBGFX>(src);
                dest = shaderBGFX.handle;
            }
        }
        public void Init(bgfx.ProgramHandle program)
        {
            m_prog = program;

            u_FaceColor = vec(nameof(u_FaceColor));
            u_MainTex   = sampler(nameof(u_MainTex));
            u_ClipRect  = vec(nameof(u_ClipRect));
            u_MiscP     = vec(nameof(u_MiscP));
            #if false
            u_TexDimScale           = vec(nameof(u_TexDimScale));
            u_WorldSpaceCameraPos   = vec(nameof(u_WorldSpaceCameraPos));
            u_OutlineColor          = vec(nameof(u_OutlineColor));
            u_OutlineP              = vec(nameof(u_OutlineP));
            u_UnderlayColor         = vec(nameof(u_UnderlayColor));
            u_UnderlayP             = vec(nameof(u_UnderlayP));
            u_WeightAndMaskSoftness = vec(nameof(u_WeightAndMaskSoftness));
            u_ScaleRatio            = vec(nameof(u_ScaleRatio));
            u_ScreenParams          = vec(nameof(u_ScreenParams));
            u_invModel0             = vec(nameof(u_invModel0));
            #endif
        }
Exemple #4
0
        // For uniforms and shaders setup. Does not handle vertex/index buffers
        private unsafe static void EncodeLit(RendererBGFXInstance *sys, bgfx.Encoder *encoder, ref LitShader litShader, bgfx.ProgramHandle prog, ushort viewId, ref float4x4 tx, ref LitMaterialBGFX mat,
                                             ref LightingBGFX lighting, ref float4x4 viewTx, byte flipCulling, ref LightingViewSpaceBGFX viewSpaceLightCache, uint depth)
        {
            ulong state = mat.state;

            if (flipCulling != 0)
            {
                state = FlipCulling(state);
            }
            bgfx.encoder_set_state(encoder, state, 0);

            fixed(float4x4 *p = &tx)
            bgfx.encoder_set_transform(encoder, p, 1);

            float3x3 minvt     = math.transpose(math.inverse(new float3x3(tx.c0.xyz, tx.c1.xyz, tx.c2.xyz)));
            float4x4 minvtTemp = new float4x4(minvt, float3.zero);

            //float3x3 minvt = new float3x3(tx.c0.xyz, tx.c1.xyz, tx.c2.xyz);
            bgfx.encoder_set_uniform(encoder, litShader.m_uniformModelInverseTranspose, &minvtTemp, 1);

            // material uniforms setup
            fixed(float4 *p = &mat.constAlbedo_Opacity)
            bgfx.encoder_set_uniform(encoder, litShader.m_uniformAlbedoOpacity, p, 1);

            fixed(float4 *p = &mat.constMetal_Smoothness_Billboarded)
            bgfx.encoder_set_uniform(encoder, litShader.m_uniformMetalSmoothnessBillboarded, p, 1);

            fixed(float4 *p = &mat.constEmissive_normalMapZScale)
            bgfx.encoder_set_uniform(encoder, litShader.m_uniformEmissiveNormalZScale, p, 1);

            float4 debugVect = sys->m_outputDebugSelect;

            bgfx.encoder_set_uniform(encoder, litShader.m_uniformOutputDebugSelect, &debugVect, 1);

            fixed(float4 *p = &mat.smoothness)
            bgfx.encoder_set_uniform(encoder, litShader.m_uniformSmoothness, p, 1);

            // textures
            bgfx.encoder_set_texture(encoder, 0, litShader.m_samplerAlbedoOpacity, mat.texAlbedoOpacity, UInt32.MaxValue);
            bgfx.encoder_set_texture(encoder, 3, litShader.m_samplerMetal, mat.texMetal, UInt32.MaxValue);
            bgfx.encoder_set_texture(encoder, 1, litShader.m_samplerNormal, mat.texNormal, UInt32.MaxValue);

            bgfx.encoder_set_texture(encoder, 2, litShader.m_samplerEmissive, mat.texEmissive, UInt32.MaxValue);

            fixed(float4 *p = &mat.mainTextureScaleTranslate)
            bgfx.encoder_set_uniform(encoder, litShader.m_uniformTexMad, p, 1);

            // ambient
            fixed(float4 *p = &lighting.ambientProbe.SHAr)
            bgfx.encoder_set_uniform(encoder, litShader.m_uniformAmbientProbe, p, 7);

            // transform lighting to view space, if needed: this only needs to re-compute if the viewId changed
            // also the lighting view space is per-thread, hence it is passed in
            lighting.TransformToViewSpace(ref viewTx, ref viewSpaceLightCache, viewId);

            // dir or point lights
            fixed(float *p = viewSpaceLightCache.podl_positionOrDirViewSpace)
            bgfx.encoder_set_uniform(encoder, litShader.m_simplelightPosOrDir, p, (ushort)lighting.numPointOrDirLights);

            fixed(float *p = lighting.podl_colorIVR)
            bgfx.encoder_set_uniform(encoder, litShader.m_simplelightColorIVR, p, (ushort)lighting.numPointOrDirLights);

            // mapped lights (always have to set those or there are undefined samplers)
            EncodeMappedLight(encoder, ref lighting.mappedLight0, ref litShader.m_mappedLight0, 0, viewSpaceLightCache.mappedLight0_viewPosOrDir); // sampler 4
            EncodeMappedLight(encoder, ref lighting.mappedLight1, ref litShader.m_mappedLight1, 1, viewSpaceLightCache.mappedLight1_viewPosOrDir); // sampler 5

            fixed(float4 *p = &lighting.mappedLight01sis)
            bgfx.encoder_set_uniform(encoder, litShader.m_texShadow01sis, p, 1);

            // csm
            fixed(float4 *p = &viewSpaceLightCache.csmLight_viewPosOrDir)
            bgfx.encoder_set_uniform(encoder, litShader.m_dirCSM, p, 1);

            fixed(float *p = lighting.csmOffsetScale)
            bgfx.encoder_set_uniform(encoder, litShader.m_offsetScaleCSM, p, 4);

            fixed(float4 *p = &lighting.csmLight.color_invrangesqr)
            bgfx.encoder_set_uniform(encoder, litShader.m_colorCSM, p, 1);

            fixed(float4x4 *p = &lighting.csmLight.projection)
            bgfx.encoder_set_uniform(encoder, litShader.m_matrixCSM, p, 1);

            fixed(float4 *p = &lighting.csmLightsis)
            bgfx.encoder_set_uniform(encoder, litShader.m_sisCSM, p, 1);

            bgfx.encoder_set_texture(encoder, 6, litShader.m_samplerShadowCSM, lighting.csmLight.shadowMap, UInt32.MaxValue);  // sampler 6

            float4 numlights = new float4(lighting.numPointOrDirLights, lighting.numMappedLights, lighting.numCsmLights, 0.0f);

            bgfx.encoder_set_uniform(encoder, litShader.m_numLights, &numlights, 1);

            // fog
            fixed(float4 *p = &lighting.fogColor)
            bgfx.encoder_set_uniform(encoder, litShader.m_uniformFogColor, p, 1);

            fixed(float4 *p = &lighting.fogParams)
            bgfx.encoder_set_uniform(encoder, litShader.m_uniformFogParams, p, 1);

            // submit
            bgfx.encoder_submit(encoder, viewId, prog, depth, (byte)bgfx.DiscardFlags.All);
        }