小编Pro*_*fet的帖子

GLSL多个着色程序VS制服开关

我正在研究着色器管理器架构,我有几个问题需要更高级的人员.我目前的选择反对两种设计:


1.每个材质着色器程序

=>为程序中使用的每种材质创建一个着色器程序.

潜在的缺点:

  • 考虑到每个对象可能都有自己的材质,它涉及很多glUseProgram调用.
  • 意味着创建了许多着色器程序对象.
  • 更复杂的架构#2.

优点:

  • 可以专门为材料中使用的每个"选项"生成着色器代码.
  • 如果我没错,制服必须只设置一次(创建着色器程序时).


2.全局着色器程序

=>为每个着色器功能(闪电,反射,视差映射......)创建一个着色器程序,并根据要渲染的材质使用配置变量启用或放弃选项.

潜在的缺点:

  • 每帧必须多次更换制服.

优点:

  • 较低的着色器程序计数.
  • 减少SP swich(glUseProgram).


您可能会注意到我目前的趋势是#1,但我想知道您对此的看法.

  • 初始制服设置是否会抵消glUseProgram呼叫开销(我不是特别速度怪胎)?
  • 在#1的情况下,对于任何内存或性能考虑,我应该在创建SP时只调用一次glLinkProgram,还是每次调用glUseProgram时都必须取消链接/链接?
  • 有更好的解决方案吗?

谢谢!

architecture shader glsl

39
推荐指数
2
解决办法
8356
查看次数

通过onDelete =“ CASCADE”删除实体时,Doctrine Cascade = {remove}不起作用

我在使用Doctrine 2的实体之间级联关系时遇到问题。

我有一个Media与父级事件相关的实体:

class Media
{

    /**
     * @ORM\OneToOne(targetEntity="Event", mappedBy="media")
     */
    private $event;

    public function getEvent()
    {
        return $this->event;
    }

    public function setEvent(Event $event)
    {
        $this->event = $event;
    }

}
Run Code Online (Sandbox Code Playgroud)

每个Event都与媒体(双向)有关,也与Import实体有关。

class Event
{

    /**
     * @ORM\JoinColumn(name="media", referencedColumnName="id", onDelete="SET NULL")
     * @ORM\OneToOne(targetEntity="Media", inversedBy="event", cascade={"persist", "remove"}, orphanRemoval=true)
     */
    private $media;

    public function getMedia()
    {
        return $this->media;
    }

    public function setMedia(Media $media = null)
    {
        $this->media = $media;
    }


    /**
     * @ORM\JoinColumn(name="import", referencedColumnName="id", nullable=true, onDelete="CASCADE")
     * …
Run Code Online (Sandbox Code Playgroud)

php doctrine-orm

2
推荐指数
1
解决办法
952
查看次数

标签 统计

architecture ×1

doctrine-orm ×1

glsl ×1

php ×1

shader ×1