我正在开发一个实现阴影贴图的WebGL程序.在计算每个片段的深度值之后,我在末尾有一个if语句,它根据片段是否在阴影中来计算光照.
gl_FragColor = vec4(calcLighting(light0, eye_dir, eye_dir_norm, normal), 1);
if (light_tex_coord.z - depth <= 0.0) {
gl_FragColor += vec4
( calcLighting(light1, eye_dir, eye_dir_norm, normal)
, 0.0
);
}
Run Code Online (Sandbox Code Playgroud)
depth
阴影贴图的深度在哪里,light_tex_coord
是片段在场景空间中的位置light1
.light1
是一个围绕模型旋转的点光源,light0
是一个静态定位在相机上的点光源.
这里的问题是从不采用if分支,因此场景只light0
应用于它.我检查了depth
,light_tex_coord
和calculateLighting
正常工作.
不过,这是奇怪的事情,用以下代码替换上面的内容:
if (light_tex_coord.z - depth <= 0.0) {
gl_FragColor = vec4(0,1,0,1);
} else {
gl_FragColor = vec4(1,0,0,1);
}
Run Code Online (Sandbox Code Playgroud)
使阴影区域正确绘制为红色,并且无阴影区域以绿色绘制.也就是说,正确评估分支.用这个替换它:
gl_FragColor = vec4(calcLighting(light0, eye_dir, eye_dir_norm, normal), 1);
gl_FragColor += vec4
( calcLighting(light1, eye_dir, eye_dir_norm, normal) …
Run Code Online (Sandbox Code Playgroud) 我有一个C++类,它有一个私有的未使用的char[]
严格来添加填充到类,以防止在共享数组中使用该类时的错误共享.我的问题是双重的:
在某些情况下,编译器是否可以优化此数据成员?
private field * not used
当我编译时,如何使警告静音-Wall
?优选地,没有明确地使警告静音,因为我仍然希望在其他地方捕获该问题的实例.
我写了一个小测试来检查我的编译器,似乎该成员没有删除,但我想知道标准是否允许这种优化.
#include <iostream>
class A {
public:
int a_ {0};
private:
char padding_[64];
};
int main() {
std::cout << sizeof(A) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
$ clang++ --version
clang version 3.3 (tags/RELEASE_33/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
$ clang++ -std=c++11 -O3 -Wall padding.cc
padding.cc:8:8: warning: private field 'padding_' is not used [-Wunused-private-field]
char padding_[64];
^
1 warning generated.
$ ./a.out
68
Run Code Online (Sandbox Code Playgroud)