WPF网格类型像素着色器
由于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);
}
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);
}
二值化多分网格
- 使用
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);
}
二值化方格
- 使用
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);
}
动态方格
- 使用
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);
}
线框网格
- 使用
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;
}
线框网格上滚动的小球
- 使用
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;
}
鼠标操控小球
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;
};
要注意的时,通过绑定的方式更新没成功,只好手动赋值,不知道哪里出问题了
WPF网格类型像素着色器的更多相关文章
- WPF 像素着色器入门:使用 Shazzam Shader Editor 编写 HLSL 像素着色器代码
原文:WPF 像素着色器入门:使用 Shazzam Shader Editor 编写 HLSL 像素着色器代码 HLSL,High Level Shader Language,高级着色器语言,是 Di ...
- DirectX11 With Windows SDK--02 顶点/像素着色器的创建、顶点缓冲区
前言 由于在Direct3D 11中取消了固定管线,要想绘制图形必须要了解可编程渲染管线的流程,一个能绘制出图形的渲染管线最少需要有这两个可编程着色器:顶点着色器和像素着色器. 本章会直接跳过渲染管线 ...
- D3D三层Texture纹理经像素着色器实现渲染YUV420P
简单记录一下这两天用Texture实现渲染YUV420P的一些要点. 在视频播放的过程中,有的时候解码出来的数据是YUV420P的.表面(surface)通过设置参数是可以渲染YUV420P的,但Te ...
- 片元着色器(Fragment Shader)被称为像素着色器(Pixel Shader),但
片元着色器(Fragment Shader)被称为像素着色器(Pixel Shader),但片元着色器是一个更合适的名字, 因为此时的片元并不是一个真正意义上的像素.
- HLSL像素着色器
原文:HLSL像素着色器 昨日不可追, 今日尤可为.勤奋,炽诚,不忘初心 手机淘宝二维码 扫描 或者打开连接:程序设计开发 ,掌声鼓励,欢迎光临. 像素着色器替代了固定渲染管线的 ...
- ThreeJS 物理材质shader源码分析(像素着色器)
再此之前推荐一款GLTF物理材质在线编辑器https://tinygltf.xyz/ 像素着色器(meshphysical_frag.glsl) #define PHYSICAL uniform ve ...
- Turing渲染着色器网格技术分析
Turing渲染着色器网格技术分析 图灵体系结构通过使用 网格着色器 引入了一种新的可编程几何着色管道.新的着色器将计算编程模型引入到图形管道中,因为协同使用线程在芯片上直接生成紧凑网格( meshl ...
- Unity3d之Shader编程:子着色器、通道与标签的写法 & 纹理混合
一.子着色器 Unity中的每一个着色器都包含一个subshader的列表,当Unity需要显示一个网格时,它能发现使用的着色器,并提取第一个能运行在当前用户的显示卡上的子着色器. 我们知道,子着色器 ...
- DirectX11 With Windows SDK--26 计算着色器:入门
前言 现在开始迎来所谓的高级篇了,目前计划是计算着色器部分的内容视项目情况,大概会分3-5章来讲述. DirectX11 With Windows SDK完整目录 Github项目源码 欢迎加入QQ群 ...
- Direct3D 11 Tutorial 3: Shaders and Effect System_Direct3D 11 教程3:着色器和效果系统
概述 在上一个教程中,我们设置了一个顶点缓冲区并将一个三角形传递给GPU. 现在,我们将逐步完成图形管道并查看每个阶段的工作原理. 将解释着色器和效果系统的概念. 请注意,本教程与前一个源代码共享相同 ...
随机推荐
- zabbix API笔记
python简单demo 输出id为111主机的主机群组信息 import requests import json request_headers = {"Content-Type&quo ...
- Partition和ReduceTask的关系
先看源码: numPartitions = conf.getNumReduceTasks(); if (numPartitions > 1) { //设置了ReduceTask个数后(大于1), ...
- HZ2023 远足游记
你说得对,但是我放假之前写的 P4689 代码没了 所以来摆 4.6(远足) 上午 走路,刚开始感觉没啥 走到园博园发现没预料中那么顺利 但是还感觉没啥 因为也没预料到 \(N·m\) 学校会让我们原 ...
- python教程3.1:数据类型:字符串+列表list
一.字符串 字符串是⼀个有序的字符的集合,⽤于在计算机⾥存储和表示⽂本信息 常用方法--str.fun() 全局函数 二.列表list []内以逗号分隔,按照索引,存放各种数据类型,每个位置代表⼀个 ...
- vue2下拉框组件使用技巧
1.ant design 下拉框组件--单选 <span style="font-size: 14px;">污水厂</span> <a-select ...
- 基于Vue3水印组件封装:防篡改守护!
基于Vue 3的全新水印通用组件.这款组件不仅功能强大,而且易于集成,能够轻松为您的网页或应用添加自定义水印,有效防止内容被篡改或盗用. 在线查看效果: 原文可查看效果地址 一,编写watermark ...
- AIRIOT答疑第4期|如何使用数据分析引擎?
灵活报表曲线,满足各类分析需求! AIRIOT物联网低代码平台的数据分析引擎满足各类型数据分类及分析需求,毫秒级数据反馈速度,快速响应客户分析条件变换查询需求.通过机器学习.融合各种计算模型.人工智能 ...
- 推荐一款模拟浏览器自动化操作神器!Mechanize
大家好,我是狂师! 今天给大家推荐一款用于模拟浏览器行为以进行网页自动化操作Python库:Mechanize. 1.介绍 Mechanize是Python中的一个库,它被设计用来自动化网页浏览和数据 ...
- vue xlsx组件 导出的excel表头插入内容
主要就是sheet_add_dom这个方法, dom是带有table标签元素的dom节点. timeData是个二维数组:[["条件1","条件2"],[&qu ...
- 记录一次 对应用程序日志排查,老是刷出有本地ip登录Sqlserver数据库失败的日志
在我电脑-计算机管理-事件查看器-windows日志-应用程序里 1秒中就刷很多条 用户sa登录某个数据库失败,客户端ip:192....; 我查看ip发现是本机的ip地址.也就是说有本地的应用程序在 ...