在direct3D中,透明度处理和D2D1_ALPHA_MODE_PREMULTIPLIED含义?

这篇具有很好参考价值的文章主要介绍了在direct3D中,透明度处理和D2D1_ALPHA_MODE_PREMULTIPLIED含义?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.D2D1_ALPHA_MODE_PREMULTIPLIED 含义

D2D1_ALPHA_MODE_PREMULTIPLIED 是 Direct2D 中定义的一种 Alpha 模式,用于描述像素颜色值和其 Alpha 通道(透明度)之间的关系。

在非预乘 Alpha (Straight or Unpremultiplied Alpha) 图像中,每个颜色分量(红、绿、蓝)是独立于 Alpha 值的。而在预乘 Alpha 图像中,每个颜色分量已经被其对应的 Alpha 通道所乘过了。这意味着,如果一个像素的 Alpha 值不是100%(即不完全不透明),那么它的颜色值也会被相应的淡化。

例如,在预乘 Alpha 的图像中,一个半透明的红色像素(Alpha = 0.5)的颜色值已经进行了 Alpha 混合处理,实际存储的是半强度的红色而不是全强度的红色。

使用 D2D1_ALPHA_MODE_PREMULTIPLIED 作为呈现目标或纹理的 Alpha 模式时,Direct2D 在进行绘制和混合操作时会假设输入的颜色数据已经是预乘的,并据此进行正确的透明度计算。这种模式有助于减少在执行多次透明度叠加时出现的颜色失真现象,尤其是在图形管线中有多层透明内容需要正确融合时。

2.Direct3D10中预乘设置

在Direct3D 10中处理透明度预乘主要涉及到纹理的格式选择和渲染状态的设置。以下是如何正确设置以实现Alpha预乘:

  1. 纹理格式选择

    • 如果要使用预乘Alpha,确保你的纹理包含预乘过的颜色值,通常选用支持预乘Alpha的纹理格式如 DXGI_FORMAT_B8G8R8A8_UNORM_SRGBDXGI_FORMAT_B8G8R8A8_UNORM 并且在加载或创建时已经进行了预乘。
  2. 像素着色器输出

    • 在像素着色器中,如果你从非预乘纹理采样并希望硬件执行预乘混合,你需要手动将每个颜色通道与Alpha通道相乘后输出到输出合并阶段(OM)。
  3. 渲染状态设置

    • 对于预乘Alpha的纹理,不需要特殊的混合模式,因为颜色值本身就是预乘后的结果,可以直接进行常规的混合操作。
    • 确保blend state不是针对非预乘Alpha设计的。对于预乘Alpha,通常会设置 blend state 的源因子为 (SrcAlpha, One)(One, SrcAlpha) 来利用预乘的颜色信息。
  4. 创建Blend State对象

    • 使用 ID3D10Device::CreateBlendState 方法创建一个blend state对象,设置其描述符(D3D10_BLEND_DESC)中的 SrcBlendDestBlend 成分来匹配预乘Alpha所需的混合模式。

例如,若要设置预乘Alpha的blend state,可以这样做:

D3D10_BLEND_DESC blendDesc;
ZeroMemory(&blendDesc, sizeof(blendDesc));
blendDesc.AlphaToCoverageEnable = FALSE;
blendDesc.IndependentBlendEnable = FALSE;
blendDesc.RenderTarget[0].BlendEnable = TRUE;
blendDesc.RenderTarget[0].SrcBlend = D3D10_BLEND_ONE; // 源颜色使用预乘Alpha,即自身
blendDesc.RenderTarget[0].DestBlend = D3D10_BLEND_INV_SRC_ALPHA; // 目标颜色使用源颜色Alpha的反向值
blendDesc.RenderTarget[0].BlendOp = D3D10_BLEND_OP_ADD;
blendDesc.RenderTarget[0].SrcBlendAlpha = D3D10_BLEND_ONE;
blendDesc.RenderTarget[0].DestBlendAlpha = D3D10_BLEND_ZERO;
blendDesc.RenderTarget[0].BlendOpAlpha = D3D10_BLEND_OP_ADD;
blendDesc.RenderTarget[0].RenderTargetWriteMask = D3D10_COLOR_WRITE_ENABLE_ALL;

// 创建Blend State对象
ID3D10BlendState* pBlendState;
HRESULT hr = m_pDevice->CreateBlendState(&blendDesc, &pBlendState);
if (SUCCEEDED(hr))
{
    // 设置当前blend状态
    m_pDevice->OMSetBlendState(pBlendState, 0, 0xffffffff);
}

在绘制带预乘Alpha的纹理时,应用上述设置,并确保所有的颜色数据都已正确地进行了预乘计算。

3.清除背景颜色

在Direct2D中,您可以创建一个完全透明的背景来绘制对象。这通常是通过设置渲染目标(RenderTarget)的背景色或者清除渲染目标时指定完全透明的颜色来实现的。

  1. 设置背景色
    如果您是在窗口或位图上进行绘制,并希望其背景为全透明,首先确保您的渲染目标支持透明度,例如使用DXGI_FORMAT_B8G8R8A8_UNORM格式。然后,不需特别去“设置”背景色为透明,而是应当避免填充背景色,因为默认情况下未绘制区域就是透明的。

  2. 清除渲染目标
    若要清空整个渲染目标到透明状态,可以调用ID2D1RenderTarget::Clear()方法,并传入一个包含透明度值的颜色结构。比如,如果你使用的是包含Alpha通道的颜色结构(如D2D1_COLOR_F),则可以这样设置:

D2D1_COLOR_F clearColor = D2D1::ColorF(0.0f, 0.0f, 0.0f, 0.0f); // RGBA,其中A=0表示全透明
d2dRenderTarget->Clear(clearColor);
  1. 窗口透明
    对于窗口级别的透明,还需要启用Windows Aero主题并且利用Desktop Window Manager (DWM) 的效果,可以通过启用DWM的透明效果来实现窗口内容的透明,同时 Direct2D 内容也会正确显示其透明度。

  2. 层叠顺序与混合模式
    要使Direct2D绘制的对象具有透明效果,不仅仅是背景透明,还涉及到绘制顺序以及绘制过程中使用的混合模式。通常,Direct2D会按照后绘制的内容覆盖前面内容的原则处理透明度,因此要确保正确的绘制顺序以实现预期的透明叠加效果。

总结起来,在Direct2D中绘制对象时,可以直接或间接地让背景保持透明,并且可以灵活控制每个绘制对象自身的透明度。文章来源地址https://www.toymoban.com/news/detail-823499.html

到了这里,关于在direct3D中,透明度处理和D2D1_ALPHA_MODE_PREMULTIPLIED含义?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Direct3D 12——灯光——光照模型的概述

    将之前所述的所有光照内容都结合起来,即表面反射的光量相当于环境反射光、漫反射光以及 镜面反射光的光量总和。 1.环境光 C a :模拟经表面反射的间接光量。 2.漫反射光 C d :对进入介质内部,又经过表面下吸收而最终散射岀表面的光进行模拟。由于对表 面下的散射光

    2023年04月16日
    浏览(33)
  • Direct3D 12——计算着色器——计算着色器概念

    计算着色器虽然是一种可编程的着色器,但Direct3D并没有将它直接归为渲染流水线中的一部分。虽然如此,但位于流水线之外的计算着色器却可以读写GPU资源。从本质上来说,计算着 色器能够使我们访问GPU来实现数据并行算法,而不必渲染出任何图形。由于计算着色器是Dir

    2024年02月03日
    浏览(30)
  • Character Animation With Direct3D 读书笔记

    2D动画:循环播放多张图片 3D动画: 骨骼动画、变形动画 Win32 应用程序 Application类:处理主程序循环,图形设备的初始化 Init:加载资源并创建图形设备 Update:更新游戏世界,移动对象,更新物理引擎 Render:渲染所有对象,并将结果呈现给屏幕 Quit Cleanup DirectX 渲染循环:

    2024年02月12日
    浏览(30)
  • 一、D3D12学习笔记——初始化Direct3D

    工厂类IDXGIFactory4,这个类有两个作用: 1.枚举适配器(显卡); 2.创建交换链 这个类对象的创建如下: 用这个对象mdxgiFactory枚举我们可以使用的显卡等适配器: 对于一个选定的适配器pIAdapter,拿着它去创建设备 IID_PPV_ARGS这个宏实际包含了两个东西,uuid的COM ID和对象的指针

    2024年02月10日
    浏览(38)
  • d3d12龙书阅读----Direct3D的初始化

    使用d3d我们可以对gpu进行控制与编程,以硬件加速的方式来完成3d场景的渲染,d3d层与硬件驱动会将相应的代码转换成gpu可以执行的机器指令,与之前的版本相比,d3d12大大减少了cpu的开销,同时也改进了对多线程的支持,但是使用的api也更加复杂。 接下来,我们将先介绍在

    2024年03月12日
    浏览(35)
  • VTK————3D模型的旋转、交互、透明度设置

    旋转模型的话可以用到以下例程,但是每次设置选择坐标时,都是累加的。可以通过SetOrientation来将模型方向设为初试方向。如果三个坐标都使用较大值来进行旋转,那么由于累加的特性。模型会在空间内进行大幅度的旋转和位移,这是需要注意的。 也可以通过设置interacto

    2024年02月10日
    浏览(44)
  • 三维引擎基础概述(Direct3D、OpenGL、UE、U3D、threejs等)

    一般而言,三维引擎是在三维底层图形技术的基础上,封装硬件操作与三维图形算法,形成普遍意义上的三维交互引擎,提供给开发者一个简单易用、功能丰富的三维图形环境,在此基础上进行虚拟现实、三维交互、可视化管理平台二次开发等,极大提高开发效率。 【底层图

    2024年02月11日
    浏览(34)
  • DirectX12_Windows_GameDevelop_3:Direct3D的初始化

    查看龙书时发现, 第四章介绍预备知识的代码不太利于学习 。因为它不像是LearnOpenGL那样从头开始一步一步教你敲代码,导致你没有一种整体感。 如果你把它当作某一块的代码进行学习,你跟着敲会发现,总有几个变量是没有定义的。这是因为书上的代码都是把框架里的某

    2024年02月08日
    浏览(31)
  • 小程序对色值透明度的处理

    在微信小程序中,可以使用CSS样式来实现对色值透明度的显示。下面是两种常用的实现方式: 1、使用rgba()函数: 2、使用十六进制颜色值: 在上述代码中, .element 是你想要设置透明度的元素的选择器,可以根据实际情况修改。通过设置透明度,可以让元素的背景颜色透出底

    2024年02月13日
    浏览(34)
  • web3D三维引擎(Direct3D、OpenGL、UE、U3D、threejs)基础扫盲

    三维引擎是指用于创建和渲染三维图形的软件框架。它们通常提供了图形处理、物理模拟、光照、碰撞检测等功能,帮助开发者构建逼真的三维场景和交互体验。在这里,我将为您详细介绍一些常见的三维引擎,包括Direct3D、OpenGL、Unreal Engine、Unity3D和Three.js。 Direct3D是由微软

    2024年02月11日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包