小编gan*_*an_的帖子

SSBO作为更大的UBO?

我目前正在使用UBO在OpenGL 4.3中进行渲染,以便在GPU上存储我的所有常量数据.(像材料描述,矩阵......).它的工作原理是小尺寸的UBO(在我的实现上为64kB)迫使我多次切换缓冲区以减慢渲染速度,我正在寻找类似的存储几MB的方法.

经过一番研究后,我发现SSBO恰好允许这样做,但也有不必要的"功能":它们可以从着色器中写入,并且读取速度可能较慢.

是否有比SSBO更好的解决方案为着色器提供大块数据?我觉得我错过了什么,为什么UBO限制在几KB,而存在一个更灵活的解决方案,能够处理更多的数据?如果着色器存储缓冲区是我正在寻找的,有没有办法确保它们不被着色器修改?

c opengl glsl compute-shader

8
推荐指数
1
解决办法
1046
查看次数

在Rust回归时向上翻箱子

我有一个奇怪的问题:

trait A {}
trait B : A {}

struct MyStruct {}
impl A for MyStruct {}
impl B for MyStruct {}

fn fun_b() -> Box<B> {
    Box::new(MyStruct{})
}

fn fun_a() -> Box<A> {
    /*
    error: mismatched types [E0308]
    note: expected type `Box<A + 'static>`
    note:    found type `Box<B + 'static>`
    */
    fun_b()
}

fn main() {
    fun_a();
    fun_b();
}
Run Code Online (Sandbox Code Playgroud)

如果我替换fun_a为:

fn fun_a() -> Box<A> {
    Box::new(MyStruct{})
}
Run Code Online (Sandbox Code Playgroud)

(完全一样fun_b)

我需要在这里明确投射吗?为什么,更重要的是如何?

rust

5
推荐指数
0
解决办法
123
查看次数

为什么 std::vector 0 会初始化它的内存?

我最近注意到std::vector分配后确实会用零清除内存。

我之前创建过类似的容器(尽管不合std规),并且在创建新项目之前我从来不需要显式地将内存清零。

我看不出这样做的理由,我只是想知道为什么。

为了显示 :

struct S {
    int s[128];
};

bool vector_zeroed() {
    std::vector<S> c;
    while(c.size() < 1000) {
        c.emplace_back();
    }

    bool zeroed = true;
    for(const auto& s : c) {
        for(int i : s.s) {
            zeroed &= i == 0;
         }
    }
    return zeroed;
}

bool array_zeroed() {
    bool zeroed = true;
    auto *s = new S[1000];
    for(int k = 0; k != 1000; ++k) {
        for(int i : s[k].s) {
            zeroed &= i …
Run Code Online (Sandbox Code Playgroud)

c++ memory vector std c++11

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

标签 统计

c ×1

c++ ×1

c++11 ×1

compute-shader ×1

glsl ×1

memory ×1

opengl ×1

rust ×1

std ×1

vector ×1