optix入门

article/2025/11/9 15:48:54

射线追踪是embarrassingly parallel/perfectly parallel/pleasingly parallel的问题,就是说基本不用费劲就可以并行化。

射线追踪是指从某点发射射线,判断其与几何结构的交点,根据交点对图像进行渲染,或者计算。

nvidia optix是基于cuda的api,可充分利用gpu的计算能力对射线追踪进行加速。

 

主要概念和步骤:

cpu端

首先建立场景/环境context,就是进行射线追踪的环境。
        RT_CHECK_ERROR( rtContextCreate( &context ) );

        RT_CHECK_ERROR( rtContextSetRayTypeCount( context, 1 ) );//设置射线类型
射线一般关联一个payload数据结构,用于存储射线追踪过程的数据,如颜色等等。因此,不同payload的射线可以有不同的类型。另外,不同用途的射线也可以设置不同的类型,例如有的用在closest hit中,有的用在any hit中。

RT_CHECK_ERROR( rtContextSetEntryPointCount( context, 1 ) );

设置入口点个数。一个入口点和一个射线生成程序关联。当调用rtContextLaunchnD时,射线生成程序是首先执行的入口点,它的功能类似c语言中的main函数。射线生成程序是并行执行的。每个thread有一个rtLaunchIndex,可用来区分thread。

        RT_CHECK_ERROR( rtBufferCreate( context, RT_BUFFER_OUTPUT, &buffer ) );
        RT_CHECK_ERROR( rtBufferSetFormat( buffer, RT_FORMAT_FLOAT4 ) );
        RT_CHECK_ERROR( rtBufferSetSize2D( buffer, width, height ) );
        RT_CHECK_ERROR( rtContextDeclareVariable( context, "result_buffer", &result_buffer ) );
        RT_CHECK_ERROR( rtVariableSetObject( result_buffer, buffer ) );

buffer缓冲区用来在host和gpu之间交换数据。buffer只能由host创建。

variable变量用来在程序间交互数据。variables可以在各个层级声明,例如context、program、geometry等。
const char *ptx = sutil::getPtxString( "optixHello", "draw_color.cu" );//读取ptx文件
        RT_CHECK_ERROR( rtProgramCreateFromPTXString( context, ptx, "draw_solid_color", &ray_gen_program) );

把ptx文件中draw_solid_color的函数绑定到程序对象ray_gen_program上。
        RT_CHECK_ERROR( rtProgramDeclareVariable( ray_gen_program, "draw_color", &draw_color ) );

声明一个叫做draw_color的变量,绑定到ray_gen_program上。
        RT_CHECK_ERROR( rtVariableSet3f( draw_color, 0.462f, 0.725f, 0.0f ) );
        RT_CHECK_ERROR( rtContextSetRayGenerationProgram( context, 0, ray_gen_program ) );//将draw_solid_color函数绑定到ray_gen_program

        /* Run */
        RT_CHECK_ERROR( rtContextValidate( context ) );
        RT_CHECK_ERROR( rtContextLaunch2D( context, 0 /* entry point */, width, height ) );

contextLaunch_n_D就是生成1维、2维、3维的逻辑计算网格(线程数?),每生成一个计算网格调用一次ray_gen_program,计算结果写入buffer。因此一般buffer的大小和计算网格的大小相同。

        /* Clean up */
        RT_CHECK_ERROR( rtBufferDestroy( buffer ) );
        RT_CHECK_ERROR( rtProgramDestroy( ray_gen_program ) );
        RT_CHECK_ERROR( rtContextDestroy( context ) );

然后设置几何,可以是简单几何体组合、变换,也可以是三角网格。

在gpu端,编写射线求交和渲染的程序。求交点的情况包括求最近交点closest hit、求任意交点any hit。closest hit是在射线与场景所有几何体求交后,得到距离射线起点最近的交点;any hit可能有几种情况:交点被忽略,例如射线经过透明介质;求交结束,此时求交只是为了计算两个表面是否可见;返回交点,并继续求交,这是any hit程序的默认定义。

示例程序

gpu端

1 产生射线

建立简单几何形状和包围盒

求交点

#include <optix.h>
#include <optixu/optixu_math_namespace.h>

using namespace optix;

rtDeclareVariable(uint2, launch_index, rtLaunchIndex, );

gpu的program还可以通过变量与Host进行交互。上述定义了一个launch_index的变量,它等同于OptiX内置的rtLaunchIndex。launch_index在本program内部使用。定义语法为:rtDeclareVariable(type,name,semantic,annotation )。

rtLaunchIndex是thread的索引号。
rtBuffer<float4, 2>   result_buffer;

定义了一个float4的二维数组,result_buffer。

rtDeclareVariable(float3,                draw_color, , );

RT_PROGRAM void draw_solid_color()
{
  result_buffer[launch_index] = make_float4(draw_color, 0.f);
}

optix prime专门用于射线与三角形求交点的高性能计算,而不具备着色等功能。


http://chatgpt.dhexx.cn/article/g2O331HQ.shtml

相关文章

jwt *

目录 一、jwt出现的原因及工作原理 1. JWT是什么 2. 为什么使用JWT 3. JWT的工作原理 4、jwt解决不需要登录就能直接访问的问题&#xff1a; 解决登录后树形菜单未出现的问题 &#xff1a; 二、jwt工具类介绍&#xff0c;三种场景 1、jwt工具类 2、三种场景 三、jwt…

JWT JWT

JWT&#xff08;JSON WEB TOKEN&#xff09; JWT的组成 header&#xff08;头部&#xff09;&#xff1a;中主要存储了两个字段 alg&#xff0c;typ。 alg表示加密的算法默认&#xff08;HMAC SHA256&#xff09;&#xff0c;typ表示这个令牌的类型默认为JWT。 payload&#…

JWT__

文章目录 JWT什么是JWT&#xff1f;JWT能做什么&#xff1f;认证流程JWT的结构是什么&#xff1f;使用代码要做一个JWT的例子引入pom依赖生成一个Token令牌验证令牌并从令牌中取出信息 JWT 什么是JWT&#xff1f; 官网地址:https://jwt.io/introduction/ 官方文档 JSON Web T…

JWT 和 JJWT 还傻傻的分不清吗

JWTs是JSON对象的编码表示。JSON对象由零或多个名称/值对组成&#xff0c;其中名称为字符串&#xff0c;值为任意JSON值。 JWT有助于在clear(例如在URL中)发送这样的信息&#xff0c;可以被信任为不可读(即加密的)、不可修改的(即签名)和URL - safe(即Base64编码的)。 JSON W…

【编码实战】2022年还在用jjwt操作jwt?,推荐你使用nimbus-jose-jwt,爽到飞起~

什么是nimbus-jose-jwt&#xff1f; nimbus-jose-jwt是基于Apache2.0开源协议的JWT开源库&#xff0c;支持所有的签名(JWS)和加密(JWE)算法。 对于JWT、JWS、JWE介绍 JWT是一种规范&#xff0c;它强调了两个组织之间传递安全的信息JWS是JWT的一种实现&#xff0c;包含三部分hea…

什么是JWT??

一、什么是JWT JWT(JSON WEB TOKEN)&#xff0c;通过数字签名的方式&#xff0c;以json对象为载体&#xff0c;在不同的服务终端之间安全的传输信息&#xff0c;用来解决传统session的弊端。 JWT在前后端分离系统&#xff0c;或跨平台系统中&#xff0c;通过JSON形式作为WEB应用…

JJWT实现令牌Token

登录实现方式 Session 详情&#xff1a; https://www.cnblogs.com/andy-zhou/p/5360107.html 会话的概念 会话就好比打电话&#xff0c;一次通话可以理解为一次会话。我们登录一个网站&#xff0c;在一个网站上不同的页面浏览&#xff0c;最后退出这个网站&#xff0c;也是…

3.JJWT

目录 1.JWT简介 2.JWT的结构 3.基于服务器的传统身份认证 4.基于token的身份认证 5. JWT的优势 6.Java中使用JJWT实现JWT 1.JWT简介 Json web token (JWT)&#xff0c; 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519)。该token被设计为紧凑且安全的…

JWT技术

JWT 一、 JWT 实现无状态 Web 服务 1、什么是有状态 有状态服务&#xff0c;即服务端需要记录每次会话的客户端信息&#xff0c;从而识别客户端身份&#xff0c;根据用户身份进行请求的处理&#xff0c;典型的设计如tomcat中的session。 例如登录&#xff1a;用户登录后&am…

token学习笔记(JWT、jjwt的使用及案例实现)

文章目录 1. 首先、了解什么是会话2. 会话跟踪的主要技术3. Token 令牌学习3.1 流程图3.2 token3.3 JWT(JSON web Tokens)Json web 令牌(规范)3.4 JWT结构3.5 JWT需要的依赖3.6 JWT的获取与验证流程3.7JWT的使用方式3.8 jjwt的使用&#xff08;创建JWT方式&#xff09;1. jjwt需…

JWT 进阶 -- JJWT

###jwt是什么? JWTs是JSON对象的编码表示。JSON对象由零或多个名称/值对组成&#xff0c;其中名称为字符串&#xff0c;值为任意JSON值。JWT有助于在clear(例如在URL中)发送这样的信息&#xff0c;可以被信任为不可读(即加密的)、不可修改的(即签名)和URL - safe(即Base64编码…

JWT详解和使用(jjwt)

JWT详解和使用 JWT是啥 JWT&#xff08;JSON Web Token&#xff09;是一个开放标准(RFC 7519)&#xff0c;它定义了一种紧凑的、自包含的方式&#xff0c;用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任&#xff0c;因为它是数字签名的。 下列场景中使用…

JJWT 实现JWT

1什么是JJWT JJWT 是一个提供端到端的 JWT 创建和验证的 Java 库。永远免费和开源 (Apache License&#xff0c;版本2.0)&#xff0c;JJWT 很容易使用和理解。它被设计成一个以建筑为中心的流畅界面&#xff0c;隐藏了它的大部分复杂性。 2JJWT快速入门 2.1token的创建 2.1…

什么是JWT?

在HTTP接口调用的时候&#xff0c;服务端经常需要对调用方做认证&#xff0c;以保证安全性。一种常见的认证方式是使用JWT(Json Web Token)&#xff0c;采用这种方式时&#xff0c;经常在header传入一个authorization字段&#xff0c;值为对应的jwt_token&#xff0c;或者也有图…

JWT的学习和JJWT的使用

1.什么是JWT JWT&#xff08;JSON Web Token&#xff09;是一个开放的行业标准&#xff0c;它定义了一种简介的&#xff0c;自包含的协议格式&#xff0c;用于在通信双方传递json对象&#xff0c;传递的信息经过数字签名可以被验证和信任。JWT可以使用HMAC算法或者使用RSA的公…

JWT详解

本文从本人博客搬运&#xff0c;原文格式更加美观&#xff0c;可以移步原文阅读&#xff1a;JWT详解 JWT简介 1.什么是JWT 在介绍JWT之前&#xff0c;我们先来回顾一下利用token进行用户身份验证的流程&#xff1a; 客户端使用用户名和密码请求登录服务端收到请求&#xff…

JWT详解、JJWT使用、token 令牌

前言 在正式讲解JWT之前&#xff0c;我们先重温一下用户身份认证相关的一些概念&#xff1a; 有状态登录&#xff08;session认证&#xff09; 服务器当中记录每一次的登录信息&#xff0c;从而根据客户端发送的数据来判断登录过来的用户是否合法。 缺点&#xff1a; 每个用…

Java的JJWT实现JWT

1 什么是 JJWT JJWT 是一个提供端到端的 JWT 创建和验证的 Java 库。永远免费和开源 (Apache License&#xff0c;版本2.0)&#xff0c;JJWT 很容易使用和理解。它被设计成一个以建筑为中心的流畅界面&#xff0c;隐藏了它的大部分复杂性。 2 token 的创建 2.1 引入依赖 &l…

解决Red Hat虚拟机与主机网络不通

虚拟机版本&#xff1a;Red Hat Enterprise Linux 7 64 位 安装&#xff1a;自定义安装&#xff0c;带GUI的服务器&#xff0c;创建图形化界面 创建完毕后发现网络ping不通&#xff0c;经过查阅各种资料&#xff0c;在同事的帮助下终于解决。做一个记录。 1、VMware网络配置。…

虚拟机VMware和宿主机连接

文章目录 一、NAT连接1.查看宿主机IP地址2.设置VMnet8信息2.设置虚拟机模式3.设置虚拟网络4.设置虚拟机内系统IP&#xff08;Centos8.2为例&#xff09;4.1.图形化操作4.1.1DHCP4.1.2静态IP4.1.3 重启网卡&#xff08;修改网卡信息后&#xff09; 5.测试5.1.宿主机ping虚拟机5.…