Autodesk 663B1-05A111-1001 User Guide - Page 171

Hardware Shaders, Use glDrawRangeElements to draw with. This is the API recommended by

Page 171 highlights

9 | Performance tips How do I > Get the most out of Maya Hardware Shaders These are coding tips for hardware shader plug-in writers. • Do not push and pop all GL attributes if not required. This is more expensive than pushing specific attributes. • If you're only using hardware shaders in the scene view, we recommend that you use the older API: geometry(), bind() and unbind(). If you also want to batch render your hardware shader, we recommend you use the newer API: glGeometry, glBind and glUnbind. • We recommend you cache all node attributes as internal. The example plugins hwColorPerVertex, hwPhongShader and the cgFxShader all do this. Noncached values are very expensive to evaluate and can double the draw time. • Avoid using complex attributes (structures and arrays). • If the output color on the shader is not important, do not make any attributes affect it. This causes additional computation as marking one attribute dirty causes a recomputation to derive the dependent one. • The compute() method can be left empty if not required. The simpler the method the better. You will not see Hypershade swatches if you do not compute the output color. • Do not post-normalize tangents in the plug-in. This is done for you. • Data sent via the geometry calls are read-only and are cached internally. Do not modify the values. • Use simple data structures (versus Maya API objects) for simple data. For example, use float3 versus MFloatVector. There is a performance overhead due to the interfaces used in OpenMaya. • Take advantage of methods available on M3dView. OpenGL state is cached internally and can give better performance than using beginGL(), endGL() and direct calls to OpenGL. • Use glDrawRangeElements to draw with. This is the API recommended by the card vendor for drawing with the geometry arrays passed to the hardware shader. • Make sure to set the hasTransparency() return value appropriately. Setting it to true causes Maya to draw an object twice (once culling front faces, once culling back). • Take into account the current display state in M3dView. For example, don't disable lighting if the display mode is Use No Lights. • When transparency is enabled, framebuffer blending is already enabled. You do not need to enable it again. • Take advantage of the new method: MPxHwShaderNode::currentPath() to send the appropriate information for attribute query methods (for example, getTexCoordSetNames()). • Test which parameters on color/alpha and depth mask are enabled for interactive and especially for hardware rendering. They can give hints as to how to draw a simpler version of the geometry. Basics 171

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • 335
  • 336
  • 337
  • 338
  • 339
  • 340
  • 341
  • 342
  • 343
  • 344
  • 345
  • 346
  • 347
  • 348
  • 349
  • 350
  • 351
  • 352
  • 353
  • 354
  • 355
  • 356
  • 357
  • 358
  • 359
  • 360
  • 361
  • 362
  • 363
  • 364
  • 365
  • 366
  • 367
  • 368
  • 369
  • 370
  • 371
  • 372
  • 373
  • 374
  • 375
  • 376
  • 377
  • 378
  • 379
  • 380
  • 381
  • 382
  • 383
  • 384
  • 385
  • 386
  • 387
  • 388
  • 389
  • 390
  • 391
  • 392
  • 393
  • 394
  • 395
  • 396
  • 397
  • 398
  • 399
  • 400
  • 401
  • 402
  • 403
  • 404
  • 405
  • 406
  • 407
  • 408
  • 409
  • 410
  • 411
  • 412
  • 413
  • 414
  • 415
  • 416
  • 417
  • 418
  • 419
  • 420
  • 421
  • 422
  • 423
  • 424
  • 425
  • 426
  • 427
  • 428
  • 429
  • 430
  • 431
  • 432
  • 433
  • 434
  • 435
  • 436
  • 437
  • 438
  • 439
  • 440
  • 441
  • 442
  • 443
  • 444
  • 445
  • 446
  • 447
  • 448
  • 449
  • 450
  • 451
  • 452
  • 453
  • 454
  • 455
  • 456
  • 457
  • 458
  • 459
  • 460
  • 461
  • 462
  • 463
  • 464
  • 465
  • 466
  • 467
  • 468
  • 469
  • 470
  • 471
  • 472
  • 473
  • 474

9 | Performance tips
How do I > Get the most out of Maya
Basics
171
Hardware Shaders
These are coding tips for hardware shader plug-in writers.
Do not push and pop all GL attributes if not required. This is more expensive
than pushing specific attributes.
If you’re only using hardware shaders in the scene view, we recommend that
you use the older API: geometry(), bind() and unbind(). If you also want to
batch render your hardware shader, we recommend you use the newer API:
glGeometry, glBind and glUnbind.
We recommend you cache all node attributes as internal. The example plug-
ins hwColorPerVertex, hwPhongShader and the cgFxShader all do this. Non-
cached values are very expensive to evaluate and can double the draw time.
Avoid using complex attributes (structures and arrays).
If the output color on the shader is not important, do not make any attributes
affect it. This causes additional computation as marking one attribute dirty
causes a recomputation to derive the dependent one.
The compute() method can be left empty if not required. The simpler the
method the better. You will not see Hypershade swatches if you do not
compute the output color.
Do not post-normalize tangents in the plug-in. This is done for you.
Data sent via the geometry calls are read-only and are cached internally. Do
not modify the values.
Use simple data structures (versus Maya API objects) for simple data. For
example, use float3 versus MFloatVector. There is a performance overhead
due to the interfaces used in OpenMaya.
Take advantage of methods available on M3dView. OpenGL state is cached
internally and can give better performance than using beginGL(), endGL() and
direct calls to OpenGL.
Use glDrawRangeElements to draw with. This is the API recommended by the
card vendor for drawing with the geometry arrays passed to the hardware
shader.
Make sure to set the hasTransparency() return value appropriately. Setting it
to true causes Maya to draw an object twice (once culling front faces, once
culling back).
Take into account the current display state in M3dView. For example, don't
disable lighting if the display mode is Use No Lights.
When transparency is enabled, framebuffer blending is already enabled. You
do not need to enable it again.
Take advantage of the new method: MPxHwShaderNode::currentPath() to
send the appropriate information for attribute query methods (for example,
getTexCoordSetNames()).
Test which parameters on color/alpha and depth mask are enabled for
interactive and especially for hardware rendering. They can give hints as to
how to draw a simpler version of the geometry.