首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在XNA 4.0 winforms中使用Nvidia FXAA(着色器抗锯齿)的示例?

在XNA 4.0 WinForms中使用Nvidia FXAA(着色器抗锯齿)的示例,可以通过以下步骤实现:

  1. 首先,在XNA 4.0项目中添加一个新的着色器。在解决方案资源管理器中,右键单击项目名称,然后选择“添加”>“新项目”>“XNA”>“着色器”。
  2. 将新添加的着色器文件重命名为“FXAA.fx”。
  3. 在FXAA.fx文件中,添加以下代码:
代码语言:csharp
复制

float4x4 World;

float4x4 View;

float4x4 Projection;

texture2D Texture;

sampler2D TextureSampler = sampler_state

{

代码语言:txt
复制
Texture =<Texture>;
代码语言:txt
复制
AddressU = CLAMP;
代码语言:txt
复制
AddressV = CLAMP;
代码语言:txt
复制
Filter = MIN_MAG_MIP_LINEAR;

};

struct VertexShaderInput

{

代码语言:txt
复制
float4 Position : POSITION0;
代码语言:txt
复制
float2 TextureCoordinate : TEXCOORD0;

};

struct VertexShaderOutput

{

代码语言:txt
复制
float4 Position : POSITION0;
代码语言:txt
复制
float2 TextureCoordinate : TEXCOORD0;

};

VertexShaderOutput VertexShaderFunction(VertexShaderInput input)

{

代码语言:txt
复制
VertexShaderOutput output;
代码语言:txt
复制
output.Position = mul(input.Position, World);
代码语言:txt
复制
output.Position = mul(output.Position, View);
代码语言:txt
复制
output.Position = mul(output.Position, Projection);
代码语言:txt
复制
output.TextureCoordinate = input.TextureCoordinate;
代码语言:txt
复制
return output;

}

float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0

{

代码语言:txt
复制
float2 texelSize = float2(1.0f / 1280.0f, 1.0f / 720.0f);
代码语言:txt
复制
float3 color = float3(0.0f, 0.0f, 0.0f);
代码语言:txt
复制
float3 luma = float3(0.299f, 0.587f, 0.114f);
代码语言:txt
复制
float3 nw = tex2D(TextureSampler, input.TextureCoordinate + float2(-1.0f, -1.0f) * texelSize).rgb;
代码语言:txt
复制
float3 n = tex2D(TextureSampler, input.TextureCoordinate + float2(0.0f, -1.0f) * texelSize).rgb;
代码语言:txt
复制
float3 ne = tex2D(TextureSampler, input.TextureCoordinate + float2(1.0f, -1.0f) * texelSize).rgb;
代码语言:txt
复制
float3 w = tex2D(TextureSampler, input.TextureCoordinate + float2(-1.0f, 0.0f) * texelSize).rgb;
代码语言:txt
复制
float3 m = tex2D(TextureSampler, input.TextureCoordinate).rgb;
代码语言:txt
复制
float3 e = tex2D(TextureSampler, input.TextureCoordinate + float2(1.0f, 0.0f) * texelSize).rgb;
代码语言:txt
复制
float3 sw = tex2D(TextureSampler, input.TextureCoordinate + float2(-1.0f, 1.0f) * texelSize).rgb;
代码语言:txt
复制
float3 s = tex2D(TextureSampler, input.TextureCoordinate + float2(0.0f, 1.0f) * texelSize).rgb;
代码语言:txt
复制
float3 se = tex2D(TextureSampler, input.TextureCoordinate + float2(1.0f, 1.0f) * texelSize).rgb;
代码语言:txt
复制
float lumaNw = dot(nw, luma);
代码语言:txt
复制
float lumaN = dot(n, luma);
代码语言:txt
复制
float lumaNe = dot(ne, luma);
代码语言:txt
复制
float lumaW = dot(w, luma);
代码语言:txt
复制
float lumaM = dot(m, luma);
代码语言:txt
复制
float lumaE = dot(e, luma);
代码语言:txt
复制
float lumaSw = dot(sw, luma);
代码语言:txt
复制
float lumaS = dot(s, luma);
代码语言:txt
复制
float lumaSe = dot(se, luma);
代码语言:txt
复制
float lumaMin = min(lumaM, min(min(lumaNw, lumaN), min(lumaNe, min(lumaW, min(lumaE, min(lumaSw, min(lumaS, lumaSe)))))));
代码语言:txt
复制
float lumaMax = max(lumaM, max(max(lumaNw, lumaN), max(lumaNe, max(lumaW, max(lumaE, max(lumaSw, max(lumaS, lumaSe)))))));
代码语言:txt
复制
float lumaRange = lumaMax - lumaMin;
代码语言:txt
复制
if (lumaRange < max(0.001f, 0.03f * (lumaMax + lumaMin)))
代码语言:txt
复制
{
代码语言:txt
复制
    color = m;
代码语言:txt
复制
}
代码语言:txt
复制
else
代码语言:txt
复制
{
代码语言:txt
复制
    float3 nwDir = normalize(nw - m);
代码语言:txt
复制
    float3 nDir = normalize(n - m);
代码语言:txt
复制
    float3 neDir = normalize(ne - m);
代码语言:txt
复制
    float3 wDir = normalize(w - m);
代码语言:txt
复制
    float3 eDir = normalize(e - m);
代码语言:txt
复制
    float3 swDir = normalize(sw - m);
代码语言:txt
复制
    float3 sDir = normalize(s - m);
代码语言:txt
复制
    float3 seDir = normalize(se - m);
代码语言:txt
复制
    float3 dir = nwDir + nDir + neDir + wDir + eDir + swDir + sDir + seDir;
代码语言:txt
复制
    float dirReduce = max((lumaRange * 0.5f) / (dot(dir, dir) + 0.001f), 1.0f);
代码语言:txt
复制
    nwDir *= dirReduce;
代码语言:txt
复制
    nDir *= dirReduce;
代码语言:txt
复制
    neDir *= dirReduce;
代码语言:txt
复制
    wDir *= dirReduce;
代码语言:txt
复制
    eDir *= dirReduce;
代码语言:txt
复制
    swDir *= dirReduce;
代码语言:txt
复制
    sDir *= dirReduce;
代码语言:txt
复制
    seDir *= dirReduce;
代码语言:txt
复制
    float3 sampleNw = tex2D(TextureSampler, input.TextureCoordinate + float2(-1.0f, -1.0f) * texelSize * dirReduce).rgb;
代码语言:txt
复制
    float3 sampleN = tex2D(TextureSampler, input.TextureCoordinate + float2(0.0f, -1.0f) * texelSize * dirReduce).rgb;
代码语言:txt
复制
    float3 sampleNe = tex2D(TextureSampler, input.TextureCoordinate + float2(1.0f, -1.0f) * texelSize * dirReduce).rgb;
代码语言:txt
复制
    float3 sampleW = tex2D(TextureSampler, input.TextureCoordinate + float2(-1.0f, 0.0f) * texelSize * dirReduce).rgb;
代码语言:txt
复制
    float3 sampleE = tex2D(TextureSampler, input.TextureCoordinate + float2(1.0f, 0.0f) * texelSize * dirReduce).rgb;
代码语言:txt
复制
    float3 sampleSw = tex2D(TextureSampler, input.TextureCoordinate + float2(-1.0f, 1.0f) * texelSize * dirReduce).rgb;
代码语言:txt
复制
    float3 sampleS = tex2D(TextureSampler, input.TextureCoordinate + float2(0.0f, 1.0f) * texelSize * dirReduce).rgb;
代码语言:txt
复制
    float3 sampleSe = tex2D(TextureSampler, input.TextureCoordinate + float2(1.0f, 1.0f) * texelSize * dirReduce).rgb;
代码语言:txt
复制
    float3 colorNw = (nw - m) / lumaRange;
代码语言:txt
复制
    float3 colorN = (n - m) / lumaRange;
代码语言:txt
复制
    float3 colorNe = (ne - m) / lumaRange;
代码语言:txt
复制
    float3 colorW = (w - m) / lumaRange;
代码语言:txt
复制
    float3 colorE = (e - m) / lumaRange;
代码语言:txt
复制
    float3 colorSw = (sw - m) / lumaRange;
代码语言:txt
复制
    float3 colorS = (s - m) / lumaRange;
代码语言:txt
复制
    float3 colorSe = (se - m) / lumaRange;
代码语言:txt
复制
    float3 colorNwDir = normalize(colorNw - colorM);
代码语言:txt
复制
    float3 colorNDir = normalize(colorN - colorM);
代码语言:txt
复制
    float3 colorNedDir = normalize(colorNe - colorM);
代码语言:txt
复制
    float3 colorWDir = normalize(colorW - colorM);
代码语言:txt
复制
    float3 colorEDir = normalize(colorE - colorM);
代码语言:txt
复制
    float3 colorSwDir = normalize(colorSw - colorM);
代码语言:txt
复制
    float3 colorSDir = normalize(colorS - colorM);
代码语言:txt
复制
    float3 colorSeDir = normalize(colorSe - colorM);
代码语言:txt
复制
    float3 colorDir = colorNwDir + colorNDir + colorNedDir + colorWDir + colorEDir + colorSwDir + colorSDir + colorSeDir;
代码语言:txt
复制
    float colorDirReduce = max((lumaRange * 0.5f) / (dot(colorDir, colorDir) + 0.001f), 1.0f);
代码语言:txt
复制
    colorNwDir *= colorDirReduce;
代码语言:txt
复制
    colorNDir *= colorDirReduce;
代码语言:txt
复制
    colorNedDir *= colorDirReduce;
代码语言:txt
复制
    colorWDir *= colorDirReduce;
代码语言:txt
复制
    colorEDir *= colorDirReduce;
代码语言:txt
复制
    colorSwDir *= colorDirReduce;
代码语言:txt
复制
    colorSDir *= colorDirReduce;
代码语言:txt
复制
    colorSeDir *= colorDirReduce;
代码语言:txt
复制
    float3 sampleColorNw = tex2D(TextureSampler, input.TextureCoordinate + float2(-1.0f, -1.0f) * texelSize * colorDirReduce).rgb;
代码语言:txt
复制
    float3 sampleColorN = tex2D(TextureSampler, input.TextureCoordinate + float2(0.0f, -1.0f) * texelSize * colorDirReduce).rgb;
代码语言:txt
复制
    float3 sampleColorNe = tex2D(TextureSampler, input.TextureCoordinate + float2(1.0f, -1.0f) * texelSize * colorDirReduce).rgb;
代码语言:txt
复制
    float3 sampleColorW = tex2D(TextureSampler, input.TextureCoordinate + float2(-1.0f, 0.0f) * texelSize * colorDirReduce).rgb;
代码语言:txt
复制
    float3 sampleColorE = tex2D(TextureSampler, input.TextureCoordinate + float2(1.0f, 0.0f) * texelSize * colorDirReduce).rgb;
代码语言:txt
复制
    float3 sampleColorSw = tex2D(TextureSampler, input.TextureCoordinate + float2(-1.0f, 1.0f) * texelSize * colorDirReduce).rgb;
代码语言:txt
复制
    float3 sampleColorS = tex2D(TextureSampler, input.TextureCoordinate + float2(0.0f, 1.0f) * texelSize * colorDirReduce).rgb;
代码语言:txt
复制
    float3 sampleColorSe = tex2D(TextureSampler, input.TextureCoordinate + float2(1.0f, 1.0f) * texelSize * colorDirReduce).rgb;
代码语言:txt
复制
    float3 colorLumaNw = (sampleColorNw - m) / lumaRange;
代码语言:txt
复制
    float3 colorLumaN = (sampleColorN - m) / lumaRange;
代码语言:txt
复制
    float3 colorLumaNe = (sampleColorNe - m) / lumaRange;
代码语言:txt
复制
    float3 colorLumaW = (sampleColorW - m) / lumaRange;
代码语言:txt
复制
    float3 colorLumaE = (sampleColorE - m) / lumaRange;
代码语言:txt
复制
    float3 colorLumaSw = (sampleColorSw - m) / lumaRange;
代码语言:txt
复制
    float3 colorLumaS = (sampleColorS - m) / lumaRange;
代码语言:txt
复制
    float3 colorLumaSe = (sampleColorSe - m) / lumaRange;
代码语言:txt
复制
    float3 colorLumaSum = colorLumaNw + colorLumaN + colorLumaNe + colorLumaW + colorLumaE + colorLumaSw + colorLumaS + colorLumaSe;
代码语言:txt
复制
    float3 colorLumaAvg = colorLumaSum / 8.0f;
代码语言:txt
复制
    float3 colorLumaMin = min(min(min(colorLumaNw, colorLumaN), min(colorLumaNe, colorLumaW)), min(colorLumaE, min(colorLumaSw, min(colorLumaS, colorLumaSe))));
代码语言:txt
复制
    float3 colorLumaMax = max(max(max(colorLumaNw, colorLumaN), max(colorLumaNe, colorLumaW)), max(colorLumaE, max(colorLumaSw, max(colorLumaS, colorLumaSe))));
代码语言:txt
复制
    float3 colorLumaRange = colorLumaMax - colorLumaMin;
代码语言:txt
复制
    float3 colorLumaAvgRange = colorLumaRange / 8.0f;
代码语言:txt
复制
    float3 colorLumaAvgNw = (colorLumaNw - colorLumaAvg) / colorLumaAvgRange;
代码语言:txt
复制
    float3 colorLumaAvgN = (colorLumaN - colorLumaAvg) / colorLumaAvgRange;
代码语言:txt
复制
    float3 colorLumaAvgNe = (colorLumaNe - colorLumaAvg) / colorLumaAvgRange;
代码语言:txt
复制
    float3 colorLumaAvgW = (colorLumaW - colorLumaAvg) / colorLumaAvgRange;
代码语言:txt
复制
    float3 colorLumaAvgE = (colorLumaE - colorLumaAvg) / colorLumaAvgRange;
代码语言:txt
复制
    float3 colorLumaAvgSw = (colorLumaSw - colorLumaAvg) / colorLumaAvgRange;
代码语言:txt
复制
    float3 colorLumaAvgS = (colorLumaS - colorLumaAvg) / colorLumaAvgRange;
代码语言:txt
复制
    float3 colorLumaAvgSe = (colorLumaSe - colorLumaAvg) / colorLumaAvgRange;
代码语言:txt
复制
    float3 colorLumaAvgSum = colorLumaAvgNw + colorLumaAvgN + colorLumaAvgNe + colorLumaAvgW + colorLumaAvgE + colorLumaAvgSw + colorLumaAvgS + colorLumaAvgSe;
代码语言:txt
复制
    float3 colorLumaAvgSumDiv = colorLumaAvgSum / 8.0f;
代码语言:txt
复制
    float3 colorLumaAvgRangeDiv = colorLumaRange / 8.0f;
代码语言:txt
复制
    float3 colorLumaAvgNwDiv = (colorLumaNw - colorLumaAvg) / colorLumaAvgRangeDiv;
代码语言:txt
复制
    float3 colorLumaAvgNDiv = (colorLumaN - colorLumaAvg) / colorLumaAvgRangeDiv;
代码语言:txt
复制
    float3 colorLumaAvgNeDiv = (colorLumaNe - colorLumaAvg) / colorLumaAvgRangeDiv;
代码语言:txt
复制
    float3 colorLumaAvgWDiv = (colorLumaW - colorLumaAvg) / colorLumaAvgRangeDiv;
代码语言:txt
复制
    float3 colorLumaAvgEDiv = (colorLumaE - colorLumaAvg) / colorLumaAvgRangeDiv;
代码语言:txt
复制
    float3 colorLumaAvgSwDiv = (colorLumaSw - colorLumaAvg) / colorLumaAvgRangeDiv;
代码语言:txt
复制
    float3 colorLumaAvgSDiv = (colorLumaS - colorLumaAvg) / colorLumaAvgRangeDiv;
代码语言:txt
复制
    float3 colorLumaAvgSeDiv = (colorLumaSe - colorLumaAvg) / colorLumaAvgRangeDiv;
代码语言:txt
复制
    float3 colorLumaAvgSumDiv = colorLumaAvgNwDiv + colorLumaAvgNDiv + colorLumaAvgNeDiv + colorLumaAvgWDiv + colorLumaAvgEDiv + colorLumaAvgSwDiv + colorLumaAvgSDiv + colorLumaAvgSeDiv;
代码语言:txt
复制
    float3 colorLumaAvgSumDivDiv = colorLumaAvgSumDiv / 8.0f;
代码语言:txt
复制
    float3 colorLumaAvgNwDiv = colorLumaAvgNwDiv / colorLumaAvgSumDiv;
代码语言:txt
复制
    float3 colorLumaAvgNDiv = colorLumaAvgN / colorLumaAvgSumDiv;
代码语言:txt
复制
    float3 colorLumaAvgNeDiv = colorLumaAvgNeDiv / colorLumaAvgSumDiv;
代码语言:txt
复制
    float3 colorLumaAvgWDiv = colorLumaAvgW / colorLumaAvgSumDiv;
代码语言:txt
复制
    float3 colorLumaAvgEDiv = colorLumaAvgE / colorLumaAvgSumDiv;
代码语言:txt
复制
    float3 colorLumaAvgSwDiv = colorLumaAvgSw / colorL
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

音视频面试题集锦第 21 期

1、纹理抗锯齿有哪些算法?各有哪些利弊? 纹理抗锯齿主要是指在计算机图形学,减少或消除图像由于纹理映射导致锯齿效应技术。...常见有以下几种: FXAA(快速近似抗锯齿): FXAA 是一种后处理技术,主要通过像素着色器应用边缘检测算法,对边缘附近像素进行模糊处理,以减少锯齿。...SSAA(超级采样抗锯齿): SSAA 是一种全场景抗锯齿技术,它通过更高分辨率下渲染整个场景,然后将其缩放到最终输出分辨率,以获得更平滑边缘。...MSAA(多重采样抗锯齿): MSAA 是一种渲染过程应用抗锯齿技术,它只对每个像素多个样本进行计算,而不是对整个像素进行计算。这可以减少几何锯齿,但对纹理锯齿效果有限。...双缓冲或多缓冲技术:通过使用两个或多个 PBO,可以一个 PBO 进行 GPU 操作同时,使用 CPU 填充另一个 PBO,从而实现更高效流水线操作。

15311

第5章-着色基础-5.4-锯齿和抗锯齿

没有一种最好抗锯齿技术,因为每种技术质量、捕捉清晰细节或其他现象能力、运动过程外观、内存成本、GPU要求和速度方面都有不同优势。 图5.14黑色三角形示例,一个问题是采样率低。...它在OpenGL API得到直接支持,但在3.0版已弃用。现代GPU上,可以像素着色器通过对输出缓冲区使用更高精度颜色格式来实现累积缓冲区概念。...NVIDIA内置TXAA支持类似地比单个像素更广区域上使用更好重建过滤器,以提供更好结果。...旋转网格超级采样(RGSS)使用旋转方形图案像素内提供更高垂直和水平分辨率。图5.25显示了这种模式一个示例。...一种让样本影响多个像素实时抗锯齿方案是NVIDIA较旧Quincunx方法[365]。 “Quincunx”是指五个物体排列,四个一个正方形,第五个中心,例如六面骰子上五个点图案。

5.1K30
  • 走样与反走样

    同时,OpenGL也提供了gl_SampleID变量,一旦片元着色器使用该变量,则着色阶段对应每个采样点而非像素,MSAA则退化为SSAA。...计算边界长度需要更多采样计算,Console版本简化了采样数,来适应游戏主机需求。 FXAA特点是简单,只需要一个Pass就能实现抗锯齿,无论是CPU还是GPU,都是一个轻量后处理反走样技术。...反走样对比 SMAA可以作为FXAA替代方案,并且和MSAA并不冲突,因此,也可以通过MSAA+SMAA提供更好反走样效果。上图是Cesium不同反走样效果对比。...DLSS,Nvidia基于深度学习反走样技术,了解不多,多种反走样技术结合深度学习思路,没有用过。 基于SDF反走样技术,通过获取该像素距离边界距离,作为混合因子,字体渲染中广泛应用。...本文重点解释了SSAA,MSAA,FXAA和SMAA四种,也介绍了AGAA这个基于着色反走样技术,以及相关技术实现一些注意事项,优劣对比。

    95830

    Cesium渲染一帧中用到图形技术

    设置 Cesium将具有帧生存期常量存储FrameState对象每一帧开始阶段,将使用诸如相机参数和仿真时间之类值对其进行初始化。...如果使用了与顺序无关透明度(OIT)[McGuire13,Bagnell13]或快速近似抗锯齿FXAA),则它们缓冲区也将被清除(有关更多信息,请参见下文)。...如果启用了FXAA,则会执行全屏通道以进行抗锯齿。 与平视显示器(HUD)相似,覆盖通道命令最后执行。 ? Cesium当前渲染管线。...例如,BillboardCollection一个顶点缓冲区存储尽可能多布告板,并使用相同着色器对其进行渲染。 拾取 Cesium使用颜色缓冲区实现拾取。...计算通道 Cesium会使用老式GPGPU来进行GPU加速图像重投影,该渲染过程,它将渲染一个与屏幕视口对齐四边形,以将重投影推向着色器

    3K20

    3D 图形学基础 (上)

    4.2.6.2.3 覆盖采样抗锯齿(CSAA) 覆盖采样抗锯齿(CoverageSampling Anti-Aliasing,简称CSAA)是nVidiaG80及其衍生产品首次推向实用化AA技术,也是目前...CSAA就是MSAA基础上更进一步节省显存使用量及带宽,简单说CSAA就是将边缘多边形里需要取样子像素坐标覆盖掉,把原像素坐标强制安置硬件和驱动程序预先算好坐标。...[2] 4.2.6.2.7 多帧采样抗锯齿(MFAA) NVIDIA(英伟达)根据MSAA改进出一种抗锯齿技术。目前只有使用 Maxwell 架构GPU显卡才可以使用。...只要在NVIDIA控制面板里为程序开启MFAA并在游戏中选择MSAA就可以开启。画面表现明显强于同级别的MSAA,这种全新抗锯齿技术提升边缘画质同时能够将性能代价降至最低。...通过时间和空间两方面交替使用抗锯齿采样格式,4xMFAA 性能代价仅相当于 2xMSAA,但是抗锯齿效果却与 4xMSAA相当。

    8.9K96

    基础渲染系列(七)——阴影

    不同质量设置也会产生不同结果。 1.9 抗锯齿 你是否质量设置启用了抗锯齿功能?如果有,那么你可能已经发现了阴影贴图另一个问题。它们没有与标准抗锯齿方法混合使用。 ? ?...(使用抗锯齿锯齿表现) 质量设置启用抗锯齿功能后,Unity将使用多重采样抗锯齿功能MSAA。通过沿三角形边缘进行一些超级采样,可以消除这些边缘上混叠。细节在这里无关紧要。...亮和暗几何之间边缘被消除锯齿,而阴影边缘则没有。 ? ? ? (没有AA,MSAA4,FXAA) 依靠图像后处理抗锯齿方法(例如FXAA)不会出现此问题,因为它们是渲染整个场景之后应用。...示例场景更改了球体和圆柱体,让它们使用我们材质。现在它们不再投阴影了。 ? (我们材质,没有阴影投下来) 我们知道Unity多次渲染场景以获得定向阴影。...深度遍历期间,偏差为零,但是渲染阴影贴图时,偏差对应灯光设置。通过剪辑空间中将深度偏差应用于顶点着色器位置,可以实现此目的。

    4.1K30

    CSS 渐变锯齿消失术

    CSS ,渐变(Gradient)可谓是最为强大一个属性之一。 但是,经常有同学使用渐变过程中会遇到渐变图形产生锯齿问题。 何为渐变锯齿? 那么,什么是渐变图形产生锯齿呢?...因而对于普通渐变元素,像是上述写法,产生了锯齿,这是非常常见使用渐变过程一个棘手问题。 简单解决办法 解决失真的问题有很多。这里最简单方式就是不要直接过渡,保留一个极小渐变过渡空间。...仿生狮子这篇文章 -- CSS 幻术 | 抗锯齿,还介绍了另外一种有意思消除锯齿方式。以下内容,部分摘录至该文章。 我们可以建立一种边缘锯齿边缘->重建锯齿边缘锯齿消除方法。... Implementing FXAA 这篇博客,解释了 FXAA 具体是如何运作。...对于一个已经被找到图形边缘,经过 FXAA 处理后会变成这样,见下两幅图: FXAA(Fast Approximate Anti-Aliasing),快速近似抗锯齿,它找到画面中所有图形边缘并进行平滑处理

    1.6K30

    flutter画笔paint认识

    strokeJoin StrokeJoin StrokeJoin.miter 在线段之间连接上放置类型 strokeMiterLimit dobule 4.0 斜接限制 1. style、strokeWidth...举个例子来测试下这些基础属性,如下图 可以看到红色圆环并且是抗锯齿,右边蓝色圆形边缘粗糙. strokeWidth只有style为stroke时才有效,从图中可以看到,圆环有一半(strokeWidth...ImageShader : 图片着色器ImageShader 使用 ImageShader 可以加载一张图片,绘制时使用图片对图形进行着色。...2.blendMode 颜色叠合模式 BlendMode 组件应用有 Image 组件和 ColorFilter 组件 用于将目标与一个颜色叠合,一共有 29 种叠合模式,这里看一下效果。...3.invertColors true 时,会将一个颜色绘制时变成色相环中相反位置。

    1.4K20

    【Android 应用开发】Paint 渲染 之 BitmapShader 位图渲染 ( 渲染流程 | CLAMP 拉伸最后像素 | REPEAT 重复绘制图片 | MIRROR 绘制反向图片 )

    ) ( 2 ) 位图渲染 REPEAT 拉伸 代码示例 及 效果 ( 绘制超出图片边界时, 就会绘制 同样图片 填充剩余部分 ) ( 3 ) 位图渲染 MIRROR 拉伸 代码示例 及 效果 ( 垂直和水平方向绘制图片对应方向反向图片...: 调用 Paint 对象 setShader 方法为 画笔设置 着色器; 6.打开抗锯齿 : 调用 Paint 对象 setAntiAlias 方法, 打开抗锯齿, 这样 位图边界会更平滑,...paint.setAntiAlias(true) ; 7.绘制矩形 : 调用 Canvas drawRect 方法, 绘制矩形, 位图该矩形绘制; canvas.drawRect(new Rect...(0,0 , 100, 100),mPaint); ; 8.使用示例 : 下面是位图渲染 简单示例; @Override protected void onDraw(Canvas canvas...拉伸 代码示例 及 效果 ( 垂直和水平方向绘制图片对应方向反向图片 ) MIRROR 拉伸 : 1.MIRROR 说明 : 创建 BitmapShader 时候, 设置其 水平 和 垂直方向

    1.6K10

    深入GPU硬件架构及运行机制

    几何着色器(Geometry Shaders) 没有上限位(No caps bits) 统一着色器(Unified Shaders) DirectX 10.0 Shader Model 4.0 Vista...14、接下来阶段就和vertex-shader逻辑步骤完全一样,但是变成了像素着色器线程执行。...也就是说,像素着色器,会将相邻四个像素作为不可分隔一组,送入同一个SM内4个不同Core。 为什么像素着色器处理最小单元是2x2像素块?...AMD APU 采用就是这种结构,目前主要使用在游戏主机,如 PS4。 存储管理方面,分离式结构 CPU 和 GPU 各自拥有独立内存,两者共享一套虚拟地址空间,必要时会进行内存拷贝。...AI降噪和AI抗锯齿。AI降噪已经部分RTX系列光线追踪版本得到应用,而AI抗锯齿(Super Res)可用于超高分辨率视频图像抗锯齿: 基于任务和网格着色器渲染管线。

    4.7K31

    OPengl、DirectX、OPenCV、OpenCL

    本文链接:https://blog.csdn.net/daoer_sofu/article/details/48548659 ###1.Opengl   GLSL:Opengl着色器语言,GPU上执行可编程渲染管线...版本(否则有一些异常问题出现)   OpenGLgl库是核心库,glu是实用库,glut是实用工具库,gl是核心,glu是对gl部分封装,glut是OpenGL跨平台工具库   OPenGL...GL_COLOR_BUFFER_BIT变量,可以把OPengl当做状态机,通过不同状态变量开关(glEnable、glDisable只有两个状态变量)控制,实现不同显示效果。   ...(Shader方式可编程渲染管线) 抗锯齿(glHint):   GL_POINT_SMOOTH_HINT(点采样glPointSize,启动抗锯齿点是圆,否则是方)   GL_LINE_SMOOTH_HINT...,文件扩展名*.fs   CG:支持Opengl和DirectX着色器C语言编程 ###3.OpenCV   计算机视觉处理库 ###4.OpenCL(amd显卡程序,cuda nvidia程序

    2.1K50

    海量新功能,Godot 4.0正式发布!

    当然,仍然可以使用光照贴图低端设备上预渲染光照和阴影,但光照贴图现在使用 GPU 进行更快渲染。 最后,阴影 Godot 3 表现一直不太优秀。...对于喜欢摄影用户,Godot 4.0 引入了逼真的光单位,允许调整灯光强度并使用标准相机设置(如光圈、快门速度和 ISO)来控制最终场景亮度。物理光单位默认关闭,但可以项目设置启用它们。...使用 Clip Children 属性可以使用任何 2D 元素作为遮罩。最后,多重采样抗锯齿 (MSAA) 选项已添加到 2D 引擎,以获得更好图像质量和更平滑边缘。...改进 2D 光照和阴影 2D 通过 2D 定向光和阴影获得了照明改进。 着色器使用带符号距离场,可以获得高级视觉效果,例如长阴影、光晕和清晰轮廓。对于 3D 可以法线贴图中控制光照高度。...对于其他大气效果,Godot 4.0 引入了天空着色器,允许用户创建实时更新动态天空(包括反射)。有关详细信息,请参阅介绍天空着色器文章。

    1.4K10

    OpenGL 抗锯齿

    我们原来猜测,我们会为每个被覆盖子样本运行片段着色器,然后对每个像素子样本颜色进行平均化。例子那种情况,我们插值顶点数据每个子样本上运行片段着色器,然后将这些采样点最终颜色储存起来。...三角形内部区域中所有像素都会运行一次片段着色器,它输出颜色被储存到所有4个子样本。三角形边缘并不是所有的子样本都会被覆盖,所以片段着色器结果仅储存在部分子样本。...这意味着我们必须生成一个新FBO,它仅作为一个将多采样缓冲还原为一个我们可以片段着色器使用普通2D纹理中介。...自定义抗锯齿算法 可以直接把一个多采样纹理图像传递到着色器,以取代必须先还原方式。...GLSL给我们一个选项来为每个子样本进行纹理图像采样,所以我们可以创建自己抗锯齿算法,比较大图形应用,通常这么做。

    2.9K20

    解读 | NVIDIA Turing 架构解析:追光逐影,成败未定

    实现它最大问题在于它近乎于无底洞一样夸张性能需求,如果使用最原始方法来尝试计算场景每个光源发出所有光线,将会在场景追踪到无穷无尽光线。...相比之下,着色器遍历BVH将需要每条光线投射数千个指令槽,所有这些都用于检测BVH边界框交叉点。 RT Core还处理一些内存操作分组和调度,以最大化跨多个光线内存吞吐量。...,包括高级着色器 NVIDIA RTX光线追踪技术:RTX平台下光线追踪技术名称 GameWorks Raytracing:光线追踪降噪模块GameWorks SDK GeForce RTX:使用NVIDIA...DLSS使用专为游戏而设DNN(深度神经网络),使用超高质量64倍超级采样图像或真实画面进行训练,进而通过Tensor Core来推断高质量抗锯齿结果。...标准模式下,DLSS以较低输入样本推断出高倍抗锯齿结果,目标分辨率上可达到与TAA相似的效果。 由于涉及深度学习,NVIDIA正在将纯粹计算/专业功能推向消费者领域。

    1.2K20

    23.opengl高级-抗锯齿

    glfwWindowHint(GLFW_SAMPLES, 4); glEnable(GL_MULTISAMPLE); 无抗锯齿 锯齿放大 抗锯齿 2.2 离屏MSAA 使用glTexImage2DMultisample...,比如在着色器对它们进行采样。...但所有的这些细节都是值得额外努力,因为多重采样能够显著提升场景视觉质量。当然,要注意,如果使用采样点非常多,启用多重采样会显著降低程序性能。本节写作时,通常采用是4采样点MSAA。...三、自定义抗锯齿算法 将一个多重采样纹理图像不进行还原直接传入着色器也是可行。GLSL提供了这样选项,让我们能够对纹理图像每个子样本进行采样,所以我们可以创建我们自己抗锯齿算法。...大型图形应用通常都会这么做。

    3.1K30

    使用SharpGL三维建模技术生成3D井眼轨迹图

    OpenGL获得一个RD是比较困难,底层Win32代码有大量函数获得像素格式,这些工作是大量重复和痛苦,好在这一切SharpGL帮我做了。...最后一个选择使用SharpGL原因是,OpenGL中大量很痛苦重复工作如加载信息等,但是这些工作.NET是非常容易处理。...谷歌原因英文资料找起来也很费劲,SharpGL缺少一个官方技术社区,值得一说是官方提供了比较详细示例代码,说实话其中很多代码都是参考官方示例。...着色器和其他对象所有包装。 SharpGL.WinForms - 包含应用程序Windows 窗体控件。 SharpGL.WPF - 包含用于你应用程序WPF控件。...项目开始 启动VS,建立一个Windows桌面程序,引入如下Dlls: 在这里我们使用SharpGL.WinForms命名空间中OpenGLControl 控件。

    3.9K50

    ​AMD放出超强新算法,旧N卡也能焕发第二春

    尽管FSR1.0有许多优点,但它仍有一些明显缺陷。 它需要高质量抗锯齿源图像,而这是一个很难解决问题:没有抗锯齿功能游戏使用FSR 1.0时也必须遵循这个规则,这使得数据整合更加耗时。...由于FSR1.0利用函数来提升输入图像分辨率,当源分辨率非常低时,就没有足够信息来重新生成细节,甚至可以看到画面闪烁和糟糕边缘重建,而这些性能升级预置更加明显。...相比于“前辈”,FSR2.0进步之处主要在于: 可接受不同输入,如果输入一个锯齿化源图像,FSR2.0可利用抗锯齿功能,优化输出图像质量。...只要游戏支持,可以几乎任何显卡上获得性能提升,不但包括AMD自家历代显卡(包括RX 6000、RX 5000、RX Vega、RX 400、锐龙APU),也支持NVIDIA、Intel显卡。...例如,虽然AMD所有的示例,其运行速度都不超过1.5毫秒,但在低端GPU上却达不到此效果。 不过,1.5毫秒时间内,FSR 2.0做了许多事情。

    51630

    Direct3D 11 Tutorial 5: 3D Transformation_Direct3D 11 教程5:3D转型

    XNA Math库包含API可以方便地构建矩阵,用于多种用途,例如平移,旋转,缩放,世界到视图转换,视图到投影转换等。 然后,应用程序可以使用这些矩阵来转换其场景顶点。...需要对矩阵变换有基本了解。 我们将简要介绍下面的一些示例。 平移 平移是指在空间中移动或移位一定距离。 3D,用于翻译矩阵具有形式。...图1.平移影响 ? 3D,空间通常由原点和来自原点三个唯一轴定义:X,Y和Z.计算机图形通常使用多个空间:对象空间,世界空间,视图空间,投影空间和屏幕空间。...// Update our time t += XM_PI * 0.0125f; 进行渲染调用之前,必须为着色器更新常量缓冲区。...另一方面,如果正在绘制像素深度大于深度缓冲器已经存在值,则丢弃该像素并且深度缓冲器深度值保持不变。 示例以下代码创建深度缓冲区(DepthStencil纹理)。

    1.8K40

    【图形学】形态抗锯齿MLAA详解与Python实现

    其于2009年由IntelAlexander Reshetov提出, 启发了后续一批基于图像自身形态进行抗锯齿操作算法例如FXAA和CMAA....这里我Python实现综合了上面两篇文章. 主体仍然是Reshetov实现方式, 但使用Jimenez实现利用图像来储存临时数据思路辅助. 此文章代码仓库路径如下....MLAA首先需要查找出图像边缘信息. MLAA, 图像边缘信息查找相对单个通道进行, 因此对于彩色图像来说, 需要通过某个方法将其转为单通道形式....实现, MLAA除了预计算面积索引图外还借助显卡硬件加速线性插值特性边缘图中简化了模式分类步骤, 具体优化流程在这就不详细介绍了....后续人们MLAA基础上优化开发了例如SMAA, FXAA, CMAA等更实用抗锯齿算法, 以后有机会再介绍.

    5.4K60

    第3章-图形处理单元-3.1-数据并行架构

    这种类型线程与CPU线程不同。它包含一些用于着色器输入值内存,以及着色器执行所需任何寄存器空间。使用相同着色器程序线程被捆绑成组,NVIDIA称为warp,AMD称为wavefront。...NVIDIA GPU上warp包含32个线程。这产生了 2000/32=62.5 个warp,这意味着分配了63个warp,其中一个warp是半空。warp执行类似于我们单GPU处理器示例。...我们简单示例,纹理内存获取延迟可能会导致warp被换出。实际上,遇到更短延迟时都可以将warp换出,因为交换成本非常低。...着色器程序结构是影响效率重要特征。一个主要因素是每个线程寄存器使用量。我们示例,我们假设2000个线程可以同时驻留在GPU上。...Lauritzen文献[993]概述了占用率如何受寄存器数量和着色器使用共享内存影响。Wronski文献[1911, 1914]讨论了理想占用率如何根据着色器执行操作类型而变化。

    1.2K10
    领券