2016-07-20 2 views
3

У меня есть OpenGL VBO, содержащий cl_float4 вершины, и я пытаюсь обновить VBO через OpenCL (я визуализирую содержимое VBO как GL_POINTS). Я передаю объект cl_mem, представляющий VBO в качестве аргумента ядра (буфер устанавливается как CL_MEM_READ_WRITE).OpenCL - добавление `float4` в` float4` массив ничего не делает

К сожалению, я не могу обновить данные одной вершины float4 сразу.

После сниппет не работает (т.е. оказанным точек не движется):

__kernel void update(__global float4* particle_positions) 
{ 
    int gid = get_global_id(0); 

    particle_positions[gid] += float4(0.1, 0.1, 0.1, 0.0); 
} 

После сниппета делает работу (т.е. оказанные точки движутся):

__kernel void update(__global float4* particle_positions) 
{ 
    int gid = get_global_id(0); 

    particle_positions[gid].x += 0.1; 
    particle_positions[gid].y += 0.1; 
    particle_positions[gid].z += 0.1; 
} 
+5

(float4) (0,1, 0,1, 0,1, 0,0); не float4 (0,1, 0,1, 0,1, 0,0); –

+0

@huseyintugrulbuyukisik Спасибо, это работает! Если вы опубликуете это как ответ, я приму это. Это был действительно глупый вопрос: я пришел из GLSL, и я (неосмотрительно) убедил, что OpenCL C будет иметь такой же синтаксис, поэтому рассмотрение различий синтаксиса между GLSL и OpenCL C даже не пришло мне в голову. – sarasvati

+1

Это не глупый вопрос. ваш пост и ответ помогут следующему парню, у которого такая же проблема. – mfa

ответ

2

Необходимо, чтобы оно находилось в параллельном положении, например

(float4)(1,1,1,1) 

, чтобы иметь тип float4. Или вы можете использовать другие типы тоже

(float4)((float2)(1,1),(float2)(1,1)) 

или смешанный тип

(float4)((float2)(1,1),1,1) 

действует как перегруженной функции.

Смежные вопросы