protected override void OnRender(ViewportRenderingContext context, Component_RenderingPipeline.IFrameData frameData, ref Component_Image actualTexture) { var result = Result as CompiledDataSimple; //!!!!так? if (result == null) { return; } if (result.vertexProgram == null || result.fragmentProgram == null) { return; } //!!!!валится если файла нет. или не указан. //!!!!!!как быстро проверять о том что файла нет? может из кеша шейдеров или типа того. как тогда обновлять //string shaderFile = Shader; //if( string.IsNullOrEmpty( shaderFile ) ) // return; //!!!!formats. т.е. эффект поддерживает и LDR и HDR. где еще //!!!!!можно по сути у эффекта указывать что он ожидает получить на входе. ну или это EffectsHDR, EffectsLDR var outputTexture = context.RenderTarget2D_Alloc(actualTexture.Result.ResultSize, actualTexture.Result.ResultFormat); context.SetViewport(outputTexture.Result.GetRenderTarget().Viewports[0]); CanvasRenderer.ShaderItem shader = new CanvasRenderer.ShaderItem(); shader.CompiledVertexProgram = result.vertexProgram; shader.CompiledFragmentProgram = result.fragmentProgram; //shader.VertexProgramFileName = shaderFile; //shader.VertexProgramFunctionName = "main_vp"; //shader.FragmentProgramFileName = shaderFile; //shader.FragmentProgramFunctionName = "main_fp"; //{ // var defines = new List<GuiRenderer.ShaderItem.DefineItem>(); // //defines.Add( new GuiRenderer.ShaderItem.DefineItem( "FRAGMENT_CODE_BODY", "color = float4(0,1,0,1);" ) ); // if( defines.Count != 0 ) // shader.Defines = defines.ToArray(); //} shader.Parameters.Set(new ViewportRenderingContext.BindTextureData(0 /*"sourceTexture"*/, actualTexture, TextureAddressingMode.Clamp, FilterOption.Point, FilterOption.Point, FilterOption.Point)); //shader.Parameters.Set( "0"/*"sourceTexture"*/, new GpuMaterialPass.TextureParameterValue( actualTexture, // TextureAddressingMode.Clamp, FilterOption.Point, FilterOption.Point, FilterOption.Point ) ); var size = actualTexture.Result.ResultSize; shader.Parameters.Set("viewportSize", new Vector4(size.X, size.Y, 1.0 / (double)size.X, 1.0 / (double)size.Y).ToVector4F()); //!!!!типы //bool, int, uint, dword, half, float, double //Vec2, Vec3, Vec4, VecxF, Mat2, 3, 4 //Texture //Structs //arrays? //Structured Buffer //byte buffers //set shader parameters by properties foreach (var m in MetadataGetMembers()) { var p = m as Metadata.Property; if (p != null) { if (CanBeShaderParameter(this, p, out object value)) { Component_Image texture = value as Component_Image; if (texture != null) { foreach (Component_Image.BindSettingsAttribute attr in p.GetCustomAttributes(typeof(Component_Image.BindSettingsAttribute), true)) { shader.Parameters.Set(new ViewportRenderingContext.BindTextureData(attr.SamplerIndex, texture, attr.AddressingMode, attr.FilteringMin, attr.FilteringMag, attr.FilteringMip)); break; } //GpuMaterialPass.TextureParameterValue textureValue = null; //int samplerIndex = -1; //foreach( Component_Image.BindSettingsAttribute attr in p.GetCustomAttributes( // typeof( Component_Image.BindSettingsAttribute ), true ) ) //{ // textureValue = new GpuMaterialPass.TextureParameterValue( texture, // attr.AddressingMode, attr.FilteringMin, attr.FilteringMag, attr.FilteringMip ); // samplerIndex = attr.SamplerIndex; // break; //} //if( samplerIndex != -1 ) // shader.Parameters.Set( samplerIndex.ToString(), textureValue ); } else { //!!!! //convert to float type value = SimpleTypes.ConvertDoubleToFloat(value); //ColorValuePowered: convert to ColorValue if (value is ColorValuePowered) { value = ((ColorValuePowered)value).ToColorValue(); } shader.Parameters.Set(p.Name, value); shader.Parameters.Set(ToLowerFirstCharacter(p.Name), value); } } } } OnSetShaderParameters(context, frameData, actualTexture, shader); SetShaderParametersEvent?.Invoke(this, context, shader); context.RenderQuadToCurrentViewport(shader); //change actual texture context.DynamicTexture_Free(actualTexture); actualTexture = outputTexture; }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// protected override void OnRender(ViewportRenderingContext context, Component_RenderingPipeline.IFrameData frameData, ref Component_Image actualTexture) { var result = Result as CompiledDataCodeGenerated; //!!!!так? if (result == null) { return; } if (result.vertexProgram == null || result.fragmentProgram == null) { return; } //!!!!валится если файла нет. или не указан. //!!!!!!как быстро проверять о том что файла нет? может из кеша шейдеров или типа того. как тогда обновлять //string shaderFile = Shader; //if( string.IsNullOrEmpty( shaderFile ) ) // return; //!!!!formats. т.е. эффект поддерживает и LDR и HDR. где еще //!!!!!можно по сути у эффекта указывать что он ожидает получить на входе. ну или это EffectsHDR, EffectsLDR var outputTexture = context.RenderTarget2D_Alloc(actualTexture.Result.ResultSize, actualTexture.Result.ResultFormat); context.SetViewport(outputTexture.Result.GetRenderTarget().Viewports[0]); CanvasRenderer.ShaderItem shader = new CanvasRenderer.ShaderItem(); shader.CompiledVertexProgram = result.vertexProgram; shader.CompiledFragmentProgram = result.fragmentProgram; //shader.VertexProgramFileName = shaderFile; //shader.VertexProgramFunctionName = "main_vp"; //shader.FragmentProgramFileName = shaderFile; //shader.FragmentProgramFunctionName = "main_fp"; //{ // var defines = new List<GuiRenderer.ShaderItem.DefineItem>(); // //defines.Add( new GuiRenderer.ShaderItem.DefineItem( "FRAGMENT_CODE_BODY", "color = float4(0,1,0,1);" ) ); // if( defines.Count != 0 ) // shader.Defines = defines.ToArray(); //} shader.Parameters.Set(new ViewportRenderingContext.BindTextureData(0 /*"sourceTexture"*/, actualTexture, TextureAddressingMode.Clamp, FilterOption.Point, FilterOption.Point, FilterOption.Point)); //shader.Parameters.Set( "0"/*"sourceTexture"*/, new GpuMaterialPass.TextureParameterValue( actualTexture, // TextureAddressingMode.Clamp, FilterOption.Point, FilterOption.Point, FilterOption.Point ) ); unsafe { Vector4F value = Vector4F.One; if (!Color.ReferenceSpecified) { value = Color.Value.ToVector4F(); } shader.Parameters.Set("u_paramColor", ParameterType.Vector4, 1, &value, sizeof(Vector4F)); } //!!!!пока так if (result.fragmentGeneratedCode != null) { //!!!!copy code из MaterialStandard //var materialParameters = materialData.GetShaderParameters(); var code = result.fragmentGeneratedCode; //foreach( var code in codes ) //{ if (code.parameters != null) { foreach (var item in code.parameters) { //!!!!надо ссылки сконвертить или как-то так? чтобы работало, если это в типе var value = item.component.GetValue(); if (value != null) { //!!!! //convert to float type value = SimpleTypes.ConvertDoubleToFloat(value); //ColorValuePowered: convert to ColorValue if (value is ColorValuePowered) { value = ((ColorValuePowered)value).ToColorValue(); } shader.Parameters /*container*/.Set(item.nameInShader, value); } } } if (code.textures != null) { foreach (var item in code.textures) { //!!!!надо ссылки сконвертить или как-то так? чтобы работало, если это в типе //!!!!не только 2D Component_Image texture = item.component.Texture; if (texture == null) { texture = ResourceUtility.WhiteTexture2D; } //!!!!options shader.Parameters.Set(new ViewportRenderingContext.BindTextureData(item.textureRegister, texture, TextureAddressingMode.Wrap, FilterOption.Linear, FilterOption.Linear, FilterOption.Linear)); ////!!!! //var textureValue = new GpuMaterialPass.TextureParameterValue( texture, // TextureAddressingMode.Wrap, FilterOption.Linear, FilterOption.Linear, FilterOption.Linear ); ////!!!! //ParameterType parameterType = ParameterType.Texture2D; //shader.Parameters/*container*/.Set( item.textureRegister.ToString(), textureValue, parameterType ); ////shader.Parameters/*container*/.Set( item.nameInShader, textureValue, parameterType ); } } //} } var size = actualTexture.Result.ResultSize; shader.Parameters.Set("viewportSize", new Vector4(size.X, size.Y, 1.0 / (double)size.X, 1.0 / (double)size.Y).ToVector4F()); shader.Parameters.Set("intensity", (float)Intensity.Value); //!!!!auto parameters //if( result.fragmentGeneratedCode != null ) { //!!!!не так потом shader.Parameters.Set("param_viewportSize", new Vector2F(size.X, size.Y)); //foreach( var item in result.fragmentGeneratedCode.autoConstantParameters ) //{ //} } context.RenderQuadToCurrentViewport(shader); //change actual texture context.DynamicTexture_Free(actualTexture); actualTexture = outputTexture; }