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); }
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 }
// 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); }