我目前正在使用UBO在OpenGL 4.3中进行渲染,以便在GPU上存储我的所有常量数据.(像材料描述,矩阵......).它的工作原理是小尺寸的UBO(在我的实现上为64kB)迫使我多次切换缓冲区以减慢渲染速度,我正在寻找类似的存储几MB的方法.
经过一番研究后,我发现SSBO恰好允许这样做,但也有不必要的"功能":它们可以从着色器中写入,并且读取速度可能较慢.
是否有比SSBO更好的解决方案为着色器提供大块数据?我觉得我错过了什么,为什么UBO限制在几KB,而存在一个更灵活的解决方案,能够处理更多的数据?如果着色器存储缓冲区是我正在寻找的,有没有办法确保它们不被着色器修改?
我有一个奇怪的问题:
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)
我需要在这里明确投射吗?为什么,更重要的是如何?
我最近注意到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)