操作次数最少的排序算法是什么?我需要在 HLSL 中实现它作为 WPF 的像素着色器效果 v2.0 的一部分,因此考虑到 Pixel Shader 的局限性,它需要的操作数量非常少。我需要对 9 个值进行排序,特别是当前像素及其邻居。
统一缓冲区和常量缓冲区有什么区别?
它们是完全独立的还是可以将制服视为在恒定缓冲区中?换句话说,如果你想设置一个uniform,你需要一个常量缓冲区还是有其他方法?
我问这个问题是因为我有四个变量(float2平移、float缩放和float旋转),它们很可能不会同时改变。我是否需要一个恒定的缓冲区来一次设置它们,或者如果可能的话,单独设置它们是否更好?
我是一个初学者像素着色器作家,我遇到了一些麻烦。我想获取一个 256x256、16 位输入 (DXGI_FORMAT_R16_UINT) 图像,并通过一个 256x256 查找纹理 (DXGI_FORMAT_R8_UNORM) 将其转换为 256x256 8 位输出。
不幸的是,我似乎遇到了很多麻烦,输出似乎总是钳制为黑色或白色。
此外,我不确定我应该使用哪种 DXGI 格式,以及哪种数据类型与每种格式相关。
// Global Variables
Texture2D<uint> imgTexture : register( t0 );
Texture2D lutTexture : register( t1 );
SamplerState SampleType : register( s0 );
// Structures
struct PS_INPUT
{
float4 Pos : SV_POSITION;
float2 Tex : TEXCOORD0;
};
// Pixel Shader
float4 PS( PS_INPUT input) : SV_Target
{
uint pixelValue = imgTexture[input.Tex];
uint2 index = { pixelValue / 256, pixelValue % 256 };
// uint row = …Run Code Online (Sandbox Code Playgroud) 着色器是否有“最佳”命名约定?如果没有,流行的选择是什么?
例如
*.vert *.vertex *.vsh
*.frag *.pixel *.fsh *.psh
我没有几何和镶嵌的例子
人们。
我在通过constant buffer将浮点数组传递给顶点着色器(HLSL)时遇到问题。我知道由于 HLSL 打包规则,下面数组中的每个“浮点数”都单独获得一个 16 字节的插槽(空间相当于 float4):
// C++ struct
struct ForegroundConstants
{
DirectX::XMMATRIX transform;
float bounceCpp[64];
};
// Vertex shader constant buffer
cbuffer ForegroundConstantBuffer : register(b0)
{
matrix transform;
float bounceHlsl[64];
};
Run Code Online (Sandbox Code Playgroud)
(不幸的是,这里的简单解决方案不起作用,在我进行更改后没有绘制任何内容)
而C ++数据被传递时,由于包装规则他们得到间隔开,使得每个“浮动”中bounceCpp C ++阵列中进入一个16字节的空间中的所有本身bounceHlsl阵列。这导致了类似于以下内容的警告:
ID3D11DeviceContext::DrawIndexed:Vertex Shader 单元的 slot 0 处的 Constant Buffer 的大小太小(提供 320 字节,至少 1088 字节,预期)。这是可以的,因为越界读取被定义为返回 0。开发人员也可能知道无论如何都不会使用丢失的数据。如果开发人员实际上打算为着色器期望绑定足够大的常量缓冲区,这只是一个问题。
正如此处和此处所指出的,建议以这种方式重写 HLSL 常量缓冲区:
cbuffer ForegroundConstantBuffer : register(b0)
{
matrix transform;
float4 bounceHlsl[16]; // equivalent …Run Code Online (Sandbox Code Playgroud) 我正在尝试向我的应用程序添加凹凸贴图功能,但我得到了非常多面的模型:

发生这种情况的原因是因为我正在计算每个面的切线、副法线和法线,而完全忽略了我从模型文件中获得的法线。
计算目前使用三角形的两条边和纹理空间向量得到切线和副法线,然后通过叉积计算法线。模型加载后,这一切都在 CPU 上完成,然后将值存储为模型几何的一部分。
vector1 = vertex2.coords - vertex1.coords;
vector2 = vertex3.coords - vertex1.coords;
tuVector = vertex2.texcoords - vertex1.texcoords;
tvVector = vertex3.texcoords - vertex1.texcoords;
float den = 1.0f / (tuVector.x * tvVector.y - tuVector.y * tvVector.x);
tangent.x = (tvVector.y * vector1.x - tvVector.x * vector2.x) * den;
tangent.y = (tvVector.y * vector1.y - tvVector.x * vector2.y) * den;
tangent.z = (tvVector.y * vector1.z - tvVector.x * vector2.z) * den;
binormal.x = (tuVector.x * vector2.x - tuVector.y * vector1.x) * …Run Code Online (Sandbox Code Playgroud) 对于使用 DirectCompute 的某些 GPGPU 计算,我需要双精度。当我将所有内容都设置为浮点数时,着色器将编译并运行得很好。但是,当我尝试在我的着色器中的任何地方使用 doubles 时,它会编译,但ID3D11Device::CreateComputeShader()在运行时调用失败并显示E_INVALIDARG. C++ 端代码完全相同,请注意,我刚刚将着色器中的一些变量更改为两倍。
当我调用ID3D11Device::CheckFeatureSupport()时D3D11_FEATURE_DOUBLES,它报告说我的适配器支持双倍,这是 AMD Radeon R9 270x。根据一些谷歌搜索,AMD 卡实际上非常擅长双精度计算 - IE,我的卡可以使用双精度,但 DirectX 似乎不想让我这样做。
我想也许 DirectCompute 没有这种能力(这很奇怪,因为很多科学的 GPGPU 进程需要双打),所以我尝试使用像素着色器。同样的事情发生。
这是驱动程序错误,还是我遗漏了什么?
编辑:我刚刚搜索了最新的 Catalyst 驱动程序,显然我支持几个版本。这很有趣,考虑到我最近去过控制中心并检查了几次更新。我要更新,看看会发生什么。
EDIT2:更新没有效果。要么我做错了什么,要么 DirectX 有各种各样的错误。
在表面着色器中,给定世界的上轴(以及其他轴)、世界空间位置和世界空间中的法线,我们如何将世界空间位置旋转到法线空间中?
也就是说,给定一个向上向量和一个非正交的目标向上向量,我们如何通过旋转它的向上向量来变换位置?
我需要这个,所以我可以只受对象的旋转矩阵,这是我的顶点位置没有访问。
这是我想要做的图形可视化:
该图是二维的,但我需要为 3D 空间解决这个问题。
我正在尝试在 Unity 5 中实现一个 HLSL 着色器,它会替换球体的顶点。
我想要解决的是如何有效地将信息从一帧传递到下一帧,以便我可以“保存”每个顶点的计算速度。
在Nvidia 开发站点上,我发现了一篇有趣的文章,讨论了 GPU 流体动力学模拟。在那篇文章中,他们指出:
但是,在 GPU 上,片段处理器的输出始终写入帧缓冲区。将帧缓冲区视为无法直接读取的二维数组。有两种方法可以将帧缓冲区的内容放入可以读取的纹理中:
- 复制到纹理 (CTT) 从帧缓冲区复制到纹理。
- 渲染到纹理 (RTT) 使用纹理作为帧缓冲区,因此 GPU 可以直接写入它。
我记得在 Unity 中读过(来源丢失),这RenderTexture是一个 FBO,但经过数小时的搜索,我仍然不明白如何实现这一点(如果这甚至是实现这一目标的正确方法)。我目前的想法是我会创建 2 个通道,一个是根据现有速度计算新速度,然后第二个是操作网格。
我已经考虑过编写一个 GPGPU 着色器,但我非常希望在单个着色器中包含所有这些功能。
我在一个死胡同,有人可以指出我正确的方向。
澄清:
在一个Unity Compute Shader我可以渲染/输出任何我想要渲染纹理的东西:
渲染纹理也可以从计算着色器写入,如果它们设置了“随机访问”标志(DX11 中的“无序访问视图”),请参阅 RenderTexture.enableRandomWrite。 http://docs.unity3d.com/Manual/ComputeShaders.html
另请注意:
DirectX10 引入了一个称为流输出的新功能,该功能对于实现粒子系统非常有用。OpenGL 在 3.0 版中采用了相同的功能,并将其命名为 Transform Feedback。http://ogldev.atspace.co.uk/www/tutorial28/tutorial28.html
我可以在普通着色器中执行此操作吗?Unity 5.1+ 中是否有流输出。有转换反馈选项吗?
在HLSL 中,我有两个数组:
int arr1[2];
int arr2[2];
Run Code Online (Sandbox Code Playgroud)
我需要将内容复制arr1到arr2.
我应该遍历每个元素吗?
arr2[0] = arr1[0];
arr2[1] = arr1[1];
Run Code Online (Sandbox Code Playgroud)
是否有任何特定的HLSL工具(例如memcpy()在C / C++ 中)?
或者我可以只写arr2 = arr1;,这对我有用吗?
hlsl ×10
c++ ×3
direct3d11 ×3
directx ×3
gpgpu ×2
shader ×2
3d ×1
algorithm ×1
cg ×1
direct3d ×1
directx-11 ×1
glsl ×1
math ×1
performance ×1
pixel-shader ×1
sorting ×1
transform ×1
wpf ×1