我使用光线跟踪并使用GPU计算像素颜色。我正在使用NVIDIA CUDA,现在想去VexCL。我正在尝试使用这样的代码:
struct Ray;
vex::Context ctx(...);
...
unsigned int frame_width, frame_height;
std::array<float, 4> camera_direction, camera_up;
float camera_fov;
...
// initialize values and store them in GPU memory too
...
vex::vector<Ray> rays(ctx, frame_width * frame_height);
等等
rays = some_expression_to_calculate_ray(vex::element_index(), frame_width,
camera_direction, camera_up, camera_fov);
所以我的问题是:如何向VexCL解释所有向量元素的某些值必须是通用的?
我正在尝试VEX_CONSTANT
,vex::raw_pointer
,但这不是我需要的。
答案 0 :(得分:0)
如果您将camera_direction
和camera_up
的类型从std::array<float,4>
更改为cl_float4
,那么您就可以直接在表达式中使用这些:
#include <vexcl/vexcl.hpp>
int main() {
vex::Context ctx(vex::Filter::Env);
VEX_FUNCTION(float, dummy, (size_t, idx)(cl_float4, dir)(cl_float4, up)(float, fov),
// whatever
return idx + length(dir - up) + fov;
);
cl_float4 camera_dir = {1, 2, 3, 4}, camera_up = {1, 0, 0, 0};
float camera_fov = 42;
vex::vector<float> rays(ctx, 1024);
rays = dummy(vex::element_index(), camera_dir, camera_up, camera_fov);
}
(为了简单起见,我已将rays
更改为浮点数向量,请参阅linked question了解如何使用VexCL中的结构。)camera_dir
,{{1并且camera_up
被定义为主机端,并且它们作为参数传递给内核。所以没有不必要的副本。这是生成的OpenCL内核:
camera_fov