
Здравствуйте. Я пытаюсь работать в вычислительном шейдере с буфером вершин, содержащим множество потоков
Позиция в первом потоке
Касательная и цвет во втором
Координаты UV в третьем
Как передать эти данные в вычислить шейдер и повторно получить его там?
P.S: Если я помещу все данные в один поток, все будет работать нормально.
Вот код Unity C# для одного потока:var mesh = meshFilter.mesh;
var vertexBuffer = meshFilter.graphicsBuffer;
m_paintMeshShader.SetBuffer(m_paintKernelHandle, Vertices, vertexBuffer);
m_paintMeshShader.SetInt(VertexCount, mesh.vertexCount);
m_paintMeshShader.SetInt(TargetVertexOffset, mesh.GetVertexAttributeOffset(VertexAttribute.Position));
m_paintMeshShader.SetInt(TargetColorOffset, mesh.GetVertexAttributeOffset(VertexAttribute.Color));
m_paintMeshShader.SetInt(TangentOffset, mesh.GetVertexAttributeOffset(VertexAttribute.Tangent));
m_paintMeshShader.SetInt(TargetMaxOffset, vertexBuffer.stride);
m_paintMeshShader.Dispatch(m_paintKernelHandle, (mesh.vertexCount + 31) / 31, 1, 1);
Вот код вычислительного шейдера hlsl для одного потока:
int vertexCount;
int targetVertexOffset;
int targetColorOffset;
int tangentOffset;
int targetMaxOffset;
RWByteAddressBuffer vertices;
[numthreads(32, 1, 1)]
void Paint(uint3 id : SV_DispatchThreadID)
{
uint index = id.x;
if (index >= asuint(vertexCount))
return;
int targetIndex = index * targetMaxOffset;
float2 positionDefaultPacked = asfloat(vertices.Load2(targetIndex + targetVertexOffset));
uint colorDefalutPacked = asuint(vertices.Load(targetIndex + targetColorOffset)));
uint2 tangentDefalutPacked = asuint(vertices.Load2(targetIndex + tangentOffset)));
//...do some work
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... ute-shader