我目前正试图展示一个星系,并开发了一个计算机着色器来放置/移动“恒星”。
另一个顶点/片段着色器读取缓冲区,当前在每个位置放置一个点。
实现这一目标的方法是获得对着色器的引用,绑定相同的计算缓冲区,然后调用Graphics.DrawProceduralNow()
private void InitialiseShaders() {
int itemSize = Marshal.SizeOf(typeof(MapShaderStarDetail));
starLocations = new ComputeBuffer(
numStars,
itemSize);
//....Blah....
mapComputeShader.SetBuffer(Kernel("BuildStars"), "starBuffer", starLocations);
Shader.SetGlobalBuffer(Shader.PropertyToID("starBuffer"), starLocations);
mapMaterial = new Material(mapRenderShader);
mapMaterial.SetBuffer("starBuffer", starLocations);
//....Blah....
}
private void Update() {
mapComputeShader.Dispatch(Kernel("MoveStars"), threadDimensions.x, threadDimensions.y, threadDimensions.z);
}
public void OnPostRender() {
mapMaterial.SetFloat("maxRadius", maxRadius);
mapMaterial.SetPass(0);
Graphics.DrawProceduralNow(MeshTopology.Points, numStars, 1);
}
就像预期的那样..。
然而,我需要使用大量淫秽的恒星来获得我正在寻找的视觉密度。
理想的情况是,我不会在每个地点绘制一个点,而是用一个圆形精灵绘制一个实例广告牌,然后显着地减少星星的数量。
这也将允许我添加尘埃云和类似的增加视觉复杂性。
我尝试过将MeshTopology.Points
转换为MeshTopology.Quads
,但我遇到了两个问题:
如果可能的话,我更愿意保留现有的数据结构(每个点的条目,而不是每个广告牌角落的条目),以避免不必要地重复其他属性。
这个是可能的吗?
发布于 2022-11-14 08:08:50
我认为您可能希望使用DrawMeshInstancedIndirect (或该家族中的另一个函数,如DrawMeshInstancedProcedural)。
https://gamedev.stackexchange.com/questions/203323
复制相似问题