zoukankan      html  css  js  c++  java
  • framebufferfetch in mali multiple render targets mrt

    gl_LastFragColorARM

    https://www.khronos.org/registry/OpenGL/extensions/ARM/ARM_shader_framebuffer_fetch.txt

    https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_shader_framebuffer_fetch.txt

    上扩展镇楼

    mali真是奇 似乎不支持通用扩展

    query试试

    程序员职业素养。。。内事不决问unreal。。。ue已经做了singlepass deferred了 。。。但没做metal2的!

    mali G76 extension query不支持 EXT_shader_framebuffer_fetch只有ARM_shader_framebuffer_fetch

    我看ue写了arm这个扩展

    unity根本没做 

    GL_ARM_shader_framebuffer_fetch 这个貌似不支持 mrt

    可以query

     FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM           0x8F66

     GetBooleanv

    即便query出来 我就没看到使用的语法。。

    这个single query unity根本就没包。。。 只包了GetIntegerv

    人家ue都有GetBooleanv。。。

     integerv  query不到 0x8F66 glGetIntegerv: GL_INVALID_ENUM: enum argument out of range(因为是adreno。。。。)

    booleanv 加不进去。。

     integerv  query 支持mrt。。ogles3.2支持0x8F66query 支持framebufferfetch mrt 下面问题就是语法是什么呢。。。

    gl_FragColor = gl_LastFragColorARM + vec4(0.0, 1.0, 1.0, 1.0);

    gl_LastFragColorARM[0]只能拿到float 拿不到vector4.。。

    那语法能是啥

     请教了一下 原来 这个query通过意思是 对于mrt

    用 gl_LastFragColorARM那rt0 是可以拿到的 不是未定义的行为

    而rt1.2 是没有提供拿到的语法的 

    arm fbf扩展这里就是比ext fbf扩展少这个功能的

    还得给mali专门再写套管线。。。

    G76 的extension

    GL_EXT_debug_marker GL_ARM_rgba8 GL_ARM_mali_shader_binary GL_OES_depth24 GL_OES_depth_texture GL_OES_depth_texture_cube_map GL_OES_packed_depth_stencil GL_OES_rgb8_rgba8 GL_EXT_read_format_bgra GL_OES_compressed_paletted_texture GL_OES_compressed_ETC1_RGB8_texture GL_OES_standard_derivatives GL_OES_EGL_image GL_OES_EGL_image_external GL_OES_EGL_image_external_essl3 GL_OES_EGL_sync GL_OES_texture_npot GL_OES_vertex_half_float GL_OES_required_internalformat GL_OES_vertex_array_object GL_OES_mapbuffer GL_EXT_texture_format_BGRA8888 GL_EXT_texture_rg GL_EXT_texture_type_2_10_10_10_REV GL_OES_fbo_render_mipmap GL_OES_element_index_uint GL_EXT_shadow_samplers GL_OES_texture_compression_astc GL_KHR_texture_compression_astc_ldr GL_KHR_texture_compression_astc_hdr GL_KHR_texture_compression_astc_sliced_3d GL_EXT_texture_compression_astc_decode_mode GL_EXT_texture_compression_astc_decode_mode_rgb9e5 GL_KHR_debug GL_EXT_occlusion_query_boolean GL_EXT_disjoint_timer_query GL_EXT_blend_minmax GL_EXT_discard_framebuffer
    GL_OES_get_program_binary GL_OES_texture_3D GL_EXT_texture_storage GL_EXT_multisampled_render_to_texture GL_EXT_multisampled_render_to_texture2 GL_OES_surfaceless_context GL_OES_texture_stencil8 GL_EXT_shader_pixel_local_storage GL_ARM_shader_framebuffer_fetch GL_ARM_shader_framebuffer_fetch_depth_stencil GL_ARM_mali_program_binary GL_EXT_sRGB GL_EXT_sRGB_write_control GL_EXT_texture_sRGB_decode GL_EXT_texture_sRGB_R8 GL_EXT_texture_sRGB_RG8 GL_KHR_blend_equation_advanced GL_KHR_blend_equation_advanced_coherent GL_OES_texture_storage_multisample_2d_array GL_OES_shader_image_atomic GL_EXT_robustness GL_EXT_draw_buffers_indexed GL_OES_draw_buffers_indexed GL_EXT_texture_border_clamp GL_OES_texture_border_clamp GL_EXT_texture_cube_map_array GL_OES_texture_cube_map_array GL_OES_sample_variables GL_OES_sample_shading GL_OES_shader_multisample_interpolation GL_EXT_shader_io_blocks GL_OES_shader_io_blocks GL_EXT_tessellation_shader GL_OES_tessellation_shader GL_EXT_primitive_bounding_box GL_OES_primitive_bounding_
    box GL_EXT_geometry_shader GL_OES_geometry_shader GL_ANDROID_extension_pack_es31a GL_EXT_gpu_shader5 GL_OES_gpu_shader5 GL_EXT_texture_buffer GL_OES_texture_buffer GL_EXT_copy_image GL_OES_copy_image GL_EXT_shader_non_constant_global_initializers GL_EXT_color_buffer_half_float GL_EXT_color_buffer_float GL_EXT_YUV_target GL_OVR_multiview GL_OVR_multiview2 GL_OVR_multiview_multisampled_render_to_texture GL_KHR_robustness GL_KHR_robust_buffer_access_behavior GL_EXT_draw_elements_base_vertex GL_OES_draw_elements_base_vertex GL_EXT_protected_textures GL_EXT_buffer_storage GL_EXT_external_buffer GL_EXT_EGL_image_array GL_EXT_texture_filter_anisotropic

    这里肯定有工作量了 

    1.GL_EXT_shader_pixel_local_storage

    这是一个方法 它有这个通用扩展

    2.vulkan subpass

    3.zprepass   mask +depth+ 引擎加 GL_ARM_shader_framebuffer_fetch

    有关扩展 遇到个很坑的问题

    https://www.khronos.org/registry/OpenGL/api/GLES2/gl2ext.h

    比如 GL_EXT_shader_pixel_local_storage这个 宏在哪开的 找遍unity没找到

    原来是 opengl里定义的 并且和#extension GL_EXT_shader_pixel_local_storage: enable

    无关

    它就是

    #ifndef GL_EXT_shader_pixel_local_storage
    #define GL_EXT_shader_pixel_local_storage 1
    #define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT 0x8F63
    #define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_SIZE_EXT 0x8F67
    #define GL_SHADER_PIXEL_LOCAL_STORAGE_EXT 0x8F64
    #endif /* GL_EXT_shader_pixel_local_storage */

    另外一些扩展的宏就是没定义 就是没定义。。。

    https://www.khronos.org/registry/OpenGL/index_es.php

    https://www.khronos.org/registry/OpenGL/api/GLES2/gl2ext.h

    https://www.khronos.org/registry/OpenGL/api/GLES3/gl32.h

    比如 GL_EXT_tessellation_shader GL_EXT_sRGB GL_EXT_robustness GL_KHR_robustness 他们都是G76支持的ext 

    可能是我写的fragment shader 里没有触发 上面的这几个宏的define? 

        Including the following line in a shader can be used to control the
        language features described in this extension:
    
          #extension GL_EXT_tessellation_shader : <behavior>
          #extension GL_EXT_tessellation_point_size : <behavior>
    
        where <behavior> is as specified in section 3.4.
    
        A new preprocessor #define is added to the OpenGL ES Shading Language:
    
          #define GL_EXT_tessellation_shader 1
          #define GL_EXT_tessellation_point_size 1

    好像我猜的对。。。

    但是和 gl2ext.h里这个说不通

    #ifndef GL_EXT_tessellation_shader
    #define GL_EXT_tessellation_shader 1
    #define GL_PATCHES_EXT                    0x000E
    #define GL_PATCH_VERTICES_EXT             0x8E72
    #define GL_TESS_CONTROL_OUTPUT_VERTICES_EXT 0x8E75
    #define GL_TESS_GEN_MODE_EXT              0x8E76
    。。。。。。。。。。。。。

     不过GL_ARM_shader_framebuffer_fetch

    GL_ARM_shader_framebuffer_fetch_depth_stencil

    在G76的fragmentshader里是 define的 

    #version 320 es
    #ifdef GL_ARM_shader_framebuffer_fetch
    #extension GL_ARM_shader_framebuffer_fetch : enable
    #endif
    precision mediump float;

    void main()
    {
    #ifdef GL_ARM_shader_framebuffer_fetch
    gl_FragColor = gl_LastFragColorARM + vec4(0.0, 0.0, 1.0, 1.0);
    #else
    gl_FragColor = gl_LastFragColorARM+ vec4(1.0, 0.0, 0.0, 1.0);
    #endif
    }

    unity这代码看的我昏天暗地的

    它有个宏

    FRAMEBUFFERFETCH

    跟这个flag kShaderRequireFramebufferFetch

    https://michaldrobot.com/2014/04/01/gcn-execution-patterns-in-full-screen-passes/

    unity 解决方案

    pc用一个pass

    ios和android adreno用 cgprogram inout

    android mali用glsl 

    perfect

     //////////////////////////////

    // ::printf_console("mg============testoutput01");
    // GLboolean armMrtBool = false;
    //FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM 0x8F66
    // GLES_CALL(api, glGetBooleanv, 0x8F66, &armMrtBool);
    /// api->glGetBooleanv(0x8F66, &armMrtBool);
    //GLint armMrtBool = 0;
    ////FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM 0x8F66
    //GLES_CALL(api, glGetIntegerv, 0x8F66, &armMrtBool);
    //api->glGetBooleanv(0x8F66, &armMrtBool);
    // ::printf_console("mg====================armMRT supported:%d", armMrtBool);
    // ::printf_console("mg====================armMRT supported:%s", armMrtBool ? "true": "false");
    // ::printf_console("mg============testoutput02");
    if (extensionString.size())

    GraphicsCapsGLES.cpp

    //--version--

    arm mrt 考虑depthstencil fbf

    或者pixel_local_storage

    考虑到后者 unity和ue都没包 前者是比较推荐的方案了

  • 相关阅读:
    02-CSS基础与进阶-day4_2018-08-31-20-42-09
    02-CSS基础与进阶-day4__2018-08-31-20-22-57
    02-CSS基础与进阶-day3_2018-08-29-21-30-56
    02-CSS基础与进阶-day3_2018-08-29-20-39-58
    02-CSS基础与进阶-day3_2018-08-29-20-20-56
    02-CSS基础与进阶-day2_2018-08-27-22-00-56
    02-CSS基础与进阶-day2__2018-08-27-21-27-31
    02-CSS基础与进阶-day2_2018-08-27-20-57-55
    Pytest(12)pytest缓存
    Pytest(11)allure报告
  • 原文地址:https://www.cnblogs.com/minggoddess/p/11471369.html
Copyright © 2011-2022 走看看