DirectX11 裁剪像素
裁剪像素
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 裁剪像素相关推荐
- D3D11的像素裁剪
本篇将如何快速有效的裁剪绘制到屏幕上的像素. 如果α值接近0时,如何使用着色器文件中的clip()函数来阻止处理当前像素. 一个使用clip函数的实例: clip(alpha - .25); 如果α值 ...
- unity加载sprite_Unity 分离贴图 alpha 通道实践
引言 在做手机游戏时可能会遇到这些问题: UI 同学天天抱怨 iOS 上一些透明贴图压缩后模糊不堪 一些古早的 Android 手机上同样的贴图吃内存超过其他手机数倍,游戏经常闪退 这篇文章给出了一种 ...
- Unity 分离贴图 alpha 通道实践
在做手机游戏时可能会遇到这些问题: UI 同学天天抱怨 iOS 上一些透明贴图压缩后模糊不堪 一些古早的 Android 手机上同样的贴图吃内存超过其他手机数倍,游戏经常闪退 这篇文章给出了一种手机游 ...
- Avoiding 16 Common OpenGL Pitfalls(避免 16 个常见的 OpenGL 陷阱)
前言 避免 16 个常见的 OpenGL 陷阱原文 Avoiding 16 Common OpenGL Pitfalls Copyright 1998, 1999 by Mark J. Kilgard ...
- 失传万年的PS致富经典(一)
PS常用快捷键 失传万年的PS致富经典(一):失传万年的PS致富经典(一) 失传万年的PS致富经典(二):失传万年的PS致富经典(二) 失传万年的PS致富经典(三): 失传万年的PS致富经典(三) 失 ...
- Photoshop中裁剪工具的使用及扩展
欢迎观看 Photoshop 入门教程,您将通过这些教程学习 Photoshop 的基本工具和使用技巧.小编将为您介绍 Photoshop 工作区,并向您展示Ps中裁剪工具的使用方法. 裁剪和拉直图像 ...
- osgEarth测高程方法
osgEarth是基于三维引擎osg开发的三维数字地球引擎库,在osg基础上实现了瓦片调度插件,可选的四叉树调度插件,更多的地理数据加载插件(包括GDAL,ogr,WMS,TMS,VPB,filesy ...
- 工业级静默活体检测开源算法技术解析记录
工业级静默活体检测开源算法技术解析(小视科技分享) 视频链接: https://www.bilibili.com/video/BV1qZ4y1T7CH 相关背景 定义:无感鉴别镜头前人脸的真伪,人脸识 ...
- 【图像超分辨率】Accurate Image Super-Resolution Using Very Deep Convolutional Networks
Accurate Image Super-Resolution Using Very Deep Convolutional Networks VDSR Accurate Image Super-Res ...
最新文章
- 剑指offer:机器人的运动范围
- 杭电oj2035c语言答案,杭电oj 2035
- ScriptManager.RegisterStartupScript方法和Page.ClientScript.RegisterStartupScript() 区别
- AI理论知识整理(1)-数列(1)
- boost::gil::scoped_channel_value用法的测试程序
- 开源NAS系统使用总结
- 图论及其应用 2018年期末考试 答案总结
- Latex 图注设置(图1:改为图1-1)
- Java ques: java.sql.SQLException: Can not issue data manipulation statements with executeQuery().
- ElasticSearch高级功能的使用(模版查询、地理位置查询等)
- prisma orm_如何使用Node.js和Prisma构建GraphQL服务器
- C#学校有近千名学生,在操作上排队,5人一行余2人,7人一行余3人,3人一行余1人,编写一个程序求该校的学生人数。
- js unshift性能分析
- Android图片压缩尺寸和质量
- 为什么都是技术合伙人被踢出局?
- 十年后的互联网,云计算成制胜法宝
- 如何在AutoCAD中实现鼠标双击事件
- What is modularity And how to achieve modularity
- js 原子级操作_原子操作与同步机制
- 计算机视觉-图像的SIFT特征(尺度空间)