首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有可能从存储在计算缓冲区中的点数据绘制广告牌?

是否有可能从存储在计算缓冲区中的点数据绘制广告牌?
EN

Game Development用户
提问于 2022-11-14 01:08:33
回答 1查看 71关注 0票数 0

我目前正试图展示一个星系,并开发了一个计算机着色器来放置/移动“恒星”。

另一个顶点/片段着色器读取缓冲区,当前在每个位置放置一个点。

实现这一目标的方法是获得对着色器的引用,绑定相同的计算缓冲区,然后调用Graphics.DrawProceduralNow()

代码语言:javascript
运行
复制
    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,但我遇到了两个问题:

  • 片段着色器只为每个缓冲项返回一个点,因此它有效地选择4颗随机恒星形成一个四边形,而不是每颗恒星4个四边形。
  • 我看不出有什么明显的方法能使广告牌向摄像机倾斜。

如果可能的话,我更愿意保留现有的数据结构(每个点的条目,而不是每个广告牌角落的条目),以避免不必要地重复其他属性。

这个是可能的吗?

EN

回答 1

Game Development用户

发布于 2022-11-14 08:08:50

我认为您可能希望使用DrawMeshInstancedIndirect (或该家族中的另一个函数,如DrawMeshInstancedProcedural)。

票数 0
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/203323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档