Programming Memoirs

3D (depth) composition of CUDA ray traced images with OpenGL rasterized images using CUDA Driver API

Depth composition of CUDA ray traced image with OpenGL rasterised object transformation gizmos

Ray tracing is a great method of generating synthetic images. It has many benefits over traditionally used (e.g. in computer game) rasterization. Ray tracing stays great up to the moment when you need to render e.g. a line segment placed in your 3D space (which is potential occluded by other 3D objects).

Why would you want to ray trace a line or a line segment? Say you want to create some kind of transformation gizmo for you 3D objects which blends nicely into the scene, or a bounding box depicting the boundaries of an object, or include wire frame of meshes in your ray traced scene, or …  There are many potential uses.

You cannot just mathematically test for camera ray vs. line segment collision and expect the line segment to appear on the ray traced rendering. Chance of a camera ray colliding a line segment are too slim for the line segment to be visible.

You can try simulating a line by drawing a thin cylinder, or an ‘x’ made of 2 quads. But this is far from an elegant solution. Additionally, your ‘line’ stops being a mathematical line, as it suddenly has a width. Thus, it becomes thicker closer to the camera, and thinner further away from it (considering you use perspective projection).

Fortunately there is a solution for drawing lines in ray traced content. The solution involves using some some kind of rasterization based renderer, such as OpenGL to draw the lines (or any objects) separately from the ray tracing pass and then performing a 3D composition of the two images.  The problem becomes even more interesting if you obtain the ray traced image using CUDA and CUDA Driver API.

CUDA and OpenGL interoperability using CUDA Driver API

Before we compose CUDA ray traced content with OpenGL rasterised content we need to obtain the former. If you’re a CUDA programmer you know that CUDA does not posses any native graphics output and You have to manually take care of displaying the generated data. One of the solutions for this is to write pixel data into a OpenGL Pixel Buffer Object (PBO), copying the content of PBO to an OpenGL texture, and rendering a quad textured using this texture into the viewport. Fortunately for us CUDA and OpenGL interoperability is quite robust and this can be done quite easily, even when using lower-level CUDA Driver API.

// general initialisation

GLuint pbo; // Pixel buffer object
GLuint tex; // Texture
unsigned int width = 512; // horizontal render resolution
unsigned int height = 512; // vertical render resolution

// Init PBO
glGenBuffersARB(1, &pbo);
glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, width*height*sizeof(GLubyte)*4, 0, GL_STREAM_DRAW_ARB);

// Init Texture
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glBindTexture(GL_TEXTURE_2D, 0);

// Allocate CUDA graphic Resource (Notice that I'm using Driver API function calls)
CUgraphicsResource * cuda_pbo_resource = (CUgraphicsResource*) malloc(sizeof(CUgraphicsResource));
cuGraphicsGLRegisterBuffer(cuda_pbo_resource, // returns pointer to the CUDA resource
 pbo, // we pass here the OpenGL resource

Rendering pass #1 — Ray tracing in CUDA

We render our scene (only solid objects, i.e. no lines etc.) using ray tracing. We store the raw pixel data in a PBO mapped as CUDA resource.
Note that PBO resource has to be unmapped from CUDA for OpenGL to be able to reliably access it. Thus we map the PBO resource to CUDA only for the time of ray tracing.

// map PBO resource
cuGraphicsMapResources(1, cuda_pbo_resource, 0); //mapping is only temporary

// get pointer in CUDA memory space for to the resource
CUdeviceptr d_pbo; // CUDA pointer through which the mapped graphics resources may be accessed
size_t num_bytes; //size of memory which may be accessed from that pointer
cuGraphicsResourceGetMappedPointer(&d_pbo, &num_bytes, *cuda_pbo_resource); // the d_pbo will be passed to rendering kernel

// Start ray tracing kernel
start_CUDA_ray_tracing_kernel(d_pbo, num_bytes); // render to PBO. Pass the pointer to the memory space where the data is to be saved

// unmap PBO resource
cuGraphicsUnmapResources(1, cuda_pbo_resource, 0);

After the PBO is filled with data by CUDA kernel we copy the content of the PBO to an OpenGL texture. On current hardware this step takes less than a milisecond for a 24 bits per pixel with a 512×512 resolution, thus it’s quite fast. Alternatively. You could attempt to render from CUDA directly to OpenGL texture memory space.

// copy from PBO to texture
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glBindTexture(GL_TEXTURE_2D, tex);  // bind our texture!
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, 0); // copy data
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0); // unbind PBO

Displaying CUDA rendered content with OpenGL

We can now render the texture onto a quad which is filling the viewport (using orthogonal projection).

// select matrix mode
glMatrixMode(GL_PROJECTION); // we select to  work with projection matrix stack
glLoadIdentity(); // make sure the there is nothing on the stack

glOrtho(0,1, 0,1,
0,             // zNear
999.0f);    // zFar

// clear color and depth buffer
glDisable(GL_DEPTH_TEST); // we dont need it right now

// draw binded textured to a quad filling the viewport
	glTexCoord2f(0, 0); glVertex2f(0, 0);
	glTexCoord2f(1, 0); glVertex2f(1, 0);
	glTexCoord2f(1, 1); glVertex2f(1, 1);
	glTexCoord2f(0, 1); glVertex2f(0, 1);

glBindTexture(GL_TEXTURE_2D, 0);  // unbind texture

Rendering pass #2 — Rasterisation with OpenGL

We render the whole 3D scene (solid object only) once more, this time using OpenGL. You would probably want to switch the view mode from orthogonal to perspective projection with the same parameters as you used in your ray tracer (i.e. camera position, FOV, camera ‘look at’ point). I recommend setting the perspective manually using glFrustum() as it allows to set the camera parameters in a similar manner as you have probably used them in the CUDA kernel for ray tracing.

Note, that now we want to render the scene only to the OpenGL depth buffer — set you color buffer channel’s masks to false, and have depth testing enabled. Also, we will not need any OpenGL lights, textures, fog etc. — have them disabled.  As we are rasterizing only depth information this additional rendering pass is quite fast even for complex scenes.

// set perspective to the same as in the ray tracing pass
GLdouble fl_left = camera->plane_height;    // width of left
GLdouble fl_right = -camera->plane_height; // width of right (note the MINUS)
GLdouble fl_top = camera->plane_width;	// width of top
GLdouble fl_bottom = -camera->plane_width; // width of bottom (note the MINUS)
GLdouble zNear = camera->plane_distance;  // near clipping distance
GLdouble zFar = camera->plane_distance + 100; // far clipping distance

glFrustum(fl_left, fl_right, fl_bottom, fl_top, zNear, zFar);

 // camera position
 // look_at is stored as a normal vector, thus we add it to the camera position to determine a point in space where to look
 camera->origin.x + camera->look_at.x,
 camera->origin.y + camera->look_at.y,
 camera->origin.z + camera->look_at.z,
 // camera up direction

// render only to depth buffer
glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE); // we dont want to render to color buffer
glEnable(GL_DEPTH_TEST); // it is important to be enabled now

// Render the meshes in the scene to depth buffer only (do not render lines yet)

Now, we want to enable color mask, and while having the depth testing still on, we rasterize remaining objects (lines, points etc.) to the color and depth buffers of OpenGL. However we can choose to also rasterize any additional solid objects at this point, basically any OpenGL scene!

glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); // we now want to render colors

As the depth buffer already contains scene depth information, rasterized object and ray traced objects will seem to occlude each other in a manner which you would expect. :-) You can also achieve a partial occlution by CUDA object (transparency effect), but first rasterizing the misc. OpenGL objects partly transparent with GL_DEPTH_TEST disabled, and later rendering them fully opaque with depth testing enabled.

Oh, don’t forget to swap buffers if you were using double buffering!


The major limitation of this method is the obvious fact that the lines (or any misc OpenGL rendered content) present behind translucent object (which in ray tracing refract light) won’t appear refracted. Same goes for reflections. Fortunately, for transformation gismos, bounding boxes etc. this is not really a problem. It might be even desirable.

Additional resources

You might also want to check this resource for more on depth composition of images in OpenGL.

More on PBOs can be found here and here.

Triers CUDA ray tracing tutorial — a great tutorial with source code available.

Hope this helps.

136 ResponsesLeave one →

  1. You actually said that well! [url=]augmentin antibiotic[/url]
    Duloxetine Nursing Implications

  2. [url=]order elimite online[/url]

  3. [url=]корпусная мебель оптом от производителя москва[/url] или [url=]кухонный уголок купить в москве глубина 50см[/url]

    Матрас SONYA- 1

  4. [url=]elimite cream[/url]

  5. NeooTievy

     /  2019/11/11

    Здесь вы можете заказать копию любого сайта под ключ, недорого и качественно, при этом не тратя свое время на различные программы и фриланс-сервисы.

    Клонированию подлежат сайты как на конструкторах, так и на движках:
    - Tilda (Тильда)
    - Wix (Викс)
    - Joomla (Джумла)
    - WordPress (Вордпресс)
    - Bitrix (Битрикс)
    и т.д.
    телефон 8-996-725-20-75 звоните пишите viber watsapp
    Копируются не только одностраничные сайты на подобии Landing Page, но и многостраничные. Создается полная копия сайта и настраиваются формы для отправки заявок и сообщений. Кроме того, подключается админка (админ панель), позволяющая редактировать код сайта, изменять текст, загружать изображения и документы.

    Здесь вы получите весь комплекс услуг по копированию, разработке и продвижению сайта в Яндексе и Google.

    Хотите узнать сколько стоит сделать копию сайта?
    напишите нам
    8-996-725-20-75 звоните пишите viber watsapp

  6. [url=][/url]

  7. Рекомендую Вам посетить сайт, на котором есть много статей по этому вопросу.

    В этом что-то есть. Теперь всё понятно, благодарю за помощь в этом вопросе. скачать фифа, скачать fifa и [url=][/url] скачать фифа

  8. venereal disease treatment first aid for heat cramps

  9. Great work! This is the type of information that are supposed to be shared around the net. Shame on the search engines for not positioning this post upper! Come on over and discuss with my web site . Thanks =)

  10. Quite right! It seems to me it is good idea. I agree with you.

    In my opinion you commit an error. Let’s discuss it. what to buy my girl friend, buy baby girl clothes, [url=][/url] what to buy for birthday girl

  11. I think, that you are not right. Let’s discuss. Write to me in PM.

    I can look for the reference to a site with a large quantity of articles on a theme interesting you. big girls escort, high class escort girls, [url=]agency[/url] vienna escort girls

  12. No doubt.

    Bravo, excellent idea and is duly escort marathon, love escort, [url=]models[/url] escort silver

  13. You were mistaken, it is obvious.

    In my opinion you commit an error. Let’s discuss. Write to me in PM, we will talk. munich escort, x escort, [url=]here[/url] escort video

  14. Вы ошибаетесь. Могу отстоять свою позицию. Пишите мне в PM, поговорим.

    Извините, что я Вас прерываю, но, по-моему, есть другой путь решения вопроса. скачать fifa 15 без торрента, fifa 15 32 битная скачать торрент или [url=]fifa 15 cracks 3dm v5 скачать[/url] фифа 15 кряк торрент

  15. Это интересно. Вы мне не подскажете, где я могу об этом прочитать?

    Я конечно, прошу прощения, но это мне не подходит. Есть другие варианты? скачать fifa 15 xbox 360 freeboot, скачать английский комментатор для fifa 15 а также [url=]кряк фифа 15[/url] fifa 15 cracks 3dm скачать торрент

  16. Мне кажется, что это уже обсуждалось.

    Давайте поговорим на эту тему. origin для fifa 15 скачать бесплатно торрент, fifa 15 crack only by 3dm а также [url=]скачать fifa 15 с яндекс диска[/url] скачать fifa 15 фнл

  17. AAi is part of Asad Abbas & Co. (Chartered Accountants), an accounting, tax and business consultancy firm in UAE and a member of PrimeGlobal International, one of the 5 largest associations of independent accounting firms in the world. Asad Abbas & Co. (Chartered Accountants) provides cost-effective and efficient professional services to the business community.

  18. GREEN BAY, Wis. (AP) 锟?Running back Eddie Lacy and receiver Davante Adams missed Green Bay Packers practice on Thursday with ankle injuries.
    Watching the film from Sunday’s 37-29 loss at Carolina, Packers coach Mike McCarthy saw too many mental errors, an offense that was out of [url=]Cheap Shoes Australia Online[/url] sync before a late comeback, a defense that permitted too many big plays and more reason to worry about running back Eddie Lacy.
    Rueben Randle had two phenomenal weeks to finish the season, Larry Donnell was a pleasant surprise in his first season as the starting tight end and receiving group will be even better if Victor Cruz comes [url=]Wholesale NFL Jerseys[/url] back from his second knee injury.
    “Once they settled down they played well. They came off the ball well,” Denver coach Gary Kubiak said.
    Second Place (tie) 锟?Florida Today, to Wayne Price, for “Selection of work”

  19. abbakfluen

     /  2019/07/07


  20. Jos ehkä adidas Adizero Beat 9: n esimies mahtuu esim. DS Traineriin, minulla olisi henkilökohtaisesti urheilullinen kengän 5 toimija. Jopa nyt olen itse valinnut pehmustetun reagointikyvyn kapealle osalle adidas Supercharge -höyryllä, jotta saisit hyvät pyöräilyt. Vaihtoehtoisesti samat saappaat ja kengät sisältävät Sauconyn Freedom ISO: n, innovatiivisen tasapainon Vazee Prismin sekä Nike’s Lunar Slip plus Innovative Steadiness 1500 T2.

    FLYTEFOAM Lyte vaahto lisätään DUOMAX-välipohjaosaamiseen, joka kannustaa 12 tuumaa 8 mm: n sisällä. kantapää toe. AVOI TRUSSTIC PROCEDURE -osaaminen kannustaa henkilön 12 tuumaa tukemaan keskimmäistä päätä siten, että voit hylätä kääntymisen vähentäessäsi pääpainon ylimääräistä rasvaa.

    Suuri vetovoima Asics Mexico 66 Paraty-kengät tälle ulkopohjalle näyttivät olevan heti näkyvissä kanssani, jotta tämä aluksi suoritettaisiin, ja se on todella silloin, kun DS saa sen termillä. Jatkuvasti mielenkiintoinen, minä lähetin sähköpostitse kaikki kaupunkimme RSG: n asukkaat, jotka olivat päteviä tämän urheilukengän aikana, Jon Ober (katso arvioita yhdeksäntoista, 20, 24 ja 23) alun perin, sekä koirasi välittömästi sähköpostitse yhdessä oikean jälkeen tietojen ja tosiseikkojen jälkeen juuri sen jälkeen, kun olin henkilökohtaisesti epäilemättä havainnut kengän veton.

  21. Многие компании и организации не хотят иметь собственный автопарк. Поэтому, им легче воспользоваться услугами аренды автомобилей с водителем. Подробнее читайте на сайте [url=][/url]

  22. RUS

    Приветствуем Вас. Приглашаем принять участие в перспективной Американской компании House-investment. Долгосрочные условия работы гарантированны. Реальный доход до 5% в сутки. Присоединяйтесь! Обсудить можно в группе Facebook Тарифы очень лояльные, начиная от $1 – это просто СКАЗКА а не тарифы. Зовите людей и рассказывайте про нас, у вас будет своя ссылка и свой Личный кабинет для приглашения партнёров. Партнёрская программа на 4 уровня. Проект из США. Лицензия: № 10570874 Адрес зарегистрированного офиса 73 Ladybarn Lane, Манчестер, Великобритания, M14 6YL, Директор SUDBURY, Daniel Patrick. [url=]Подробнее на сайте[/url].


    We welcome you. We invite you to take part in the perspective American company House-investment. Long-term working conditions are guaranteed. Real income up to 5% per day. Join us! You can discuss in the group Facebook Rates are very loyal, ranging from $1-it’s just a fairy TALE and not tariffs. Call people and tell about us, you will have your own link and your Personal account to invite partners. Affiliate program on 4 levels. A project of the United States. The license is available…read License: № 10570874 Registered office address 73 Ladybarn Lane, Manchester, United Kingdom, M14 6YL 1 current officer SUDBURY, Daniel Patrick [url=]More on the website[/url].

  23. [url=]на сайте[/url] поворот объектов в AutoCAD

  24. [url=][img][/img][/url] Поворот в Автокаде.

  25. [url=][/url]

  26. В этом что-то есть. Понятно, большое спасибо за помощь в этом вопросе.

    Эта информация не верна аксессуары интересные, интересное рукоделие или [url=]продолжение[/url] интересные новости
    [url=]на этом сайте[/url]

  27. Я считаю, что Вы ошибаетесь. Могу отстоять свою позицию.

    НОРМАЛЬНО синонимы интересный, вязание интересное и [url=]на странице[/url] синонимы интересно
    [url=]на странице[/url]
    [url=http://xn----jtbndekcbayqf3c.xn--p1ai/catalog/00-00006784/00-00006786.html?SECTION_CODE=00-00006784&ELEMENT_CODE=00-00006786]на странице[/url]

  28. кстати забыл еще…

    Ваша идея просто отличная интересная этимология, викисловарь интересный и [url=]тут[/url] интересное программирование

  29. Совершенно верно! Мне кажется это отличная идея. Я согласен с Вами.

    Я считаю, что Вы не правы. Я уверен. Пишите мне в PM, пообщаемся. интересные электроприборы, интересные аттракционы или [url=;u=238574]здесь[/url] интересный кроссворд
    [url=]на странице[/url]
    [url=]на странице[/url]

  30. Очень полезная мысль

    Я думаю, что Вы не правы. Могу это доказать. интересные частушки, телепроекты интересные и [url=]продолжение[/url] программы интересные
    [url=]на странице[/url]
    [url=]на этом сайте[/url]
    [url=]на этом сайте[/url]

  31. Вразумительный ответ

    И на чем остановимся? ттс товары почтой, сайт товаров почтой а также [url=]Slim N Lift мужская майка утяжка[/url] отправить товар почте
    [url=][/url] Биолипосактор живота за 147 руб
    Talia – средство для сжигания жира за 147 руб [url=][/url]
    [url=]StepToSlim капли для похудения за 147 руб[/url]
    [url=]Тибетский сбор для похудения[/url]
    StepToSlim капли для похудения [url=][/url]

  32. Абсолютно с Вами согласен. Мне нравится Ваша идея. Предлагаю вынести на общее обсуждение.

    Абсолютно с Вами согласен. Мне кажется это отличная идея. Я согласен с Вами. книги товары почтой, товар почта или Уникальный пояс для похудения и коррекции фигуры Xtreme Power Belt [url=][/url] почтой бесплатно товары
    [url=][/url] Биолипосактор живота за 147 руб
    [url=][/url] Garden Pro от насекомых и грызунов
    [url=][/url] Слиммер – комплексное средство для похудения за 147 руб
    [url=]Garden Pro от насекомых и грызунов[/url]
    Slimagic эликсир для похудения Без цены [url=][/url]


Leave a Reply to parapharmacie leclerc