I lied about doing no work today. Diablo III servers don't go live for another WHOLE HOUR yet. HOW THE HELL AM I GOING TO WAIT THAT LONG?! Probably by watching the devastatingly beautiful cinematics over and over and over again. I started watching the cinematic "making of" documentary on the collector's edition DVD, but it was spoilerific to the max. I should have probably expected that.
Anyway, here's a small update. Some diffuse texture tweaking, a bit of normal work, and the column mesh in a simple test scene. It probably goes without saying, but this is early days, and the lighting and shaders are miles off what we're aiming for so forgive the clunky work there. But hopefully the detail and overall aesthetic meets our benchmark. Having seen Chris Bennet's awesome WIP monster work, the pressure is on!
I think I'll hold off posting any more updates until we have a floor, ceiling, and at least first pass shaders/lighting in place, otherwise I'm being ultra granular and killing any anticipation we might (hopefully) be generating. And now I'm probably going to stop working because I'm far too anxious to concentrate. Instead, I'll go frantically refresh my Diablo 3 login screen.
Tired noob mistake. I posted the wall with a diffuse texture lacking an entire group of layers and adjustments. I couldn't shake the feeling that something looked very 'murky' with the wall I'd posted, so I finally checked the file and there you go, an entire group hidden in the .PSD. I win the shit out of posting stuff on the Internet :/
I replaced the original image with the corrected version, which has tweaked contrast levels and a final colour grade. Much better. I hope, anyway O_o
Done! Kind of... Still need to create a nice shader, and run some tests to ensure contrast levels work in-game. The specular texture is also done, along with the normal map, but until I have a sexy shader I won't be showing those off. I need to spend a bit of time painting out some errors from the normal bake, too. So really, this asset is freaking MILES from being done :/ But eh, I wanted to make a diary entry!
The game mesh clocks in at 333 polygons. I might have been a leetle beet lean, but eh... it's a wall!
There's no huge slab-of-text philosophical rant to accompany this post. Just self congratulatory back patting. First asset is, more or less, done! James will be glad to see some tangible progress, I'm sure
I've teamed up with ex-Krome colleague and coding genius (thinks in binary) James Podesta (aka. Madpuppet - check his games on iTunes) to work on something for Unity. With James focusing on code, the logical role for me in this partnership is art. It has been a long time since I've done much 3D, particularly unreferenced 3D intended for a gaming platform. So long in fact that a more appropriate word is "never".
It has been a bit of a trial getting back up to speed with the software, but more so, the process. It's funny how quickly creative dexterity is lost when you aren't exercising the right muscles*.
Luckily for me, I've been hanging around some insanely talented folk in recent years, and I've picked up some of their skills through observation. I hope that some kind of creative osmosis has taken place, and I've absorbed some of their overflowing awesome, too.
At any rate, I wanted to update the blog because it has been neglected a bit of late. So here is a sample of something I'm working on. It's a brick wall. Exciting, right? This is the high resolution mesh (as it currently stands) sans textures or complicated shaders. I'm not sure I started out with any particular influence in mind, but I like to fantasise that there's a little bit of Darksiders and a little bit of Blizzard in there. Maybe even a little Bitmap Brothers, which would totally rock my socks if I could pull off something of an homage to their style.
As always, if anyone has anything to say, I'd love to hear it. Especially if it's quotes from Edgar Allen Poe's "The Raven". That poem is EPIC.
* Not a euphemism.
Here's another little script that might help some folk. It creates a new renderLayer (or uses an existing renderLayer created by the script) and assigns an occlusion shader as an override.
The shader defaults to output bent normals (in world space) through the output RGB channels, and a 64 sample occlusion pass in the alpha channel. You can change the output, sample rate and light/dark color (defaulting to white and black respectively) by editing the created "btMib_amb_occlusion" node. It's important to note however, that due to occlusion output defaulting to the alpha channel, the light/dark colours have no affect unless you change the output mode.
The script takes two variables, the first being the name of the occlusion layer (defaulting to "btOcclusionRL" if no name, or an invalid name, is specified) and the second being an array of object(s) to add to the new layer. The easiest way to use the script is to simply select the object(s) you'd like to render in the occlusion layer - groups, transforms and shapes are fine - and then execute:
btCreateOcclusionPass "" `ls -sl`;
This will create a new layer with the default name (btOcclusionRL) and assign all selected objects to it.
Similar results can be achieved via Mental Ray's built-in render pass system, but I find this route beneficial for a number of reasons: Firstly, it's more visually intuitive, giving you immediate scene visualisation, and easy access to occlusion-only renders if needed. It also separates occlusion from the primary render pass (or passes), allowing an occlusion pass to be farmed out the moment the camera/animation are locked off. While multi-pass EXR's make for tidy folders, they also make for painful re-renders if something needs fixing.
And I just prefer to work via renderLayers where it makes more sense to do so I hope this proves useful to someone!
Ignore my strange way of seemingly arbitrarily naming my *.MEL scripts in a way that has only a vague relationship to the procedures contained within. The goal with this naming convention was to package related scripts into a single file. It's not the best way to work, but it keeps my folders clean and tidy. This script only contains a single procedure (as of writing) which assigns a mentalraySubdivApprox node to all selected polygon and subdiv shapes. It's another script which doesn't do a lot other than bypass a bit of a labyrinthine wander through menus (if you suffer from a lobotomy and struggle to recall anything past two turns) but I always prefer one click to 5. Mostly though, the procedure gets used in other scripts that batch process stuff.
Create (or assign an existing) mentalraySubdivApprox node with the specified name to all of the objects contained in the $contents array.
Okay, so it's not exactly voodoo... but who do? You do? Do what? Remind me of the babe!
Here's some more MEL procedures that might be helpful to other folk. There's nothing at all complicated about these, but I use them to reduce the number of clicks I need to do to set up a new scene for Mental Ray. Because I don't like clicking. It bothers me. Enough that I am happy to spend hours coding to save several seconds of clicking. I'm weird like that.
Checks if the MentalRay plugin is loaded (and loads it if it isn't) and then sets common MentalRay render globals, including: enabling color management and linear workflow, checking that the OpenEXR plugin is loaded, setting default output options, framebuffer to 32bit float, render mode to raytrace, and disables the default light.
Sets the renderer output string to either multi-pass EXR ($passType = "Combined") or per-pass EXRs ($passType = "Separate").
Sets some of the render globals relating to render quality, allowing you to quickly toggle between Draft ($qualityPreset = "Draft") and Production ($qualityPreset = "Production") settings. These presets are different to the default preset list available in render globals, and can easily be edited for preferred workflows.
Not much to it. Sets the render resolution to either 'Half' HD720 ($resolution = "HalfHD720"), HD720 ($resolution = "HD720") or HD1080 ($resolution = "HD1080). Essentially, the epitome of laziness.
Download these scripts and enjoy saving yourself about 4.5 seconds per scene.
A little off the topic of gameDev, but I've been working on making myself employable again lately, and that means diving back into Maya. I've been playing around with MentalRay, and I decided to write myself some MEL tools to help with setting up MR render properties and passes. This first tool assists with setting up matte passes, which are kind of fiddly and annoying to set up by hand - particularly if you have a large number of mattes to create. My tool sets the mattes up as single-channel, 8-bit render passes which are ideal for multi-channel EXR output.
Extract the contents of the .zip file into your user scripts directory, and then navigate to "yourScriptDirectory/MEL/boonTools/helper/boonHelper.mel" and edit the global variable $boonToolsRoot to point to your root script folder.
Launch the GUI with the following code:
source "MEL/boonTools/Render/boonMRRenderPassMatte.mel"; boonMRMattePassGUI();
The following is the boonMRMattePass GUI:
Matte Layer: Select either <New> layer, or an existing layer on which to apply a matte pass and create pass contribution maps.
Layer Name: When the <New> option is selected, this defines the new layer's name. If you type the name of an existing layer, the tool will behave the same as selecting that layer from the Matte Layer menu.
Matte PCM: Displays any pass contribution map assigned to the layer selected in the Matte Layer menu. If you select an existing PCM, selected objects will be added to it rather than a new matte being created.
Group Mode: When creating new pass contribution maps, this determines how the PCM(s) are created. Single creates one PCM containing all selected objects. Selection creates a unique PCM for each object/group in the current selection. Selection & Children creates a unique PCM for every individual object in the selected hierarchy. NOTE: If more than 10 PCMs will be created, you will be prompted to confirm.
Single / Suffix: When <New> is selected in the PCM menu, this defines the name for a Single PCM or the suffix for multiple PCMs. A suffix MUST be specified to ensure that PCMs created for multiple objects do not share the object's name. Note that if a name for a PCM which already exists is supplied, that existing PCM will be added to the membership of the specified layer.
Layer Suffix: If true, the layer name is also suffixed to the end of the PCM/matte renderPass. This is just to assist with unique naming if necessary, but is disabled by default.
Output PCM / Output Pass: Displays previews of the output PCM / matte renderPass names.
The recommended workflow with boonMRMattePass is to create a specific matte renderLayer, assign all geometry to the layer (no lights or unnecessary nodes) and then create matte passes for objects/groups as needed. Keep in mind that to create a holdout where non-matte geometry is occluding matte geometry, all occluding geometry must be added to the layer. If you're not dealing with transparencies, you can easily maximise rendering performance on the matte layer by assigning a simple surface shader as a material override.
I hope this comes in handy for someone. I imagine I'll be writing more render assistant tools over the coming days (the next plan is an ambient occlusion pass including bent normals for diffusely-convolved environment lookup). Also, coding in MEL makes me so, so happy... that Unity and C# are NOTHING LIKE IT.