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都没包 前者是比较推荐的方案了
framebufferfetch in mali multiple render targets mrt的更多相关文章
- 认识多渲染目标(Multiple Render Targets)技术 【转】
认识多渲染目标(Multiple Render Targets)技术 首先,渲染到纹理是D3D中的一项高级技术.一方面,它很简单,另一方面它很强大并能产生很多特殊效果. 比如说发光效果,环境映射,阴影 ...
- GLSL使用FBO实现MRT(Multiple Render Targets)绘制到多张纹理 【转】
项目的程序里设计需要将某一帧渲染出来的画面拆成三通道单色图像存到三张纹理里面.要绘制到纹理里,自然就想到FBO了.但是一次要输出多张纹理,这个还没接触过.一阵网上搜索过后,终于了解到了MRT(多重渲染 ...
- 认识多渲染目标(Multiple Render Targets)技术【转】
http://www.cnblogs.com/hellohuan/archive/2008/12/01/1345359.html 首先,渲染到纹理是D3D中的一项高级技术.一方面,它很简单,另一方面它 ...
- Unity5 的新旧延迟渲染Deferred Lighting Rendering Path
unity5 的render path ,比4的区别就是使用的新的deferred rendering,之前的4的deferred rendering(其实是light prepass)也被保留了下来 ...
- Unity3D光照前置知识——Rendering Paths(渲染路径)及LightMode(光照模式)译解
简述 Unity supports different Rendering Paths. You should choose which one you use depending on your g ...
- 渲染路径-Unity5 的新旧推迟渲染Deferred Lighting Rendering Path
Unity5 的新旧延迟渲染Deferred Lighting Rendering Path unity5 的render path ,比4的区别就是使用的新的deferred rendering,之 ...
- 【OpenGL】OpenGL帧缓存对象(FBO:Frame Buffer Object) 【转】
http://blog.csdn.net/xiajun07061225/article/details/7283929/ OpenGL Frame BufferObject(FBO) Overview ...
- A brief preview of the new features introduced by OpenGL 3.3 and 4.0
A brief preview of the new features introduced by OpenGL 3.3 and 4.0 The Khronos Group continues t ...
- Deferred shading rendering path翻译
Overview 概述 When using deferred shading, there is no limit on the number of lights that can affect a ...
随机推荐
- 树莓派上跑.NET的segment fault错误
答案:树莓派1和树莓派zero是不支持的,原因是.net需要arm v7 详情看这里 可以用 cat /proc/cpuinfo | grep 'model name' |uniq 看一下cpu
- (7)Spring Boot web开发 --- servlet容器
文章目录 配置嵌入式 Servlet 容器 注册 三大组件 使用其他 servlet 容器 使用外置的 `Servlet` 容器 配置嵌入式 Servlet 容器 Spirng Boot 默认使用自带 ...
- 2019秋季PAT甲级_备考总结
2019 秋季 PAT 甲级 备考总结 在 2019/9/8 的 PAT 甲级考试中拿到了满分,考试题目的C++题解记录在这里,此处对备考过程和考试情况做一个总结.如果我的方法能帮助到碰巧点进来的有缘 ...
- 20191031:Python取反运算详解
20191031:Python取反运算详解 取反运算:~3 == 4 1.对于数字 3 =======>转换为二进制表示为011 2.对011取反为100 3.为什么表示-4 a.计算机用补码表 ...
- AVR单片机教程——如何使用本教程
这是一篇元教程(meta-tutorial)——其他教程教你怎么使用AVR单片机,本篇教程教你如何使用本系列教程. 我们的教程已经把板载LED讲完了,但是教会你的不应该只是如何使用LED.你应该已经知 ...
- 序列方差[NTT]
也许更好的阅读体验 \(\mathcal{Description}\) 给你一个长度为\(n\)的数组\(a\) 你会得到 \(q\) 条指令, 分两种: \(1\ l\ r\ w\) 表示把 \(l ...
- NodeJS入门--环境搭建 IntelliJ IDEA
NodeJS入门–环境搭建 IntelliJ IDEA 本人也刚开始学习NodeJS,所以以此做个笔记,欢迎大家提出意见. 1.首先 下载安装NodeJS,下载安装IntelliJ IDEA 2.接下 ...
- C# DataGridView 动态添加列和行
https://blog.csdn.net/alisa525/article/details/7350471 dataGridView1.ReadOnly = true ; //禁用编辑功能 ...
- Python遗传和进化算法框架(一)Geatpy快速入门
https://blog.csdn.net/qq_33353186/article/details/82014986 Geatpy是一个高性能的Python遗传算法库以及开放式进化算法框架,由华南理工 ...
- AE开发—利用IQueryFilter接口进行属性查询
在ArcGis Engine二次开发过程中,经常会需要用到查询统计的功能,而IQueryFilter是最常见的属性字段查询接口,可以用来做一些简单的查询工作. 现在有一些公交站点和公交路线的数据,可视 ...