HDR渲染管线中的像素格式-v1

目录

R16G16B16A16

支持透明度,精度高用起来简单。现在大模型中也常用。。不过游戏中通常不怎么使用这个,涉及DDR带宽读写的功耗开销。复杂场景,pass打断,FP16格式带来的功耗开销,

IOS中一个display p3就建议采用FP16的格式了,不一定支持硬件合成,

下面各种奇葩的像素格式,解决一个问题,优化带宽读写功耗,

EGL------R10G10B10A2 渲染HDR内容实践

基于gles,如果要渲染HDR的视频,

1)视频解码拿出像素buffer,携带metadata

2)EGL创建surface,

  • 指定色域格式,BT2020_PQ,BT2020_HLG
  • 指定像素格式,一般rgba10bit

EGL中还需要给windows设置像素格式,下面是android的平台化代码:

cpp 复制代码
/*
 * Initialize an EGL eglContext_ for the current display_.
 *
 * Supported Format:
 *     8888:     EGL_COLOR_COMPONENT_TYPE_EXT  EGL_COLOR_COMPONENT_TYPE_FIXED_EXT
 *     101010102:EGL_COLOR_COMPONENT_TYPE_EXT  EGL_COLOR_COMPONENT_TYPE_FIXED_EXT
 *     16161616: EGL_COLOR_COMPONENT_TYPE_EXT  EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT
 *
 */
bool ImageViewEngine::CreateWideColorCtx(WIDECOLOR_MODE mode) {
  EGLBoolean status;

  std::vector<EGLint> attributes {
      EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
      EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT,
      EGL_BLUE_SIZE,  glWideColorCfg[mode].b_,
      EGL_GREEN_SIZE, glWideColorCfg[mode].g_,
      EGL_RED_SIZE,   glWideColorCfg[mode].r_,
      EGL_ALPHA_SIZE, glWideColorCfg[mode].a_,
  };
  attributes.push_back(EGL_NONE);

  // request just one matching config and use it
  EGLint    cfgCount = 1;
  EGLConfig config;
  status = eglChooseConfig(display_, attributes.data(), &config,
                           cfgCount, &cfgCount);
  if (!status || cfgCount != 1) {
    // if not support, report to caller so caller could choose another one
    LOGI("==== Chosen Config type(%d) is not supported", mode);
    return false;
  }

  // Create GL3 Context
  attributes.resize(0);
  attributes.push_back(EGL_CONTEXT_CLIENT_VERSION);
  attributes.push_back(3);
  attributes.push_back(EGL_NONE);
  eglContext_ = eglCreateContext(display_, config,
                                 EGL_NO_CONTEXT, attributes.data());
  if(eglContext_ == EGL_NO_CONTEXT) {
    return false;
  }

  EGLint format;
  eglGetConfigAttrib(display_, config, EGL_NATIVE_VISUAL_ID, &format);
  LOGI("====Surface format is(%d)", format);

  int32_t res = ANativeWindow_setBuffersGeometry(app_->window, 0, 0, format);
  if(res < 0) {
    eglDestroyContext(display_, eglContext_);
    eglContext_ = EGL_NO_CONTEXT;
    return false;
  }
  // ...
}

metal中的扩展像素格式

IOS10之后就搞出来的,重点看32pp的,

IOS10之后引入的,三个分量都是10bit~

cpp 复制代码
        if ([_device supportsFamily:MTLGPUFamilyApple3])
        {
            _drawableFormat = MTLPixelFormatBGR10_XR;
        }
        else
        {
            _drawableFormat = MTLPixelFormatBGRA8Unorm;
        }

P010

HDR可能采用YUV存储,能比rgba少至少10%的数据量。

需要GPU支持采样,vulkan中需要设置ConversionInfo。

R11G10B10F

舍弃透明度,扩展rgb通道,

MTLPixelFormatRG11B10Float

REF

游戏中多pass打断问题

IOS10扩展像素格式

相关推荐
房西杭5 小时前
AttrMgr 属性管理器(传奇MMO Lua服务端)
游戏开发
超爱吃士力架1 天前
程序员的副业 IP 探索之路----小白用AI做了个游戏,发出去第一天居然有300多个人玩!!!
游戏开发
SmalBox1 天前
08-05-热更新-完整热更新流程实战
unity3d·游戏开发
只睡四小时2 天前
Three.js Sub-tick:漏判 60.7%→0
开发语言·javascript·性能优化·ecmascript·游戏开发·three.js·碰撞检测
SmalBox2 天前
08-04-热更新-首包资源策略
unity3d·游戏开发
DolitD3 天前
UE像素流与云渲染技术方案对比分析
3d·云原生·ue5·云计算·图形渲染
SmalBox3 天前
08-03-热更新-边玩边下载
unity3d·游戏开发
西风逍遥游4 天前
从 EveScript 到 B站 Toy:一个 WebGPU 游戏发布插件怎样设计
游戏开发
西风逍遥游4 天前
500 单位 RTS 为什么还没到 60 FPS:一次 WebGPU 游戏性能诊断
游戏开发
甲维斯4 天前
Codex,Zcode,KimiCode电脑操作能力对比!
人工智能·游戏开发