Tag: hlsl

使用HLSL进行YUV到RGB转换的奇怪模糊边缘图案

我正在尝试在HLSL中将YUV写入RGB着色器。 具体来说,它转换Yuv420p格式,该格式由Y值的N M平面组成,接着是U值的(N / 2) (M / 2)平面,然后是(N / 2)*(M / 2)平面V值。 例如这张1280×720图片: 在YUV格式中看起来像这样解释为8位,1280×1080纹理: 在Direct3D11中,我将其作为Texture2D加载,格式为R8_UNorm,尺寸为1280×1080。 棘手的部分是重建U和V平面,因为正如你所看到的,一半的线位于纹理的左侧,另一半位于右侧。 在着色器中,我这样做: struct PS_IN { float4 pos : SV_POSITION; float2 tex : TEXCOORD; }; Texture2D picture; SamplerState pictureSampler; float4 PS(PS_IN input) : SV_Target { int pixelCoord = input.tex.y * 720; bool evenRow = (pixelCoord / 2) % 2 == 0; […]

在HLSL中绘制SuperEllipse

更新:关于如何使用Superformula绘制一个的答案就在最后 我需要使用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 = cos(theta); float st = sin(theta); float x = a * […]

编组C#结构为DX11 cbuffers

我有一些问题(我认为)在C#中打包我的结构并将它们传递给我在HLSL中注册的cbuffers。 当我以一种方式打包我的结构时,信息似乎能够传递到着色器: [StructLayout(LayoutKind.Explicit, Size = 16)] internal struct TestStruct { [FieldOffset(0)] public Vector3 mEyePosition; [FieldOffset(12)] public int type; } 当我创建这个结构并将其设置为我在C#中的常量缓冲区时,它似乎工作正常。 我得到了我期望的颜色: cbuffer PerFrame : register(b0) { Vector3 eyePos; int type; } float3 GetColour() { float3 returnColour = float(0.0f, 0.0f, 0.0f); switch(type) { case 0: returnColour = float3(1.0f, 0.0f, 0.0f); break; case 1: returnColour = float3(0.0f, […]

所有像素的高效像素着色器总和

如何使用HSLS像素着色器有效地计算图像中所有像素的总和? 我对Pixel Shader 2.0感兴趣,我可以调用它作为WPF着色器效果。

在单个float变量中存储两个float值

我想在一个32位浮点变量中存储两个浮点值。 编码将在C#中进行,而解码将在HLSL着色器中完成。 到目前为止,我发现的最佳解决方案是将编码值中的小数偏移硬连接,并将它们存储为“载波”浮点的整数和小数: 123.456 -> 12.3 and 45.6 它无法处理负值,但没关系。 但是我想知道是否有更好的方法来做到这一点。 编辑:有关该任务的更多细节: 我在Unity中使用固定数据结构,其中顶点数据存储为浮点数。 (Float2表示UV,float3正常,等等。)显然没有办法正确添加额外的数据,所以我必须在这些限制范围内工作,这就是为什么我认为这完全是一个更普遍的编码数据问题。 例如,我可以牺牲二级UV数据来传输2×2额外数据通道。 目标是着色器模型3.0但我不介意解码是否在SM2.0上合理地工作。 只要它“合理”,数据丢失就可以了。 预期的值范围是0..64,但是当我想到它时,0..1也会很好,因为重新映射到着色器内的任何范围都很便宜。 重要的是保持尽可能高的精度。 负值并不重要。