如何用任何像素着色语言创建Photoshop印章过滤器模拟?
如何用任何像素阴影语言创建Photoshop邮票滤波器模拟? (我至少需要过滤算法...) 解决方案 我已经查看了Photoshop中的邮票滤波器,看起来像是一个阈值,又加了强大的模糊. 我已经使用了Horizo​​ntalgaussianblur内核找到 pixel bender basic pixel bender basic /a> 只是添加了便宜的门槛.这是我的内核的样子: kernel stamp
0 2023-05-25
编程技术问答社区
Unity着色器(hlsl)相当于Vector3.ProjectOnPlane
在统一(HLSL)的着色器中,我正在寻找一种将矢量(float3或float4)投射到平面上的方法,给定平面的正常方向.我需要的是等同于Unity的Vector3.Projectonplane函数: 解决方案 如果您的平面正常向量已归一化: inline float3 projectOnPlane( float3 vec, float3 normal ) { return vec - normal * dot( vec, normal ); } 如果不是: inline float3 projectOnPlane( float3 vec, float3 normal ) { return vec - normal * ( dot( vec, normal ) / dot( normal, normal ) ); } 相同的公式,具体取决于GPU模型和驱动程序版本可以更快或更慢: inline float3 projectOnPlane( flo
12 2023-05-16
编程技术问答社区
使用numthreads(1,1,1)的计算着色器运行得非常慢。
我刚刚开始使用F#和SharpDX作为.NET包装器学习DirectX编程.作为测试案例,我渲染了Mandelbrot集.该计算是使用2个计算着色器完成的. 第一个着色器计算每个像素的深度(函数" calcmandel"),结果存储在RWStructructBuffer中.该计算需要大量的单一或双重乘法,但在我的GPU上(AMD 7790)却很快. " CalcMandel"具有属性 [numthreads(16, 16, 1)] 并通过 派遣 context.Dispatch (imageWidth / 16, imageHeight / 16, 1) 这里没有问题 - "核心" mandelbrot集的1000 x 800像素图像超过1000 fps(使用GPU上的单个精度). 第二个着色器几乎没有任何作用:它计算先前计算的最小值,最大和平均值(函数" calcminmax"). " calcminmax"具有属性 [numthreads(1, 1
2 2023-05-16
编程技术问答社区
HSLS float1,..., float4和它的字段
我看到HSLS具有浮动和浮点(1-4)之后的数字和许多字段(r,rr,rrrr,arar,...)(我在 hlsl工具感谢Tim Jones:D-我无法想象(目前)我们如何在没有此工具的情况下对HSL进行编程). 我尝试查找有关此数据类型及其字段的引用,但我找不到任何内容(为什么数字1-4及其字段的含义.在C ++ float中只是浮点数,在这里,这里,什么是float) 以下是我到目前为止的进展: 根据本文 float -32位浮点值. 例如,这是一个4组分签名的符合式浮点数声明. snorm float4 fourComponentIEEEFloat; 它没有回答我的问题:此代码是什么意思 RWTexture2D testTexture : register(u0); [numthreads(@value( threads_per_group_x ), @value( threads_per_group
22 2023-05-16
编程技术问答社区
Reflection.Emit中的短格式操作代码的错误
我正在制作一种与hlsl非常相似的小语言,但仅支持像素着色器.该语言使用reflection.emit来构建实现相同功能的.NET组件.目前,我正在测试我对分支指令的实现if,并且在我的单元测试之一(带有内在if/else s的大型if)中失败了以下错误消息: system.notsupportedException:位置的非法单字分支:32.请求分支为:132. 我将问题追溯到我的情况OpCodes.Br_S中使用简短的说明.解决方案很简单,我用OpCodes.Br_S替换了OpCodes.Br_S,但是我有几个问题: 该解决方案是否会影响生成的代码的性能? 如果我想正确地生成Br_S单个字节和Br的其他情况,我该怎么做?这里的问题是我正在使用访问者模式,对于if等分支指令,我必须首先输出Br或Br_s,我无法知道其余代码是否会需要一个以上的字节才能跳到标签.为了更好地说明我的问题,这是我为以下语句生成的代码: 我的语言: int a = -1; i
2 2023-05-16
编程技术问答社区
HLSL分支规避
我有一个着色器,我想在顶点着色器中移动一半的顶点.我正在尝试从性能的角度来决定最佳方法,因为我们正在处理超过100,000个Vert,因此速度至关重要.我看过3种不同的方法:(伪代码,但足以给您这个想法.函数调用(只是返回一个数字,但仍然是功能调用),以及浮点数号的一堆基本算法). if (y ; } 这具有一个优势,即仅执行一半的时间,但缺点是它肯定会导致分支,这实际上可能比公式慢.它是最可读的,但是在这种情况下,我们更关心速度而不是可读性. x += step(y, 0.5) * ; 使用hlsl的step()函数(如果第一个参数更大,则返回0,如果1返回),则可以消除分支,但是现在每次都调用,并且其结果乘以0(因此浪费了)一半的时间. x += (y
4 2023-05-12
编程技术问答社区
着色器-计算相对于物体的深度
我试图计算深度相对于对象. 这是一个很好的解决方案深度相对于相机:深度作为glsl varying float distToCamera; void main() { vec4 cs_position = glModelViewMatrix * gl_Vertex; distToCamera = -cs_position.z; gl_Position = gl_ProjectionMatrix * cs_position; } 在此示例中,深度相对于相机. ,但我希望获得相对于对象的深度.如果我离物体附近或远处,我想要相同的深度和价值. 这是我要实现的示例.在左侧,您可以看到深度相对于相机.即使摄像机从对象返回,在右边,深度也保持不变,因为它取决于对象. 解决方案 我相信您所追求的是相对于对象而不是相机的深度.要找到距对象的距离Z距离的距离... vec4 esVert = glModelViewMatrix * gl_Vert
0 2023-05-10
编程技术问答社区
了解dFdX和dFdY的基础知识
我已经阅读了dFdX(n)和dFdY(n)行为的许多描述,并且确实相信我仍然对学校的部分衍生物有一个处理.我不遵循的是" n"在最简单的示例中从哪里? 阅读GLSL内置函数dFdx(n)和dFdy(n)没有任何上下文以外的其他上下文,我将它们解释为"我具有x和y:x and y:f(x,y)的功能,我接受了该功能的部分导数w.r.t. x d/dx(x,y),我评估了x和y的某些值的部分导数公式,我假设这是上面的输入参数n. 我已经阅读了许多描述dFdx()和dFdy()允许您找到输出片段的窗口空间梯度.由于我不是试图确定纹理坐标的变化速率W.R.T w.r.t the em> the em w.r.t the em the Om 目前最感兴趣的情况. 我想使用dFdx(n)和dFdy(n)找到输出片段的窗口空间颜色梯度.我不完全了解如何在心理上构建要区分的函数,以及如何与框架缓冲区相关以及n与该功能如何相关(例如,n与当前片段的2x2片段相关,窗口坐标空间在整个帧缓冲
0 2023-05-10
编程技术问答社区
什么时候发生从剪辑空间到屏幕坐标的过渡?
我正在研究渲染管道,当我到达剪辑阶段时,从视图(眼睛或相机)空间中解释了我们必须传递到夹子空间的空间,也称为归一化的设备空间(NDC),即-1至1的立方空间. 但是,现在我不明白何时从这个空间到屏幕坐标空间发生: 剪辑后和栅格化之前? 在栅格化和剪刀和z检验之前? 在框架缓冲区上写作之前的结尾? 解决方案 否,剪辑空间和NDC空间不是同一回事. 夹子空间实际上距离NDC一步之遥,所有坐标均由Clip.W划分以产生NDC.在NDC空间中,除[ -1 , 1 ]范围之外的任何东西都对应于剪切音量之外的点.是有原因在NDC称为夹子空间之前的坐标空间的原因;) 严格来说,NDC空间不一定是立方体.的确,NDC空间是OpenGL中的立方体,但在Direct3D中不是.在D3D中,NDC空间中的z坐标范围从 0.0 到 1.0 ,而范围从 -1.0 到 1.0 在Gl. X和Y在GL和D3D中的表现相同(即它们范围从 -1.0 到 1.0 ). NDC是标
2 2023-05-10
编程技术问答社区
条件语句会拖慢着色器的速度吗?
我想知道着色器内部着色器(顶点/fragment/Pixel ...)是否确实在减慢着色器性能.例如: 最好使用它: vec3 output; output = input*enable + input2*(1-enable); 而不是使用以下: vec3 output; if(enable == 1) { output = input; } else { output = input2; } 在另一个论坛中,有一个谈论(2013年): http://answers.unity3d.com/questions/442688/shader-if-else-performance.html 在这里,伙计们说的是,if statements对着色器的性能真的很不利. 也在这里谈论if/else语句中有多少(2012年): 也许硬件或阴影量现在更好,它们以某种方式解决此问题(也许不是现有的)性能问题. 编辑: 这种情况是什么,在这里说E
2 2023-05-10
编程技术问答社区
在计算着色器中从RWTexture2D<float4>加载。
我了解HLSL着色器Model 5.0有一个限制,其中一个人无法从非量表键入RWTEXTURE2D资源加载数据.也就是说,以下是非法的: RWTexture2D __color; float4 c = __color[PixelCoord]; // error here 那么解决方法到底是什么?我试图在计算着色器中积聚到float4缓冲区中,例如: c = computeColor( ... ); __color[PixelCoord] += c; 解决方案 尝试做: float4 c = __color.load(int3(uv,0)); 其中的紫外线是要采样的Texel的屏幕空间(0->分辨率)中的XY坐标. 如果您需要写入它,请确保它是从无人机绑定的,而不是着色器资源视图.
10 2023-04-14
编程技术问答社区
WPF中的3种颜色的角度梯度
我正在尝试在WPF中实现一个简单的3色角梯度.最好的情况您得到了仅XAML的答案,但我很确定这是不可能的. 这个问题和答案( wpf )是我想要的一半.我试图使用代码,但显然我的数学不正确. 我的问题是:我该如何准确地做上述问题中的问题,但是有3种颜色和颜色3和颜色1之间的梯度(在上面的问题中,它的梯度从蓝色到白色,但直截了当回到蓝色之后,我也想要一个从白色到蓝色的反向梯度). 将其视为具有完美水平底座的等边三角形.例如,我想要在顶角的红色,左下角绿色,右下角是蓝色的,在之间. 我不介意像在另一个线程中建议的答案中那样编译为.ps:) 非常感谢! 解决方案 我认为其他线程在解释您需要做的事情方面做得很好.您需要将所有三种颜色传递给着色器,然后进行数学以获取所需的颜色. 以与其他答案相同的方式获取当前像素的0-1角.然后以该角度的适当颜色之间的LERP. 着色器 sampler2D inputSampler : register(S0
8 2023-04-14
编程技术问答社区
为什么像素着色器在后面的缓冲区格式是DXGI_FORMAT_B8G8R8A8_UNORM时返回float4?
好吧,所以这已经困扰着我一段时间了,在MSDN上找不到任何我需要的细节的东西. 这更像是一个三部分问题,所以它去了: 1-)当创建Swapchain应用程序指定Backbuffer像素格式时,通常是B8G8R8A8或R8G8B8A8.这给出了每个颜色通道8位,因此每个像素总共使用4个字节....为什么像素着色器必须返回颜色为float4时float4实际上是16个字节? 2-)当将纹理绑定到像素着色器时,我的纹理是DXGI_FORMAT_B8G8R8A8_UNORM格式,但是为什么Sampler需要每个像素需要一个float4才能工作? 3-)我在这里错过了什么吗?我是在想这个还是什么? 请提供链接以支持您的索赔.最好来自MSDN !!!! 解决方案 GPU旨在对32位浮点数据进行计算,至少在他们要支持D3D11的情况下.从D3D10开始,您还可以执行32位签名和未签名的整数操作. HLSL中的小于4个字节的类型没有要求或语言支持,因此1和2个字节整
42 2023-04-14
编程技术问答社区
如何在HLSL中复制一个数组?
in hlsl 我有两个数组: int arr1[2]; int arr2[2]; 我需要将arr1的内容复制到arr2. 我应该迭代每个元素吗? arr2[0] = arr1[0]; arr2[1] = arr1[1]; 是否有任何特定的 hlsl 工具(例如 C // c ++ )? 或我可以写arr2 = arr1;,这对我有用吗? 解决方案 arr2 = arr1工作正常.没有理由通过每个元素,根据数组元素的数量或它们的大小,它可能会增加很多时间.
12 2023-04-14
编程技术问答社区
在某些英特尔GPU上从多采样纹理加载失败
我已经使用模板缓冲区在我的应用中实现了鼠标选择. 这是在鼠标下读取值的像素着色器: Texture2DMS depthStencilTexture : register( t0 ); cbuffer ReadDepthInput : register( b2 ) { int2 readPosition; } // Produces vector3( x, y, stencilValue ) float4 main() : SV_Target0 { uint2 res = depthStencilTexture.Load( readPosition, 1 ); float stencil = res.y; // Scale the result from integers to 0..1 stencil /= 255.0f; return float4( float( readPosition.x ) / 655
28 2023-04-14
编程技术问答社区
HLSL编译器的优化很奇怪?
我不是HLSL编译器的专家,以及它们如何与分支机构合作,但我对此问题有不同的看法.因此要具体:在C/C ++中,实现类似: 的事物是非常有意义的 if (factor == 0) { // Simple calculation in special case of factor=0 } else if (factor == 1) { // Simple calculation in special case of factor=1 } else { // Much more complex calculation in general case of arbitrary factor } 在大多数时间因素为0或1的情况下,HLSL是相同的吗?我多次阅读了HLSL编译器的工作方式不同,例如在结果的机器代码中,所有分支均已计算.在这种情况下,上述结构是没有意义的,只能被其他情况所取代. 解决方案 如
24 2023-03-23
编程技术问答社区
矩阵乘法--视图/投影,世界/投影,等等。
在hlsl中有很多矩阵乘法,尽管我了解如何以及在何处使用它们,但我不确定它们是如何得出的或它们的实际目标. 所以我想知道是否有在线资源来解释这一点,我特别好奇地对将世界矩阵乘以视图矩阵和世界+视图矩阵的目的是什么. 解决方案 您可以从数学角度获取一些信息, wikipedia文章或on msdn .. 本质上,当您将3D模型渲染到屏幕上时,您将从散布在3D空间中的简单顶点开始.这些顶点都有自己的位置在" 对象空间"中表达.也就是说,它们通常具有在呈现的场景中没有含义的坐标,但仅表示一个顶点与另一个模型之间的关系. 例如,模型的顶点的位置只能在-1到1范围(或类似,这取决于模型的创建方式). 为了使模型处于正确的位置,您必须缩放,旋转并将其转换为场景中的"真实"位置.您要移动的位置在" world space "坐标中表达,这也表达了场景中顶点之间的真实关系.为此,您只需将每个顶点的位置与其 World 矩阵相乘.必须创建此矩阵以包括您需要应用的翻译/旋转/比例参数,
4 2023-03-22
编程技术问答社区
在HLSL中画一个超级椭圆
更新:回答如何使用超构素绘制 我需要使用 superellipse . 在能够轻松地绘制一个地方时绘制一个: 但是,在您不能的HLSL中,我被困在绘制或不是像素的情况下: 这是HLSL代码: sampler2D input : register(s0); /// Explain the purpose of this variable. /// 0.0 /// 10.0 /// 4.0 float N : register(C1); static const float pi = 3.1415926535f; float2 superEllipse(float n, float a, float b, float theta) { float ct = c
4 2023-03-20
编程技术问答社区
从[0.5-1]到[0-1]的正态化
我有点被困在这里,我想这有点像脑部预告片.如果我的数字在0.5到1之间,我该如何将其标准化为0到1之间? 感谢您的任何帮助,也许我有点慢,因为我过去24小时连续24小时工作 解决方案 其他人为您提供了公式,但没有为您提供工作.这是您解决这样的问题的方式.您可能会发现这远比知道答案更有价值. 映射[0.5, 1]到[0, 1]我们将寻求形式x -> ax + b的线性图.我们将要求将端点映射到端点,并保留该顺序. 方法一:端点映射到端点的要求,保留该顺序意味着0.5映射到0和1映射到1 a * (0.5) + b = 0 (1) a * 1 + b = 1 (2) 这是一个线性方程的同时系统,可以通过将方程式(1)乘以-2并将方程式(1)添加到等式(2)来解决.这样做后,我们将获得b = -1,然后将其替换为等式(2),我们获得了a = 2.因此,地图x -> 2x - 1将有能力. 方法两个:线穿过两个点(x1, y1)和(x2, y2)
0 2023-03-20
编程技术问答社区
如何计算像素着色器的深度,将一个在点状精灵上绘制的圆圈渲染成一个会与其他物体相交的球体?
我正在写一个着色器,通过绘制阴影圆圈,并需要编写深度组件和颜色,以使彼此接近的球形相交,以呈现在点精灵上,并需要编写深度组件和颜色. 我正在使用类似于 johna holwerda P> void PS_ShowDepth(VS_OUTPUT input, out float4 color: COLOR0,out float depth : DEPTH) { float dist = length (input.uv - float2 (0.5f, 0.5f)); //get the distance form the center of the point-sprite float alpha = saturate(sign (0.5f - dist)); sphereDepth = cos (dist * 3.14159) * sphereThickness * particleSize; //calculate how thick the sphere s
8 2023-03-19
编程技术问答社区