WPF网格类型像素着色器

news/2024/7/3 7:40:42/文章来源:https://www.cnblogs.com/ggtc/p/18275543

由于WPF只能写像素着色器,没法写顶点着色器,所以只能在这上面做文章了
刚好有个纹理坐标TEXCOORD输入可用,而且值的范围是已知的0-1,左上角是原点,这就好办了

例子

索引

二分网格

  • 使用ceil
  • 0-1移动定义域到-0.5 - 0.5,然后向上取整变成 0 / 1
float4 main(float2 uv : TEXCOORD) : COLOR
{float ab =  ceil( uv.y-0.5 );return float4(ab,ab,ab,1.0);
}

image

4分网格

  • 使用ceil
  • 0-1,先放大定义域0-4,然后向左移动定义域,-0.5 - 3.5,向上取整 0/1/2/3,最后压缩0/0.25/0.5/0.75/1
float4 main(float2 uv : TEXCOORD) : COLOR
{float ab =  ceil( uv.y*4-0.5 );float scale=ab/4;return float4(scale,scale,scale,1.0);
}

image

二值化多分网格

  • 使用sin round
  • 利用周期函数把定义域0-1范围的周期调整到指定数,然后值域压扁-0.5 - 0.5,向上移动0-1,四舍五入二值化
//三角函数是天然的周期函数
float4 main(float2 uv : TEXCOORD) : COLOR
{float num=6;float2 ab =  0.5*sin(uv*3.1415*num )+0.5;float2 scale=round(ab);return float4(scale.y,scale.y,scale.y,1.0);
}

image

二值化方格

  • 使用sin round abs
  • 在上一篇基础上,相乘生成纵横条纹。但这形成十字条纹,为了产生交错条纹,就不能相乘,只能相加
float4 main(float2 uv : TEXCOORD) : COLOR
{float num=7;float abx =  0.5*sin(uv.x*3.1415*num )+0.5;float aby =  0.5*sin(uv.y*3.1415*num )+0.5;float scale=abs((round(abx)/2)+(round(aby)/2)-0.5);//0.4是避免浮点数精度问题,否则直接用round(scale)float scale2=ceil(scale-0.4);return float4(scale2,scale2,scale2,1.0);
}

image

动态方格

  • 使用sin round abs
/// <summary> time </summary>
/// <minValue>0</minValue>
/// <maxValue>100</maxValue>
/// <defaultValue>0</defaultValue>
float time : register(C0);
float4 main(float2 uv : TEXCOORD) : COLOR
{float num=7;float abx =  0.5*sin(uv.x*3.1415*num+time )+0.5;float aby =  0.5*sin(uv.y*3.1415*num )+0.5;float scale=abs((round(abx)/2)+(round(aby)/2)-0.5);float scale2=ceil(scale-0.4);return float4(scale2,scale2,scale2,1.0);
}

image

线框网格

  • 使用sin abs max step
  • 将周期函数取绝对值,变成一个个山峰,然后下沉,利用一个阈值,过滤出山尖
float4 main(float2 uv : TEXCOORD) : COLOR
{float gridLines = 11;float gridLineX = step(0.99, abs(sin(uv.x * 3.1415 * gridLines))); float gridLineY = step(0.99, abs(sin(uv.y * 3.1415 * gridLines))); float4 color = float4(max(gridLineX,gridLineY) , max(gridLineX,gridLineY) , max(gridLineX,gridLineY) , 1.0);return color;
}

image

线框网格上滚动的小球

  • 使用sin abs max step
  • 在前一篇基础上,再传入鼠标位置,并再鼠标周围画一个白色圆形,覆盖线框颜色设置。使用语义VPOS获取像素位置判断和鼠标距离
float2 mousePosition : register(C0);
float4 main(float2 uv : TEXCOORD,float2 positon : VPOS) : COLOR
{float gridLines = 11;float gridLineX = step(0.99, abs(sin(uv.x * 3.1415 * gridLines))); float gridLineY = step(0.99, abs(sin(uv.y * 3.1415 * gridLines)));float maxline=max(gridLineX,gridLineY);float innerCircle = 1.0 - step(50,length(positon-mousePosition));float maxResult=max(maxline,innerCircle);float4 color = float4(maxResult , maxResult , maxResult , 1.0);return color;
}

image

鼠标操控小球

public class MouseCaptureEffect : ShaderEffect
{public static readonly DependencyProperty InputProperty = ShaderEffect.RegisterPixelShaderSamplerProperty("Input", typeof(MouseCaptureEffect), 0);public static readonly DependencyProperty MousePositionProperty = DependencyProperty.Register("MousePosition", typeof(Point), typeof(MouseCaptureEffect), new UIPropertyMetadata(new Point(0D, 0D), PixelShaderConstantCallback(0)));public MouseCaptureEffect(){PixelShader pixelShader = new PixelShader();pixelShader.UriSource = new Uri("pack://application:,,,/你的程序集名称;component/路径/TextEffect3.ps", UriKind.Absolute);this.PixelShader = pixelShader;this.UpdateShaderValue(InputProperty);this.UpdateShaderValue(MousePositionProperty);}public Brush Input{get{return ((Brush)(this.GetValue(InputProperty)));}set{this.SetValue(InputProperty, value);}}/// <summary> mouse </summary>public Point MousePosition{get{return ((Point)(this.GetValue(MousePositionProperty)));}set{this.SetValue(MousePositionProperty, value);Debug.WriteLine("aaa");}}
}
<Button Content="Btn"><Button.Effect><local:MouseCaptureEffect x:Name="me" MousePosition="{Binding MousePositionw,Mode=TwoWay}" ></local:MouseCaptureEffect></Button.Effect>
</Button>
this.MouseMove += (sender, e) =>
{//这行代码不管用//MousePositionw = e.GetPosition(this);// 更新鼠标位置me.MousePosition= MousePositionw;
};

要注意的时,通过绑定的方式更新没成功,只好手动赋值,不知道哪里出问题了
image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/733799.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLM大模型: RAG两大核心利器: M3E-embedding和bge-rerank

RAG的效果好不好,最核心依赖两点:文本embedding语义提取的好不好,rerank的排序效果好不好(包含正确答案的文本是不是排在前面)!各自使用的环节如下:1、文本embedding的提取:理论上讲,任何transformer架构的encoder部分都可用于生成token的embedding,然后采用合适的po…

oop-PTA题目集7~8总结

一、前言 第七次和第八次的题目集中的题目均是在前两次的电路模拟程序中增加新的内容,难度相较前面两次的题目有明显增大,主要是电路结构更加复杂,比如多并联、并联包含并联等较为特殊的情况,另外,新增了一些需要特殊处理的电器设备,比如有三个引脚的互斥开关、与其他设备…

lamp lump

为网站备案老王:记得一定要完成ICP备案,才可以通过网站对外提供互联网信息服务! 老王:根据 《互联网信息服务管理办法》以及 《非经营性互联网信息服务备案管理办法》,国家对非经营性互联网信息服务实行备案制度,对经营性互联网信息服务实行许可制度。未取得许可或者未履…

UI Explorer 的下载

离线版下载地址参考 UI Path 论坛的一篇文章:Standalone UiExplorer client download?该链接现在依然有效。 另外,替换链接中的版本号可获取其他版本的下载路径。 理论上,遍历此链接可以获取最新版本的独立程序包。有了计划记得推动,不要原地踏步。

监狱视频智能分析系统

监狱视频智能分析系统解决方案包括视频AI行为智能分析预警是一套可以独立运行的监狱视频智能分析系统。仅需在原有监控终端设备上的基础上,增加一台智能预警分析盒子,基于智能视频分析盒子实现监控系统智能预警功能。当视频监控划分的视野范围内发生事先预设的事件,如人员倒…

SpringMVC初体验

新建Maven项目 pom.xml文件导包<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://ma…

.NET|--WPF|--笔记合集|--依赖项属性|--概览

前言 本文介绍一下WPF的依赖项属性, 可以让大家对该依赖项属性知识点有个简单认识. "依赖项属性"其实也是"属性"的一种, 而"只读依赖项属性"又是"依赖项属性"的一种. 层级关系 : 属性 > 依赖项属性 > 附加属性 / 只读依赖项属性…

2024年自学python必看的书籍《Python编程:从入门到实践 第三版》PDF免费下载

本书是一本针对所有层次的Python 读者而作的Python 入门书。第一部分介绍了编程环境的搭建和Python编程所必须了解的基本概念。第二部分将理论付诸实践,讲解如何开发三个项目:分别是射击游戏、数据可视化、小型Web应用程序适读人群 :本书适合对Python感兴趣的所有读者阅读。…

视频监控智能分析系统

视频监控智能分析系统核心技术优势是以各大监控终端为基础,以智能视频分析系统为核心,用户可以在后台设置视频监控智能分析系统的某些特定的规则,视频监控智能分析系统识别不同区域范围内的物体,同时识别范围内的目标行为是否符合这些规则。如果发现监控画面中的异常情况,…

模拟集成电路设计系列博客——8.2.3 振荡器的相位噪声

8.2.3 振荡器的相位噪声 振荡器的相位噪声是一个基本特征。因为不存在一个无损失的振荡器(那就是永动机了),任何振荡器都需要一些有源电路来维持振荡,而这些有源电路会引入噪声。具体哪个器件引入了噪声的机理很微妙,到了后来才逐渐变得易于理解。但是,相位噪声的现象学事…

微信小程序中使用阿里图标iconfont

由于微信小程序中图标不是很全或者用png等图片每次都要修改图片颜色或者啥的感觉不是很方便 用习惯了阿里单色图标库之后,感觉总是缺点什么,所以总结了一下,废话不多说,步骤如下:1. 阿里图标库地址:https://www.iconfont.cn 自己进去选择图标,然后选择fontclass下载到本…

Xming配合Winterm实现远端Linux本地图形显示

1.下载安装xming xming可以实现在windows上访问linux的图形应用程序。 xming下载sourceforge 安装基本都是下一步,这里使用windterm作为ssh客户端,因此不再需要额外安装,其他选项根据需要自定义。2.配置xming 同xming一起安装的有一个xlaunch的软件,打开后其他都默认,这一…

mysql索引数据结构

一、索引 1. 什么是索引 索引是帮助MySql高效获取数据的排好序的数据结构。 2.索引的数据结构 ① 二叉树(Binary tree) 定义:是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树。 特点:左子树小于父节点的值,右子树大于父节点的值。 缺点:当…

字典树

字典树 它是一个快速插入和查询的多叉树 支持字符串的操作 支持查询和插入 使用边来标记我的字母 它的路径代表着这个字符串 比如1 2 6 11这条路径的意思就是字符串aba 如果要插入字符就在应该有的字符串路径插入应该要的字符 Code:#include <bits/stdc++.h>using names…

题目集7~8总结

5-6次大作业难度还算较简单,尤其第五次大作业,可谓是开场小菜,到第六次作业才上了一些难度,而第七次第八次更是难度大大增加,第二轮大作业比起第一轮大作业难度上升了不少,运用到的东西更新,更先进,所涉及的思维设计,逻辑框架也更难,还有其计算的设计也会很复杂很难。…

项目微服务化

记得不久之前,我曾经计划将本项目改造成微服务的形式,原因在于探索了Graal VM以后,我发觉曾经梦想的将自己的项目微服务化并不是一个天方夜谭,而是一些切实可行的,只需要工作量堆砌的事情。于是这段时间我就集中精力把这件事情做了一下。但是实际做完的感觉尽管非常舒心,…

内网穿透之frp+proxifier实现socks5反向代理

frp是一个专注于内网穿透的高性能的反向代理应用,proxifier允许用户将网络应用程序通过代理服务器进行连接。目录前言环境搭建frp反向代理proxifier代理工具 前言内网穿透,代理技术的联系与区别?我个人感觉在内网渗透的时候它们之间的界限很模糊,其目的都是为了突破内网访问…

笔记本电脑的电源计划

电池保留电池电量 保留电池电量使用电池:7%接通电源:7%"保留电池电量"通常是指设备为了延长电池整体寿命而采取的一种策略,比如在电池充电时不会充满至100%,而是维持在一个较低的安全水平(例如93%),以减少电池的高压力状态,这是一种电池维护功能。 关键级 关…

Web应用课 3.1 JavaScript——变量与运算符、输入输出、判断、循环

JS的调用方式与执行顺序 使用方式 HTML页面中的任意位置加上<script type="module"></script>标签即可。 常见使用方式有以下几种:直接在标签内写JS代码。 直接引入文件:<script type="module" src="/static/js/index.js">&…