- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在探索使用计算着色器将骨骼变形应用于网格顶点,而不是使用流输出的顶点着色器。我发现计算着色器的执行速度比顶点着色器慢得多,但在我把它写下来之前,我想确定我没有做错什么。
使用我的 100,000 个顶点的测试数据和 300 个骨骼的 1,000 帧动画数据,顶点着色器的运行时间约为 0.22 毫秒,而计算着色器的运行时间是 0.85 毫秒的 4 倍。计时是通过 D3D API 计时器查询(而不是 cpu 计时器)完成的。
变形结构体.hlsl
struct Vertex {
float3 position : POSITION;
float3 normal : NORMAL;
float2 texcoord : TEXCOORD;
float3 tangent : TANGENT;
float4 color : COLOR;
};
struct BoneWeights {
uint index;
float weight;
};
StructuredBuffer<matrix> g_bone_array : register(t0);
Buffer<uint> g_bone_offsets : register(t1);
Buffer<uint> g_bone_counts : register(t2);
StructuredBuffer<BoneWeights> g_bone_weights : register(t3);
#include "deform_structs.hlsl"
StructuredBuffer<Vertex> g_input_vertex : register(t4);
RWStructuredBuffer<Vertex> g_output_vertex : register(u0);
[numthreads(64,1,1)]
void BoneDeformCS(uint id : SV_DispatchThreadID) {
Vertex vert = g_input_vertex[id.x];
uint offset = g_bone_offsets[id.x];
uint count = g_bone_counts[id.x];
matrix bone_matrix = 0;
for (uint i = offset; i < (offset + count); ++i) {
BoneWeights weight_info = g_bone_weights[i];
bone_matrix += weight_info.weight * g_bone_array[weight_info.index];
}
vert.position = mul(float4(vert.position,1), bone_matrix).xyz;
vert.normal = normalize(mul(vert.normal, (float3x3)bone_matrix));
vert.tangent = normalize(mul(vert.tangent, (float3x3)bone_matrix));
g_output_vertex[id.x] = vert;
}
#include "deform_structs.hlsl"
void BoneDeformVS(uint id : SV_VertexID, Vertex vsin, out Vertex vsout) {
uint offset = g_bone_offsets[id];
uint count = g_bone_counts[id];
matrix bone_matrix = 0;
for (uint i = offset; i < (offset + count); ++i) {
BoneWeights bone_info = g_bone_weights[i];
bone_matrix += bone_info.weight * g_bone_array[bone_info.index];
}
vsout.position = mul(float4(vsin.position,1), bone_matrix).xyz;
vsout.normal = normalize(mul(vsin.normal, (float3x3)bone_matrix));
vsout.tangent = normalize(mul(vsin.tangent, (float3x3)bone_matrix));
vsout.texcoord = vsin.texcoord;
vsout.color = vsin.color;
}
Dispatch
的号码吗?错误的?由于它是一维数据行,因此使用
[numthreads(64,1,1)]
对我来说是有意义的。 .我尝试了 32-1024 的各种值。 64 似乎是最佳选择,因为它是高效使用 AMD GPU 所需的最低要求。反正。当我调用
Dispatch
,我要求它执行
(vertex_count / 64) + (vertex_count % 64 != 0) ? 1 : 0
.对于 100,000 个顶点,调用最终为
Dispatch(1563,1,1)
.
ID3D11ShaderResourceView * srvs[] = {bone_array_srv, bone_offset_srv,
bone_count_srv, bone_weights_srv,
cs_vertices_srv};
ID3D11UnorderedAccessView * uavs[] = {cs_output_uav};
UINT srv_count = sizeof(srvs) / sizeof(srvs[0]);
UINT uav_count = sizeof(uavs) / sizeof(uavs[0]);
UINT thread_group_count = vertex_count / 64 + (vertex_count % 64 != 0) ? 1 : 0;
context->CSSetShader(cs, nullptr, 0);
context->CSSetShaderResources(0, srv_count, srvs);
context->CSSetUnorderedAccessViews(0, uav_count, uavs);
context->Dispatch(thread_group_count, 1, 1);
ID3D11ShaderResourceView * srvs[] = {bone_array_srv, bone_offset_srv,
bone_count_srv, bone_weights_srv};
UINT srv_count = sizeof(srvs) / sizeof(srvs[0]);
UINT stride = 0;
UINT offset = 0;
context->GSSetShader(streamout_gs, nullptr, 0);
context->VSSetShader(vs, nullptr, 0);
context->VSSetShaderResources(0, srv_count, srvs);
context->SOSetTargets(1, &vs_output_buf, &offset);
context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_POINTLIST);
context->IASetInputLayout(vs_input_layout);
context->IASetVertexBuffers(0, 1, &vs_vertices, &stride, &offset);
context->Draw(vertex_count, 0);
最佳答案
我只是在学习如何使用计算着色器,所以我不是专家。关于你的骨骼计算,我确信 CS 至少应该和 VS 一样快。直觉告诉我numthreads (64,1,1)
效率低于 numthreads (16,16,1)
.
所以你可以试试这种方法:
size = ceil (sqrt (numvertices))
ch(size / 16, size / 16)
在你的程序和numthreads (16,16,1)
在您的 hlsl 文件中 size
的位置分配一个常量缓冲区和 numvertices
值 id.x
作为索引,您将自己的(线性)索引计算为 int index = id.y * size +id.x)
,(也许 id.xy 也可以作为索引)size * size
将大于 numvertices
,所以你最终会得到比顶点更多的线程。您可以通过在 hlsl 函数中添加条件来阻止这些额外的线程:int index = id.y * size +id.x;
if (index < numvertices) { .. // your code follows
numthreads Dispatch groups threads/ total
x y fps x y group threads
4 4 240 259 207 53445 16 855118
8 8 550 129 103 13361 64 855118
16 16 600 65 52 3340 256 855118
32 32 580 32 26 835 1024 855118
64 1 550 16 827 13361 64 855118
256 1 460 4 827 3340 256 855118
512 1 370 2 827 1670 512 855118
关于vertex-shader - 为什么这个计算着色器比顶点着色器慢得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20206093/
我在使用 dijkstra 时遇到了这个错误:TypeError:不可排序的类型:Vertex() dijkstra(g, g.get_vertex('a')) File "C:/Use
我对为自定义类实现迭代器感到困惑。我正在尝试为 std::set 实现一个迭代器,其中我的 Vertex 类声明为: class Vertex{
我正在尝试学习和实现有向图,但在执行程序时遇到了一些困难。 // ADD Function public boolean addVertex(Vertex v) { boolean added
我是 OpenGL 的初学者,我试图每 5 秒将大量“对象”从一个位置移动到另一个位置。如果我在顶点着色器中计算位置,fps 急剧下降,难道不应该在 GPU 上完成这些类型的计算吗? 这是顶点着色器代
我正在学习使用 Boost 图形库。我已经按照此处的说明定义了一个自定义结构来存储有关顶点的信息:Modifying vertex properties in a Boost::Graph . str
我正在尝试使用 boost::adjacency list 和捆绑属性创建一个 TreeMap 来存储每个顶点的父级,我想以一种它们不会失效的方式存储顶点描述符以防万一我删除了一个顶点,所以我使用了
要定义一个从 int 到 struct vertex 的映射,我应该定义 map[int]vertex 还是 map[int]*vertex?首选哪一个? 我扩展了 Chickencha 的代码: p
我创建了一个 VBO(顶点缓冲区对象)和 VAO(顶点数组对象)并执行了以下操作: glBindVertexArray(vao); glBindBuffer(GL_ARRAY_BUFFER, vbo)
我用 HBase 设置了 Titan。 我删除图中的所有顶点 全部删除后显示为空。 gremlin> g.V.count() ==>0 但是如果我重新登录泰坦,那么图中会有一堆空顶点 gremlin>
我正在探索使用计算着色器将骨骼变形应用于网格顶点,而不是使用流输出的顶点着色器。我发现计算着色器的执行速度比顶点着色器慢得多,但在我把它写下来之前,我想确定我没有做错什么。 使用我的 100,000
这里我有一个有向图G,我需要判断是否存在一组顶点不相交的循环,以便每个顶点都属于一个循环。 我不确定这是否可以在多项式时间内完成或者它是否是 NP-Complete?谁能至少指出我正确的方向? 最佳答
要检测一个点是否在多边形中,您可以从该点到无穷远投影一条线,然后查看它与多少个多边形顶点相交......足够简单。我的问题是,如果射线在其中一个点上与多边形相交,则将其视为与两个线段相交,并被视为在多
我在 VehicleHistoryGraph 数据库中创建了一个 Message 类型的顶点,并向其中加载了 50,000 个该类型的顶点。 当我尝试使用此 SQL 语句一次删除所有顶点时 - DEL
所以我正在尝试将 Graph 类作为另一个项目的一部分。顶点存储在由 unordered_map 定义的邻接表中。我正在尝试创建一个散列函数以允许我的 Vertex 类存储在此 map 中,但我不知道
我正在尝试使用 Parma Polyhedra 库 [1]枚举(凸)多面体的顶点,例如,我有一个由四个约束指定的矩形: Constraint_System cs; cs.insert(x >= 0);
我开始了解 Visual Studio 2017 中的 OpenGL。按照 www.learnopengl.com 教程并通过了纹理检查点,转换是目前的主要问题。 我使用预先获取的统一位置 ID 将我
有一个预定的笔记本,它使用 BigQuery 客户端和具有所有者权限的服务帐户。当我手动运行单元格时,它会更新 BQ 表。 BQ 和 Vertex AI 都有一个项目。 我发现了一个类似的问题,但是
我在 R 中使用 Igraph 包,当我通过 V(graph) 访问顶点名称列表时,我得到以下结果: Vertex sequence: [1] "d66cp96igcdnt25brjeics9d11
我有一个 U-SQL 脚本,它在数据湖中存储的多个 JSON 文件上运行,当我针对单个文件运行该脚本时,一切正常,但是打开它以针对我的所有文件运行每次都会出现以下错误,并且作业永远不会超过“准备”阶段
我正在尝试实现 phong 阴影,但无济于事。我正在一点一点地构建着色器(这本身可能是一个问题),但这就是我目前所处的位置。我希望它将我的结果(犹他茶壶)输出为黑色背景上的白色图像。当我从顶点着色器中
我是一名优秀的程序员,十分优秀!