裁剪像素

1. 为什么需要裁剪像素?

有时,我们希望完全丢弃某个源像素,使它不再接受后续处理。这一工作可以由HLSL的内置函数clip(x)来实现。该函数只能在像素着色器中使用,当x<0时丢弃当前像素,使之不再接受后续处理。该函数在渲染铁丝网纹理时非常有用。也就是说,它非常适合于渲染那些完全不透明或者完全透明的像素。


(带有alpha通道的铁丝网纹理。clip函数将丢弃那些带有黑色alpha值的像素,不对这些像素进行绘制;只有铁丝网部分会保留下来。从本质上讲,alpha通道剔除了纹理中的“非铁丝网”像素。)

2. 裁剪像素的实现

在像素着色器中,我们攫取了漫反射纹理的alpha分量。当它的值接近于0时,我们将该像素视为完全透明,丢弃该像素,不再对它进行后续处理。

float4 PS(VertexOut pin, uniform int gLightCount, uniform bool gUseTexure,uniform bool gAlphaClip, uniform bool gFogEnabled) : SV_Target
{// 插值后的法线需要重新规范化pin.NormalW = normalize (pin.NormalW);// toEye矢量用于光照计算float3 toEye = gEyePosW - pin.PosW;// 保存表面顶点离开相机的距离信息float distToEye = length(toEye);// 规范化toEye /= distToEye;// 初始化纹理颜色float4 texColor = float4(1, 1, 1, 1);if (gUseTexure){// 采样纹理texColor = gDiffuseMap.Sample(samAnisotropic, pin.Tex);if (gAlphaClip){// 如果纹理的alpha<0.1,则丢弃像素。// 注意,我们应该尽可能早地进行这个测试,这样我们就可以及早退出// shader,忽略其余shader代码。clip(texColor.a - 0.1f);}}
…

因为我们可能只在某些几何体上进行裁剪操作,所以只有在参数gAlphaClip设置为true的情况下我们才进行裁剪,这样我们就可以根据特定的shader切换裁剪。注意,使用混合也可以得到同样的效果,只是这种(裁剪)方式的运行效率更高一些。这种方式即不需要进行任何混合计算,也不需要考虑物体的绘制顺序。而且,它可以在像素着色器中尽早丢弃像素,避免执行不必要的像素着色器指令(被丢弃的像素不会参与任何计算)。

注意:由于过滤器的作用,alpha通道可能会变得有些模糊,所以当裁剪像素时,你应该保留一些容差值。例如,裁剪alpha值接近于0的像素,而不必让alpha值精确为0。

下图是“Blend”演示程序的屏幕截图。它使用透明混合绘制了半透明的水体,使用了新的铁丝网纹理,并且在像素着色器中加入了裁剪测试功能。另一个值得注意的地方是,由于我们现在要透过立方体看到背面的铁丝网纹理,所以我们希望禁用背面消隐功能:

D3D11_RASTERIZER_DESC noCullDesc;
ZeroMemory(&noCullDesc, sizeof(D3D11_RASTERIZER_DESC));
noCullDesc.FillMode  = D3D11_FILL_SOLID;
noCullDesc.CullMode = D3D11_CULL_NONE;
noCullDesc.FrontCounterClockwise = false;
noCullDesc.DepthClipEnable = true;
ID3D11RasterizerState * NoCullRS;
HR(device->CreateRasterizerState(&noCullDesc, &NoCullRS));
…
// 因为铁丝网纹理包含透明区域,我们可以透过立方体看到背面的三角形,所以我们希望禁用背面消隐功能
md3dImmediateContext->RSSetState(NoCullRS);
boxTech->GetPassByInde x(p)->Apply(0, md3dImmediateContext);
md3dImmediateContext->DrawIndexed(36, 0, 0);
// 恢复为默认的渲染状态
md3dImmediateContext->RSSetState(0);

DirectX11 裁剪像素相关推荐

  1. D3D11的像素裁剪

    本篇将如何快速有效的裁剪绘制到屏幕上的像素. 如果α值接近0时,如何使用着色器文件中的clip()函数来阻止处理当前像素. 一个使用clip函数的实例: clip(alpha - .25); 如果α值 ...

  2. unity加载sprite_Unity 分离贴图 alpha 通道实践

    引言 在做手机游戏时可能会遇到这些问题: UI 同学天天抱怨 iOS 上一些透明贴图压缩后模糊不堪 一些古早的 Android 手机上同样的贴图吃内存超过其他手机数倍,游戏经常闪退 这篇文章给出了一种 ...

  3. Unity 分离贴图 alpha 通道实践

    在做手机游戏时可能会遇到这些问题: UI 同学天天抱怨 iOS 上一些透明贴图压缩后模糊不堪 一些古早的 Android 手机上同样的贴图吃内存超过其他手机数倍,游戏经常闪退 这篇文章给出了一种手机游 ...

  4. Avoiding 16 Common OpenGL Pitfalls(避免 16 个常见的 OpenGL 陷阱)

    前言 避免 16 个常见的 OpenGL 陷阱原文 Avoiding 16 Common OpenGL Pitfalls Copyright 1998, 1999 by Mark J. Kilgard ...

  5. 失传万年的PS致富经典(一)

    PS常用快捷键 失传万年的PS致富经典(一):失传万年的PS致富经典(一) 失传万年的PS致富经典(二):失传万年的PS致富经典(二) 失传万年的PS致富经典(三): 失传万年的PS致富经典(三) 失 ...

  6. Photoshop中裁剪工具的使用及扩展

    欢迎观看 Photoshop 入门教程,您将通过这些教程学习 Photoshop 的基本工具和使用技巧.小编将为您介绍 Photoshop 工作区,并向您展示Ps中裁剪工具的使用方法. 裁剪和拉直图像 ...

  7. osgEarth测高程方法

    osgEarth是基于三维引擎osg开发的三维数字地球引擎库,在osg基础上实现了瓦片调度插件,可选的四叉树调度插件,更多的地理数据加载插件(包括GDAL,ogr,WMS,TMS,VPB,filesy ...

  8. 工业级静默活体检测开源算法技术解析记录

    工业级静默活体检测开源算法技术解析(小视科技分享) 视频链接: https://www.bilibili.com/video/BV1qZ4y1T7CH 相关背景 定义:无感鉴别镜头前人脸的真伪,人脸识 ...

  9. 【图像超分辨率】Accurate Image Super-Resolution Using Very Deep Convolutional Networks

    Accurate Image Super-Resolution Using Very Deep Convolutional Networks VDSR Accurate Image Super-Res ...

最新文章

  1. 剑指offer:机器人的运动范围
  2. 杭电oj2035c语言答案,杭电oj 2035
  3. ScriptManager.RegisterStartupScript方法和Page.ClientScript.RegisterStartupScript() 区别
  4. AI理论知识整理(1)-数列(1)
  5. boost::gil::scoped_channel_value用法的测试程序
  6. 开源NAS系统使用总结
  7. 图论及其应用 2018年期末考试 答案总结
  8. Latex 图注设置(图1:改为图1-1)
  9. Java ques: java.sql.SQLException: Can not issue data manipulation statements with executeQuery().
  10. ElasticSearch高级功能的使用(模版查询、地理位置查询等)
  11. prisma orm_如何使用Node.js和Prisma构建GraphQL服务器
  12. C#学校有近千名学生,在操作上排队,5人一行余2人,7人一行余3人,3人一行余1人,编写一个程序求该校的学生人数。
  13. js unshift性能分析
  14. Android图片压缩尺寸和质量
  15. 为什么都是技术合伙人被踢出局?
  16. 十年后的互联网,云计算成制胜法宝
  17. 如何在AutoCAD中实现鼠标双击事件
  18. What is modularity And how to achieve modularity
  19. js 原子级操作_原子操作与同步机制
  20. 计算机视觉-图像的SIFT特征(尺度空间)

热门文章

  1. 今天我们来聊聊,如何做好第三方系统对接
  2. 【信息检索】Java简易搜索引擎原理及实现(三)B+树索引和轮排索引结构
  3. Confidence Rekindles In Credit Mkts
  4. 记录AK7739-TDM调试
  5. Linux ACLs
  6. 在windows中使用bat脚本获取linux服务器文件
  7. 华为 DAYU 详细介绍
  8. [java]轻量级隔离化的excel导入导出的导入导出,解放导入导出冗余代码(有github源码)
  9. Viz-artist常用脚本操作
  10. 这份职业我有多少期许