小编Coo*_*kyt的帖子

WebGL片段着色器未在if语句上正确分支

我正在开发一个实现阴影贴图的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_coordcalculateLighting正常工作.

不过,这是奇怪的事情,用以下代码替换上面的内容:

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)

shader opengl-es glsl webgl

9
推荐指数
1
解决办法
2252
查看次数

可以在C++中优化未使用的数据成员

我有一个C++类,它有一个私有的未使用的char[]严格来添加填充到类,以防止在共享数组中使用该类时的错误共享.我的问题是双重的:

  1. 在某些情况下,编译器是否可以优化此数据成员?

  2. private field * not used当我编译时,如何使警告静音-Wall?优选地,没有明确地使警告静音,因为我仍然希望在其他地方捕获该问题的实例.

我写了一个小测试来检查我的编译器,似乎该成员没有删除,但我想知道标准是否允许这种优化.

padding.cc

#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)

c++ memory

6
推荐指数
1
解决办法
1108
查看次数

标签 统计

c++ ×1

glsl ×1

memory ×1

opengl-es ×1

shader ×1

webgl ×1