private void InitializeContextObjects(RenderContext rc, MaterialCache materialCache, BufferCache bufferCache) { ResourceFactory factory = rc.ResourceFactory; _instanceDataVB = factory.CreateVertexBuffer(InstanceData.SizeInBytes * 10, true); _ib = factory.CreateIndexBuffer(new[] { 0 }, false); if (_texture == null) { _texture = RawTextureDataArray <RgbaFloat> .FromSingleColor(RgbaFloat.Pink); } _deviceTexture = _texture.CreateDeviceTexture(factory); _textureBinding = factory.CreateShaderTextureBinding(_deviceTexture); _material = materialCache.GetMaterial(rc, "passthrough-vertex", "billboard-geometry", "particle-fragment", s_vertexInputs, s_globalInputs, s_perObjectInputs, s_textureInputs); _depthStencilState = factory.CreateDepthStencilState(true, DepthComparison.LessEqual, true); #if DEBUG_PARTICLE_BOUNDS var briwr = new BoundsRenderItemWireframeRenderer(this, rc); _gs.AddRenderItem(briwr, Transform); #endif _initialized = true; }
private async void InitializeContextObjects(RenderContext context, MaterialCache materialCache, BufferCache bufferCache) { ResourceFactory factory = context.ResourceFactory; Debug.Assert(_vb == null); Debug.Assert(_ib == null); Debug.Assert(_deviceTexture == null); Debug.Assert(_textureBinding == null); _vb = bufferCache.GetVertexBuffer(_mesh); CreateIndexBuffer(wasTransparent: false); if (s_regularGlobalInputs == null) { s_regularGlobalInputs = new MaterialInputs <MaterialGlobalInputElement>( new MaterialGlobalInputElement[] { new MaterialGlobalInputElement("ProjectionMatrixBuffer", MaterialInputType.Matrix4x4, "ProjectionMatrix"), new MaterialGlobalInputElement("ViewMatrixBuffer", MaterialInputType.Matrix4x4, "ViewMatrix"), new MaterialGlobalInputElement("LightProjectionMatrixBuffer", MaterialInputType.Matrix4x4, "LightProjMatrix"), new MaterialGlobalInputElement("LightViewMatrixBuffer", MaterialInputType.Matrix4x4, "LightViewMatrix"), new MaterialGlobalInputElement("LightInfoBuffer", MaterialInputType.Custom, "LightBuffer"), new MaterialGlobalInputElement("CameraInfoBuffer", MaterialInputType.Custom, "CameraInfo"), new MaterialGlobalInputElement("PointLightsBuffer", MaterialInputType.Custom, "PointLights") }); } _regularPassMaterial = materialCache.GetMaterial( context, RegularPassVertexShaderSource, RegularPassFragmentShaderSource, s_vertexInputs, s_regularGlobalInputs, s_perObjectInputs, s_textureInputs); _regularPassTransparentMaterial = materialCache.GetMaterial( context, RegularPassTransparentVertexShaderSource, RegularPassTransparentFragmentShaderSource, s_vertexInputs, s_regularGlobalInputs, s_transparentPerObjectInputs, s_transparentTextureInputs); if (_texture == null) { _texture = RawTextureDataArray <RgbaFloat> .FromSingleColor(RgbaFloat.Pink); } _deviceTexture = await _gs.ExecuteOnMainThread(() => _texture.CreateDeviceTexture(factory)); _textureBinding = await _gs.ExecuteOnMainThread(() => factory.CreateShaderTextureBinding(_deviceTexture)); if (s_shadowmapGlobalInputs == null) { s_shadowmapGlobalInputs = new MaterialInputs <MaterialGlobalInputElement>( new MaterialGlobalInputElement[] { new MaterialGlobalInputElement("ProjectionMatrixBuffer", MaterialInputType.Matrix4x4, "LightProjMatrix"), new MaterialGlobalInputElement("ViewMatrixBuffer", MaterialInputType.Matrix4x4, "LightViewMatrix") }); } _shadowPassMaterial = materialCache.GetMaterial( context, ShadowMapPassVertexShaderSource, ShadowMapPassFragmentShaderSource, s_vertexInputs, s_shadowmapGlobalInputs, s_shadowmapPerObjectInputs, MaterialTextureInputs.Empty); if (s_wireframeRS == null) { s_wireframeRS = factory.CreateRasterizerState(FaceCullingMode.None, TriangleFillMode.Wireframe, true, true); } if (s_noCullRS == null) { s_noCullRS = factory.CreateRasterizerState(FaceCullingMode.None, TriangleFillMode.Solid, true, true); } _initialized = true; }