00001 /*************************************************************************** 00002 *cr 00003 *cr (C) Copyright 1995-2019 The Board of Trustees of the 00004 *cr University of Illinois 00005 *cr All Rights Reserved 00006 *cr 00007 ***************************************************************************/ 00008 00009 /*************************************************************************** 00010 * RCS INFORMATION: 00011 * 00012 * $RCSfile: OptiXRenderer.h,v $ 00013 * $Author: johns $ $Locker: $ $State: Exp $ 00014 * $Revision: 1.133 $ $Date: 2021年05月14日 22:35:37 $ 00015 * 00016 ***************************************************************************/ 00075 #ifndef LIBOPTIXRENDERER 00076 #define LIBOPTIXRENDERER 00077 00078 #if defined(_WIN32) || defined(_WIN64) || defined(_MSC_VER) 00079 // OptiX headers require NOMINMAX be defined for Windows builds 00080 #define NOMINMAX 1 00081 #endif 00082 00083 #include <optix.h> 00084 #include <optix_math.h> 00085 #include <stdio.h> 00086 #include <stdlib.h> 00087 #include "Matrix4.h" 00088 #include "ResizeArray.h" 00089 #include "WKFUtils.h" 00090 00091 class VMDApp; 00092 class VMDDisplayList; 00093 00094 // Compile-time flag for collection and reporting of ray statistics 00095 #if 0 00096 #define ORT_RAYSTATS 1 00097 #endif 00098 00099 // Compile-time flag to enable the use of RTX hardware ray tracing 00100 // acceleration APIs in OptiX 00101 #if OPTIX_VERSION >= 60000 00102 #define ORT_USERTXAPIS 1 00103 #endif 00104 00105 00106 // XXX OptiX 4.0 and later versions have a significant performance impact 00107 // on VMD startup if we use 256-way combinatorial shader specialization. 00108 // Shader template specialization had very little impact on 00109 // OptiX versions 3.[789].x previously. The new LLVM based compiler 00110 // back-end used in recent versions of OptiX has much more overhead 00111 // when processing large numbers of shaders single PTX files. 00112 // If we want to retain the template specialization approach, 00113 // we will have to generate shader code and store it in many separate 00114 // PTX files to mitigate overheads in back-end compiler infrastructure. 00115 #if OPTIX_VERSION < 40000 00116 // this macro enables or disables the use of an array of 00117 // template-specialized shaders for every combination of 00118 // scene-wide and material-specific shader features. 00119 #define ORT_USE_TEMPLATE_SHADERS 1 00120 #endif 00121 00122 // #define VMDOPTIX_VCA_TABSZHACK 1 00123 #ifdef VMDOPTIX_VCA_TABSZHACK 00124 #define ORTMTABSZ 64 00125 #else 00126 #define ORTMTABSZ 256 00127 #endif 00128 00129 // When compiling with OptiX 3.8 or greater, we use the new 00130 // progressive rendering APIs rather than our previous hand-coded 00131 // progressive renderer. 00132 #if (defined(VMDOPTIX_VCA) || (OPTIX_VERSION >= 3080)) // && !defined(VMDUSEOPENHMD) 00133 #define VMDOPTIX_PROGRESSIVEAPI 1 00134 #endif 00135 00136 #if 1 || defined(VMDOPTIX_PROGRESSIVEAPI) 00137 #define VMDOPTIX_LIGHTUSEROBJS 1 00138 #endif 00139 00140 // Prevent interactive RT window code from being compiled when 00141 // VMD isn't compiled with an interactive GUI 00142 #if defined(VMDOPTIX_INTERACTIVE_OPENGL) && !defined(VMDOPENGL) 00143 #undef VMDOPTIX_INTERACTIVE_OPENGL 00144 #endif 00145 00146 #if defined(VMDOPTIX_INTERACTIVE_OPENGL) 00147 #include "glwin.h" 00148 #endif 00149 00151 typedef struct { 00152 RTmaterial mat; 00153 int isvalid; 00154 float ambient; 00155 float diffuse; 00156 float specular; 00157 float shininess; 00158 float reflectivity; 00159 float opacity; 00160 float outline; 00161 float outlinewidth; 00162 int transmode; 00163 int ind; 00164 } ort_material; 00165 00166 typedef struct { 00167 float dir[3]; 00168 float color[3]; // XXX ignored for now 00169 } ort_directional_light; 00170 00171 typedef struct { 00172 float pos[3]; 00173 float color[3]; // XXX ignored for now 00174 } ort_positional_light; 00175 00176 00177 class OptiXRenderer { 00178 public: 00179 enum ClipMode { RT_CLIP_NONE=0, RT_CLIP_PLANE=1, RT_CLIP_SPHERE=2 }; 00180 enum HeadlightMode { RT_HEADLIGHT_OFF=0, RT_HEADLIGHT_ON=1 }; 00181 enum FogMode { RT_FOG_NONE=0, RT_FOG_LINEAR=1, RT_FOG_EXP=2, RT_FOG_EXP2=3 }; 00182 enum CameraProjection { RT_PERSPECTIVE=0, 00183 RT_ORTHOGRAPHIC=1, 00184 RT_CUBEMAP=2, 00185 RT_DOME_MASTER=3, 00186 RT_EQUIRECTANGULAR=4, 00187 RT_OCULUS_RIFT 00188 }; 00189 enum Verbosity { RT_VERB_MIN=0, RT_VERB_TIMING=1, RT_VERB_DEBUG=2 }; 00190 enum BGMode { RT_BACKGROUND_TEXTURE_SOLID=0, 00191 RT_BACKGROUND_TEXTURE_SKY_SPHERE=1, 00192 RT_BACKGROUND_TEXTURE_SKY_ORTHO_PLANE=2 }; 00193 enum RayType { RT_RAY_TYPE_RADIANCE=0, 00194 RT_RAY_TYPE_SHADOW=1, 00195 RT_RAY_TYPE_COUNT=2 }; 00196 enum RayGen { RT_RAY_GEN_CLEAR_ACCUMULATION_BUFFER=0, 00197 RT_RAY_GEN_ACCUMULATE=1, 00198 RT_RAY_GEN_COPY_FINISH=2, 00199 #if defined(ORT_RAYSTATS) 00200 RT_RAY_GEN_CLEAR_RAYSTATS=3, 00201 RT_RAY_GEN_COUNT=4 }; 00202 #else 00203 RT_RAY_GEN_COUNT=3 }; 00204 #endif 00205 00206 private: 00207 VMDApp *app; 00208 Verbosity verbose; 00209 int width; 00210 int height; 00211 char shaderpath[8192]; 00212 00213 wkf_timerhandle ort_timer; 00214 double time_ctx_create; 00215 double time_ctx_setup; 00216 double time_ctx_validate; 00217 double time_ctx_AS_build; 00218 double time_ctx_destroy_scene; 00219 double time_ray_tracing; 00220 double time_image_io; 00221 00222 // OptiX objects managed by VMD 00223 int context_created; 00224 RTcontext ctx; 00225 RTresult lasterror; 00226 00227 #if defined(ORT_USERTXAPIS) 00228 int rtx_enabled; 00229 int hwtri_enabled; 00230 #endif 00231 int buffers_allocated; 00232 int buffers_progressive; 00233 RTbuffer framebuffer; 00234 RTvariable framebuffer_v; 00235 RTbuffer accumulation_buffer; 00236 RTvariable accumulation_buffer_v; 00237 RTvariable accum_count_v; 00238 #if defined(ORT_RAYSTATS) 00239 // the ray stats buffers get cleared when clearing the accumulation buffer 00240 RTbuffer raystats1_buffer; 00241 RTvariable raystats1_buffer_v; 00242 RTbuffer raystats2_buffer; 00243 RTvariable raystats2_buffer_v; 00244 #endif 00245 00246 int clipview_mode; 00247 RTvariable clipview_mode_v; 00248 float clipview_start; 00249 RTvariable clipview_start_v; 00250 float clipview_end; 00251 RTvariable clipview_end_v; 00252 00253 int headlight_mode; 00254 RTvariable headlight_mode_v; 00255 00256 #if defined(VMDOPTIX_LIGHTUSEROBJS) 00257 RTvariable dir_light_list_v; 00258 RTvariable pos_light_list_v; 00259 #else 00260 RTvariable dir_lightbuffer_v; 00261 RTbuffer dir_lightbuffer; 00262 RTvariable pos_lightbuffer_v; 00263 RTbuffer pos_lightbuffer; 00264 #endif 00265 00266 RTvariable ao_ambient_v; 00267 float ao_ambient; 00268 RTvariable ao_direct_v; 00269 float ao_direct; 00270 RTvariable ao_maxdist_v; 00271 float ao_maxdist; 00272 00273 RTprogram exception_pgm; 00274 00275 int set_accum_raygen_pgm(CameraProjection &proj, int stereo_on, int dof_on); 00276 00277 #if defined(ORT_RAYSTATS) 00278 RTprogram clear_raystats_buffers_pgm; 00279 #endif 00280 00281 RTprogram clear_accumulation_buffer_pgm; 00282 RTprogram draw_accumulation_buffer_pgm; 00283 RTprogram draw_accumulation_buffer_stub_pgm; 00284 00285 RTprogram ray_gen_pgm_cubemap; 00286 RTprogram ray_gen_pgm_cubemap_dof; 00287 RTprogram ray_gen_pgm_cubemap_stereo; 00288 RTprogram ray_gen_pgm_cubemap_stereo_dof; 00289 00290 RTprogram ray_gen_pgm_dome_master; 00291 RTprogram ray_gen_pgm_dome_master_dof; 00292 RTprogram ray_gen_pgm_dome_master_stereo; 00293 RTprogram ray_gen_pgm_dome_master_stereo_dof; 00294 00295 RTprogram ray_gen_pgm_equirectangular; 00296 RTprogram ray_gen_pgm_equirectangular_dof; 00297 RTprogram ray_gen_pgm_equirectangular_stereo; 00298 RTprogram ray_gen_pgm_equirectangular_stereo_dof; 00299 00300 RTprogram ray_gen_pgm_oculus_rift; 00301 RTprogram ray_gen_pgm_oculus_rift_dof; 00302 RTprogram ray_gen_pgm_oculus_rift_stereo; 00303 RTprogram ray_gen_pgm_oculus_rift_stereo_dof; 00304 00305 RTprogram ray_gen_pgm_perspective; 00306 RTprogram ray_gen_pgm_perspective_dof; 00307 RTprogram ray_gen_pgm_perspective_stereo; 00308 RTprogram ray_gen_pgm_perspective_stereo_dof; //< perspective cam (stereo) 00309 00310 RTprogram ray_gen_pgm_orthographic; 00311 RTprogram ray_gen_pgm_orthographic_dof; 00312 RTprogram ray_gen_pgm_orthographic_stereo; 00313 RTprogram ray_gen_pgm_orthographic_stereo_dof; 00314 00315 RTprogram closest_hit_pgm_general; 00316 #if defined(ORT_USE_TEMPLATE_SHADERS) 00317 RTprogram closest_hit_pgm_special[ORTMTABSZ]; 00318 #endif 00319 #if defined(ORT_USERTXAPIS) 00320 RTprogram closest_hit_pgm_general_hwtri; 00321 #if defined(ORT_USE_TEMPLATE_SHADERS) 00322 RTprogram closest_hit_pgm_special_hwtri[ORTMTABSZ]; 00323 #endif 00324 #endif 00325 00326 RTprogram any_hit_pgm_opaque; 00327 RTprogram any_hit_pgm_transmission; 00328 RTprogram any_hit_pgm_clip_sphere; 00329 00330 RTprogram miss_pgm_solid; 00331 RTprogram miss_pgm_sky_sphere; 00332 RTprogram miss_pgm_sky_ortho_plane; 00333 00334 00335 RTmaterial material_general; 00336 #if defined(ORT_USE_TEMPLATE_SHADERS) 00337 RTmaterial material_special[ORTMTABSZ]; 00338 #endif 00339 #if defined(ORT_USERTXAPIS) 00340 RTmaterial material_general_hwtri; 00341 #if defined(ORT_USE_TEMPLATE_SHADERS) 00342 RTmaterial material_special_hwtri[ORTMTABSZ]; 00343 #endif 00344 #endif 00345 int material_special_counts[ORTMTABSZ]; 00346 00347 00348 // cylinder array primitive 00349 RTprogram cylinder_array_isct_pgm; 00350 RTprogram cylinder_array_bbox_pgm; 00351 long cylinder_array_cnt; 00352 00353 // color-per-cylinder array primitive 00354 RTprogram cylinder_array_color_isct_pgm; 00355 RTprogram cylinder_array_color_bbox_pgm; 00356 long cylinder_array_color_cnt; 00357 00358 00359 // color-per-ring array primitive 00360 RTprogram ring_array_color_isct_pgm; 00361 RTprogram ring_array_color_bbox_pgm; 00362 long ring_array_color_cnt; 00363 00364 00365 // sphere array primitive 00366 RTprogram sphere_array_isct_pgm; 00367 RTprogram sphere_array_bbox_pgm; 00368 long sphere_array_cnt; 00369 00370 // color-per-sphere array primitive 00371 RTprogram sphere_array_color_isct_pgm; 00372 RTprogram sphere_array_color_bbox_pgm; 00373 long sphere_array_color_cnt; 00374 00375 00376 // triangle mesh primitives of various types 00377 RTprogram tricolor_isct_pgm; 00378 RTprogram tricolor_bbox_pgm; 00379 long tricolor_cnt; 00380 00381 RTprogram trimesh_c4u_n3b_v3f_isct_pgm; 00382 RTprogram trimesh_c4u_n3b_v3f_bbox_pgm; 00383 long trimesh_c4u_n3b_v3f_cnt; 00384 00385 RTprogram trimesh_n3f_v3f_isct_pgm; 00386 RTprogram trimesh_n3f_v3f_bbox_pgm; 00387 long trimesh_n3b_v3f_cnt; 00388 00389 RTprogram trimesh_n3b_v3f_isct_pgm; 00390 RTprogram trimesh_n3b_v3f_bbox_pgm; 00391 long trimesh_n3f_v3f_cnt; 00392 00393 RTprogram trimesh_v3f_isct_pgm; 00394 RTprogram trimesh_v3f_bbox_pgm; 00395 long trimesh_v3f_cnt; 00396 00397 // state variables to hold scene geometry 00398 int scene_created; 00399 RTgeometrygroup geometrygroup; 00400 RTacceleration acceleration; 00401 #if defined(ORT_USERTXAPIS) 00402 // OptiX RTX hardware-accelerated triangles API 00403 RTgeometrygroup geometrytrianglesgroup; 00404 RTacceleration trianglesacceleration; 00405 #endif 00406 00407 RTgroup root_group; 00408 RTacceleration root_acceleration; 00409 RTvariable root_object_v; 00410 RTvariable root_shadower_v; 00411 00412 // 00413 // OptiX shader state variables and the like 00414 // 00415 00416 // progressive rendering mode (vs. batch) 00417 RTvariable progressive_enabled_v; 00418 00419 unsigned int scene_max_depth; 00420 int scene_max_trans; 00421 RTvariable max_depth_v; 00422 RTvariable max_trans_v; 00423 00424 RTvariable radiance_ray_type_v; 00425 RTvariable shadow_ray_type_v; 00426 RTvariable scene_epsilon_v; 00427 00428 // shadow rendering mode 00429 RTvariable shadows_enabled_v; 00430 int shadows_enabled; 00431 00432 RTvariable cam_zoom_v; 00433 float cam_zoom; 00434 00435 RTvariable cam_pos_v; 00436 RTvariable cam_U_v; 00437 RTvariable cam_V_v; 00438 RTvariable cam_W_v; 00439 00440 RTvariable cam_stereo_eyesep_v; 00441 float cam_stereo_eyesep; 00442 RTvariable cam_stereo_convergence_dist_v; 00443 float cam_stereo_convergence_dist; 00444 00445 int dof_enabled; 00446 RTvariable cam_dof_focal_dist_v; 00447 RTvariable cam_dof_aperture_rad_v; 00448 float cam_dof_focal_dist; 00449 float cam_dof_fnumber; 00450 00451 #if 0 00452 RTvariable camera_projection_v; 00453 #endif 00454 CameraProjection camera_projection; 00455 00456 int ext_aa_loops; 00457 00458 RTvariable accum_norm_v; 00459 00460 RTvariable aa_samples_v; 00461 int aa_samples; 00462 00463 RTvariable ao_samples_v; 00464 int ao_samples; 00465 00466 // background color and/or gradient parameters 00467 BGMode scene_background_mode; 00468 RTvariable scene_bg_color_v; 00469 float scene_bg_color[3]; 00470 RTvariable scene_bg_grad_top_v; 00471 float scene_bg_grad_top[3]; 00472 RTvariable scene_bg_grad_bot_v; 00473 float scene_bg_grad_bot[3]; 00474 RTvariable scene_gradient_v; 00475 float scene_gradient[3]; 00476 RTvariable scene_gradient_topval_v; 00477 float scene_gradient_topval; 00478 RTvariable scene_gradient_botval_v; 00479 float scene_gradient_botval; 00480 RTvariable scene_gradient_invrange_v; 00481 float scene_gradient_invrange; 00482 00483 // clipping plane/sphere parameters 00484 int clip_mode; 00485 float clip_start; 00486 float clip_end; 00487 00488 // fog / depth cueing parameters 00489 RTvariable fog_mode_v; 00490 int fog_mode; 00491 RTvariable fog_start_v; 00492 float fog_start; 00493 RTvariable fog_end_v; 00494 float fog_end; 00495 RTvariable fog_density_v; 00496 float fog_density; 00497 00498 ResizeArray<ort_material> materialcache; 00499 00500 ResizeArray<ort_directional_light> directional_lights; 00501 ResizeArray<ort_positional_light> positional_lights; 00502 00503 // keep track of all of the OptiX objects we create on-the-fly... 00504 ResizeArray<RTbuffer> bufferlist; 00505 ResizeArray<RTgeometry> geomlist; 00506 ResizeArray<RTgeometryinstance> geominstancelist; 00507 #if defined(ORT_USERTXAPIS) 00508 // OptiX RTX hardware-accelerated triangles API 00509 ResizeArray<RTgeometrytriangles> geomtriangleslist; 00510 ResizeArray<RTgeometryinstance> geomtrianglesinstancelist; 00511 #endif 00512 00513 void append_objects(RTbuffer buf, RTgeometry geom, 00514 RTgeometryinstance instance) { 00515 bufferlist.append(buf); 00516 geomlist.append(geom); 00517 geominstancelist.append(instance); 00518 } 00519 00520 #if defined(ORT_USERTXAPIS) 00521 // OptiX RTX hardware-accelerated triangles API 00522 void append_objects(RTbuffer nbuf, RTbuffer cbuf, 00523 RTgeometrytriangles geom_hwtri, 00524 RTgeometryinstance instance_hwtri) { 00525 bufferlist.append(nbuf); 00526 bufferlist.append(cbuf); 00527 geomtriangleslist.append(geom_hwtri); 00528 geomtrianglesinstancelist.append(instance_hwtri); 00529 } 00530 00531 void append_buffer(RTbuffer buf) { 00532 bufferlist.append(buf); 00533 } 00534 #endif 00535 00538 float calc_matrix_scale_factor(const float *matrix); 00539 00540 00541 public: 00542 OptiXRenderer(VMDApp *vmdapp); 00543 ~OptiXRenderer(void); 00544 00547 static unsigned int device_list(int **, char ***); 00548 static unsigned int device_count(void); 00549 static unsigned int optix_version(void); 00550 00551 static int material_shader_table_size(void); 00552 00554 void check_verbose_env(); 00555 00557 void create_context(void); 00558 void setup_context(int width, int height); 00559 00561 void report_context_stats(void); 00562 00564 void shadows_on(int onoff) { shadows_enabled = (onoff != 0); } 00565 00567 void set_aa_samples(int cnt) { aa_samples = cnt; } 00568 00570 void set_camera_projection(CameraProjection m) { camera_projection = m; } 00571 00573 void set_camera_zoom(float zoomfactor) { cam_zoom = zoomfactor; } 00574 00576 void set_camera_stereo_eyesep(float eyesep) { cam_stereo_eyesep = eyesep; } 00577 00579 void set_camera_stereo_convergence_dist(float dist) { 00580 cam_stereo_convergence_dist = dist; 00581 } 00582 00584 void dof_on(int onoff) { dof_enabled = (onoff != 0); } 00585 00587 void set_camera_dof_focal_dist(float d) { cam_dof_focal_dist = d; } 00588 00590 void set_camera_dof_fnumber(float n) { cam_dof_fnumber = n; } 00591 00593 void set_ao_samples(int cnt) { ao_samples = cnt; } 00594 00596 void set_ao_ambient(float aoa) { ao_ambient = aoa; } 00597 00599 void set_ao_direct(float aod) { ao_direct = aod; } 00600 00601 void set_bg_mode(BGMode m) { scene_background_mode = m; } 00602 void set_bg_color(float *rgb) { memcpy(scene_bg_color, rgb, sizeof(scene_bg_color)); } 00603 void set_bg_color_grad_top(float *rgb) { memcpy(scene_bg_grad_top, rgb, sizeof(scene_bg_grad_top)); } 00604 void set_bg_color_grad_bot(float *rgb) { memcpy(scene_bg_grad_bot, rgb, sizeof(scene_bg_grad_bot)); } 00605 void set_bg_gradient(float *vec) { memcpy(scene_gradient, vec, sizeof(scene_gradient)); } 00606 void set_bg_gradient_topval(float v) { scene_gradient_topval = v; } 00607 void set_bg_gradient_botval(float v) { scene_gradient_botval = v; } 00608 00610 void set_clip_sphere(ClipMode mode, float start, float end) { 00611 clip_mode = mode; 00612 clip_start = start; 00613 clip_end = end; 00614 } 00615 00617 void set_cue_mode(FogMode mode, float start, float end, float density) { 00618 fog_mode = mode; 00619 fog_start = start; 00620 fog_end = end; 00621 fog_density = density; 00622 } 00623 00624 void init_materials(); 00625 void add_material(int matindex, float ambient, float diffuse, 00626 float specular, float shininess, float reflectivity, 00627 float opacity, float outline, float outlinewidth, 00628 int transmode); 00629 void set_material(RTgeometryinstance instance, int matindex, 00630 const float *uniform_color, int hwtri=0); 00631 00632 void clear_all_lights() { 00633 directional_lights.clear(); 00634 positional_lights.clear(); 00635 } 00636 void set_clipview_mode(int mode) { 00637 clipview_mode = mode; 00638 }; 00639 void set_headlight_onoff(int onoff) { 00640 headlight_mode = (onoff==1) ? RT_HEADLIGHT_ON : RT_HEADLIGHT_OFF; 00641 }; 00642 void add_directional_light(const float *dir, const float *color); 00643 void add_positional_light(const float *pos, const float *color); 00644 00645 void update_rendering_state(int interactive); 00646 00647 void framebuffer_config(int fbwidth, int fbheight, int interactive); 00648 void framebuffer_resize(int fbwidth, int fbheight); 00649 void framebuffer_map_rgb4u(unsigned char **imgrgb4u); 00650 void framebuffer_unmap(); 00651 void framebuffer_destroy(void); 00652 00653 void render_compile_and_validate(void); 00654 void render_to_file(const char *filename, int writealpha); 00655 #if defined(VMDOPTIX_INTERACTIVE_OPENGL) 00656 void render_to_glwin(const char *filename, int writealpha); 00657 #endif 00658 void render_to_videostream(const char *filename, int writealpha); 00659 00660 #if defined(VMDOPTIXRTRT) 00661 00662 void add_material_cmdlist(const VMDDisplayList *cmdList); 00663 00666 void scene_aggregate_cmdlist(const VMDDisplayList *cmdList, 00667 const float *colorData); 00668 00670 void scene_aggregation_complete(); 00671 00673 void render_current_scene(); 00674 #endif 00675 00676 void destroy_scene(void); 00677 void destroy_context(void); 00678 00679 void cylinder_array(Matrix4 *wtrans, float rscale, const float *uniform_color, 00680 int cylnum, const float *points, int matindex); 00681 00682 void cylinder_array_color(Matrix4 *wtrans, float rscale, int cylnum, 00683 const float *points, const float *radii, 00684 const float *colors, int matindex); 00685 00686 void ring_array_color(Matrix4 & wtrans, float rscale, int rnum, 00687 const float *centers, const float *norms, 00688 const float *radii, const float *colors, int matindex); 00689 00690 void sphere_array(Matrix4 *wtrans, float rscale, const float *uniform_color, 00691 int spnum, const float *centers, const float *radii, 00692 int matindex); 00693 00694 void sphere_array_color(Matrix4 & wtrans, float rscale, int spnum, 00695 const float *centers, const float *radii, 00696 const float *colors, int matindex); 00697 00698 00699 // 00700 // Triangle mesh geometry 00701 // Beginning with OptiX 5.2 and Turing-class GPUs, VMD uses the new 00702 // NVIDIA RTX hardware-accelerated triangle APIs. In combination with 00703 // general OptiX software improvements, the Turing GPUs implement 00704 // hardware-accelerated BVH traversal, BVH-embedded storage of 00705 // triangle meshes, and hardware-accelerated triangle intersection. 00706 // In combination, these advances can provide a factor of ~8x 00707 // performance gain compared with the classic OptiX APIs running on 00708 // Volta-class hardware. 00709 // 00710 #if defined(ORT_USERTXAPIS) 00711 void tricolor_list_hwtri(Matrix4 & wtrans, 00712 int numtris, const float *vnc, int matindex); 00713 #endif 00714 void tricolor_list(Matrix4 & wtrans, 00715 int numtris, const float *vnc, int matindex); 00716 00717 00718 #if defined(ORT_USERTXAPIS) 00719 void trimesh_c4n3v3_hwtri(Matrix4 & wtrans, 00720 int numverts, const float *cnv, 00721 int numfacets, const int * facets, 00722 int matindex); 00723 #endif 00724 void trimesh_c4n3v3(Matrix4 & wtrans, 00725 int numverts, const float *cnv, 00726 int numfacets, const int * facets, 00727 int matindex); 00728 00729 00730 #if defined(ORT_USERTXAPIS) 00731 void trimesh_c4u_n3b_v3f_hwtri(Matrix4 & wtrans, const unsigned char *c, 00732 const signed char *n, const float *v, 00733 int numfacets, int matindex); 00734 #endif 00735 void trimesh_c4u_n3b_v3f(Matrix4 & wtrans, const unsigned char *c, 00736 const signed char *n, const float *v, 00737 int numfacets, int matindex); 00738 00739 00740 #if defined(ORT_USERTXAPIS) 00741 void trimesh_c4u_n3f_v3f_hwtri(Matrix4 & wtrans, const unsigned char *c, 00742 const float *n, const float *v, 00743 int numfacets, int matindex); 00744 #endif 00745 void trimesh_c4u_n3f_v3f(Matrix4 & wtrans, const unsigned char *c, 00746 const float *n, const float *v, 00747 int numfacets, int matindex); 00748 00749 00750 #if defined(ORT_USERTXAPIS) 00751 void trimesh_n3b_v3f_hwtri(Matrix4 & wtrans, const float *uniform_color, 00752 const signed char *n, const float *v, 00753 int numfacets, int matindex); 00754 #endif 00755 void trimesh_n3b_v3f(Matrix4 & wtrans, const float *uniform_color, 00756 const signed char *n, const float *v, 00757 int numfacets, int matindex); 00758 00759 00760 #if defined(ORT_USERTXAPIS) 00761 void trimesh_n3f_v3f_hwtri(Matrix4 & wtrans, const float *uniform_color, 00762 const float *n, const float *v, 00763 int numfacets, int matindex); 00764 #endif 00765 void trimesh_n3f_v3f(Matrix4 & wtrans, const float *uniform_color, 00766 const float *n, const float *v, 00767 int numfacets, int matindex); 00768 00769 00770 #if defined(ORT_USERTXAPIS) 00771 void trimesh_v3f_hwtri(Matrix4 & wtrans, const float *uniform_color, 00772 const float *v, int numfacets, int matindex); 00773 #endif 00774 void trimesh_v3f(Matrix4 & wtrans, const float *uniform_color, 00775 const float *v, int numfacets, int matindex); 00776 00777 00778 #if defined(ORT_USERTXAPIS) 00779 void tristrip_hwtri(Matrix4 & wtrans, 00780 int numverts, const float * cnv, 00781 int numstrips, const int *vertsperstrip, 00782 const int *facets, int matindex); 00783 #endif 00784 void tristrip(Matrix4 & wtrans, 00785 int numverts, const float * cnv, 00786 int numstrips, const int *vertsperstrip, 00787 const int *facets, int matindex); 00788 00789 }; 00790 00791 #endif 00792