2018年8月12日日曜日

Houdini Tutorial 0029 Spectrum Visualizerを英語字幕化してみた

はじめに

堀川淳一郎先生のHoudiniチュートリアル「Spectrum Visualizer」を英語字幕化してみました。最近TouchDesignerやHoudiniベースのVJ映像にも興味を持ち始めたので。ネイティブライクですが日本人の英語ということで何となく聞き取りやすい気がします。

約35分ある動画でHoudiniでのMIDIデータ制御の基礎を抑えるにはもってこいの内容で英語字幕化してみました。良ければご活用ください。

英語字幕化した動画

Houdini Tutorial#0029 "Spectrum Visualizer" (英語字幕完全版)



2016年7月1日金曜日

Youtube動画「Autodesk VRED Overview Webinar」を英語字幕化してみた

はじめに

「Autodesk VRED Overview」のチュートリアル動画を英語字幕化してみました。最近はUE4中心にゲームエンジンを活用したインタラクティブなVisualizationが注目されてきているのでVisualization関連ソフトにも興味持ち始めた次第です。その流れで今回はAutomotive用Visualiationソフトとして名高いVREDの動画をターゲットにしました。

約30分ある動画でVREDの基礎を広く浅く抑えるにはもってこいの内容で英語字幕化してみました。英語とVRED同時に勉強できると自分を納得させながら・・・。良ければご活用ください。

英語字幕化した動画

Autodesk VRED Overview Webinar (英語字幕付き)



2016年6月2日木曜日

Youtube動画「Blinking Materials in Stingray」を英語字幕化してみた

はじめに

週末の英会話喫茶レッスンで「Stingrayでの点滅マテリアルの作成方法に関するチュートリアル動画「Blinking Materials in Stingray」で自分がディクテーションして聞き取れなかった部分を先生に聞いてもらいながら一緒に不明箇所を潰していくという共同作業を行っていました。これでマリオの無敵状態を実現できます^^。

約23分ある動画でスピーカーがかなりcolloquial(話し言葉)な英語だったので中々大変でしたが何とか完成させる事が出来ました。スピーカーの英語にはかなり強くなったと思います。

本来英語力が備わっていれば23分で理解できるものをディクテーションをして英会話喫茶もして字幕ファイルも作るというかなり非効率な事をしてるのは自負していますが、色々模索しながら「英語とStingrayの同時スキルアップ」をしていければと考えています。よければご覧ください。

英語字幕化した動画

Blinking Materials in Stingray(英語字幕付き)



Youtube動画「Stingray Tutorial Trigger audio and particle effects」を英語字幕化してみた

はじめに

英語とStingrayのイベント処理の勉強をかねてYoutube動画「Stingray Tutorial Trigger audio and particle effects」を英語字幕化してみました。今回も非常に短いチュートリアルだったので、まず自分がディクテーションで英文を起こして、幾つか聞き取りにくい部分があったのでそれらは英会話の先生にチェックしてもらって完成させました。

肝心の内容は「Level上にTrigger Volumeを作成後、FlowでTriggerVolumeにCharacterがHitしたらParticle(爆発)とWwise(爆発音)を再生させるイベント処理」を仕込む流れを説明しています。どのゲームエンジンでも備わってる処理ではありますが、様々な応用が利くのでStingrayでも抑えておこうと思います

英語字幕化した動画

Stingray Tutorial Trigger audio and particle effects(英語字幕付き)



2016年4月26日火曜日

Youtube動画「Stingray Making a Custom Flow Node to Change a Material」の英語字幕化してみた

はじめに

英語とStingrayの勉強がてらYoutubeに上がっていた「Stingray Making a Custom Flow Node to Change a Material」を英語字幕化してみました。色々チュートリアル動画が上がってる中、モチベーションが持続しそうなシェーダーとLuaそしてFlowを同時に学べそうなので選択した次第です。全編12分弱でボリューム少なかったので一気に全英文を起こしてみました。ただ途中Luaのコーディングの部分を英語字幕に起こすのは馬鹿らしいなと思いました。

英語字幕化した動画

Stingray Making a Custom Flow Node to Change a Material(英語字幕付き)

大まかな内容としては車のBody部分のシェーダー自体をCarPaintシェーダーからSheetMetalシェーダーに切り替えるための手順を示しています。

  • 現状Stingrayはシェーダー自体を切り替えるノードは存在しないので(シェーダー内のパラメータを動的に変更は可能)、Luaでカスタムノードを作る必要があります。
  • LuaによるカスタムFlowノードの作り方はこちらのドキュメントにも書いてあるのですが癖があるので動画できっちり説明してくれるのはありがたいです。
  • カスタムFlowノード"Set Unit Material"を作成して動的にシェーダー自体を切り替える事ができるようになっています。
  • パワーアップアイテム取得したキャラのシェーダーを動的に切り替える際とか応用範囲が広そうです。



2016年4月23日土曜日

NOVAビジネス英語100復習(44a)

44a(Innovation1)

The issue

  • Intelligent machines have the potential to make our workplaces safer and more efficient.
  • However, many workers are worried about being replaced by machines, and many customers say that they prefer dealing with real people.

Background

  • Intelligent machines that can make decisions without human input are being used in more and more industries these days.
  • At a conference on robotics in the workplace, Ryan, Professor of Robotics at Stanford University, said "Machines make things more efficient. They don't need to sleep, so we can run them twenty-four hours a day, and they make fewer mistakes than human".
  • Intelligent machines are also getting better at imitating qualities such as human warmth. Some can even work out how humans feels.
  • Professor Ryan believes that this will allow them to perform tasks such as interviews and negotiations in the near future.
  • What jobs do you think are in danger of being replaced by intelligent machines?

In Action

  • A: Mark, how do you think new advances in robotics will affect your work?
  • B: I think robots may replace a lot of the people we employ on the factory floor in the near future. Robots can work in dangerous environments and thy make fewer mistakes.
  • A: Aaron, do you think intelligent machines are going to have a big effect where you work?
  • C: Definitely. Because computers are hooked up to the Internet and can access millions of files instantly, it'll be easier for them to assess the patient's condition and make decision on treatment. I think computers might supersede doctors in the next fifty years.
  • A: Jenny, what kind of impact will new technology have in your field?
  • D: Hmm. I think intelligent machines will perform sales presentation in the future. They can interact more efficiently with presentation tools and can access data quickly to answer audience questions.

Key vocabulary

  • I think robots might perform employee evaluation soon. However it could be just support or aid.
  • I think machines will conduct referees in sports games in the future as the support staff. However I think human misjudgement makes the game more interesting.
  • I guess kitchen workers in restaurants may be replaced by robots in the next dacade. Because machines are good at repetitive work.
  • I don't think computers will conduct staff training perfectly. Because training by human is more effective for human brains.
実現度高<--- will/may/might/won't --->実現度低

Applications

  • A. Computers will replace accountants in the next ten years. -> They're faster at doing calculations and make fewer mistakes.
  • B. Robots may perform tasks such as garbage collection in the future. -> We'll see more and more in the cleaning industry.
  • C. Machines might conduct business negotiations in the near future. -> They're already learning how to understand what people are thinking.

Useful Phrases / Words

  • be getting better at ... ~がますます改良されてきている
  • supersede ... ~の座を奪う
  • perform ... 執り行う
  • conduct ... 実施する
  • human warmth ... 人の温かさ
  • at imitating qualities such as ... ~といった点においての真似する質が
  • work out ... 何とか解決する、いい結果が出る -> 分析できる
  • misjudgement ... 誤審
  • assess ... 評価、査定する
  • instantly
  • be hooked up to ... ~に接続されてる
  • make decision on
  • patient's condition
  • repetitive work ... 反復作業
  • as an aid to ... ~の補助として
  • robotics ... ロボット工学
  • affect ... ~に作用する、影響を及ぼす
  • dangerous environments
  • a big effect

Useful sentences in Free conversation

  • The technology becomes more advanced
  • Even though the technology is improved upon ...
  • The goal is to make self-driving cars a reality.
  • Boxercise is a low impact sport for my knee.
  • Google and Apple are trying to 'break into' the automobile industry.
  • Robots will assist/help/support to something ...
  • Did you get a hair cut? -> No I got them all cut. (AJ)
  • I'd like to use as many paid holidays as possible
  • Now my knee doesn't make that sound

Unknown Phrases / Words in Free Conversation

  • tendon ... 腱
  • vertical <-> horizontal
  • transferable skills ... 移転(譲渡)可能なスキル
  • fuel type
  • the head chef
  • off (adj) -> not in the right place
  • misaligned (adj) -> misalignment (n)
  • work out (v) = understand
  • paid holiday
  • break into ... 割り込む、割って入る

2016年4月16日土曜日

NOVAビジネス英語100復習(37)

37a(TroubleShooting)

Useful Sentences

  • The workers worried that they could face layoffs or the company could go out of business.
  • The company is finding it difficult to compete with overseas manufactures.
  • The company is struggling to deal with rising production costs.
  • The company has made few changes over the last decade.
  • The company lost a big contact due to an inablity to increase production.
  • The company has contacted to us about improving its productivity.
  • I want you to visit its factory to assess how they operate. Then, prepare some recommendations.

Key Language: Investigating actions

  • Has anything been done about (the bottlenecks)?
  • Has anyone looked into (the time it takes to do each task)?
  • Have there been any recent changes made regarding (the factory layout)?

Applications

  • These machines are quite old. Has anyone looked into (upgrading them)?
  • Your teak wood supplier's price seem quite high. Has anything been done about (negotiating a better contract)?
  • You have a lot of people working at this station, but not so many at that one. Have there been any recent changes made regarding (staffing)?
  • Things really slow down when the products reach the packaging center. Has anything been done about (the bottlenecks)?

Useful Phrases/Words

  • struggle to ... ~しようと四苦八苦する、必死で~しようとする
  • consultant
  • inability ... 無能
  • out of business ... 倒産して
  • sources close to the company ... 会社に近い関係者(sources ≒ related to)
  • margin ... マージン/利幅
  • furniture retailer ... 家具小売店・小売業者
  • regarding ... ~に関して、~の点で
  • teak wood supplier ... チーク材供給業者
  • lay off ... 一時解雇する、layoffは一時解雇
  • staffing ... スタッフの配置
  • bottleneck ... 障害、ネック
  • assess ... 評価する
  • resignation ... 退職

Useful Phrases/Words in Free Conversation

  • heal the ache
  • announce my promotion
  • official document for resignation
  • inform my boss and the department members
  • muscle sprain -> my knee is sprained during body-combat
  • blood circulation
  • independent -> self study

37b(TroubleShooting)

Useful Sentences

  • You raised some good points.
  • The company can't handle its current production schedule, my recommendation would be for it to focus on either retail stores or businesses.
  • To improve efficiency, my suggestion is to automate their data entry system.
  • To help with the margins, the company should buy cheaper materials.
  • shouldがつくと少しやんわりとした丁寧な提案になる, shouldを省くとより強い提案となる。

Key Languages: Making formal recommendations

  • One advice is that you (automate data entry).
  • One recommendation is that you (train more people to monitor the inventory).
  • Another suggestion is that you (change the layout of the factory).

Applications

  • You throw out a lot of scrap wood. Another suggestion is that you reuse it.
  • The workers on the factory floor are the best people to identify problems. One recommendation is that you set up a feedback system.
  • Only a few people can recalibrate the machines. One advice is that you train more people on how to do that.
  • Our advice is that you renegotiate your contact with your current supplier.

Useful Phrases/Words

  • considering ... ~を考慮すれば
  • contact ... 連絡、窓口
  • supplier ... 供給業者、仕入先
  • recalibrate ... 再調整する
  • factory floor ... (工場の)現場
  • scrap wood ... 廃材
  • throw out ... 廃棄する
  • inventory ... 在庫
  • automate ... 自動化する
  • data entry system ... データ入力システム
  • retail store ...  小売店
  • arrange ... 用意、準備をする
  • self-driving cars
  • control the automotive market
  • construction industry ... 建築業界

2016年4月2日土曜日

NOVAビジネス英語100復習(31)

31a - Production development

Background

  • A Bubbled Beverages sales in Japan are falling.
  • B Healthy soft drinks are unpopular in Japan.

Examples

  • Bubbled Beverages Announces New Drinks for Japan
  • Bubbled Beverages has announced plans to release new drinks for Japanese market early next year in a bid to boost slumping sales there.
  • A Bubbled spokesperson made the following comment.
  • "Healthy soft drinks that can help lower cholesterol are now new top performers in Japan, and this trend is something that we are interested in."
  • Shares in Bubbled went up 0.5% after he announcement.

Assignment

Key Considerations

  • The product should appeal to the Japanese customer.
  • The product should look healthy.
  • The product should follow market trends.

Key Language: Outlining consideration

  • (Customer tastes) need to be taken into consideration.
  • We have to take (health trends) into account.
  • It's necessary to factor in (market trends).
  • I/We等で始まる場合はtake (something) into accountが自然だが、無生物主語の場合はneed to be taken into accountとかになる。

Examples

  • We have to take (distribution) into account.
  • People are most likely to buy the drink from a vending machine than a store.
  • (= People tend to buy the drink from a vending machine rather than a store.)

Corrected Sentences

  • The contract says my starting date (first day) is ....

Useful Phrases/Words

  • in a bid to ... try to (in order toに似てるがよりチャレンジングな時に使う)
  • slumping ... 低迷する
  • population demographics ... 人口統計
  • market trends ... 市場動向
  • consumer tastes … 顧客の好み
  • distribution ... 流通
  • the quality of ingredients ... 原料の品質
  • factor in ... take into consideration
  • probability ... 可能性
  • as opposed to = instead of, substitute
  • demographics = types of people
  • take into account (phrasal verb) -> separable
  • ex) take (something) into account
  • intention ... 意図、腹づもり
  • take over ... succeeded



31b - Product Development

Update

  • The product will be cheaper than other companies' products.
  • The product is designed to help lower cholesterol.
  • The product targets the over-forty age group.

Key Language: Presenting advantages

  • The advantage of (making the drink brown) is that (people associate brown with natural ingredients).
  • One benefit of (carbonating the drink) is that (it'll differentiate it from other health drinks.

Application Sentences

  • The advantage of (specifically targeting older consumers) is that (they are more interested in health).
  • One benefit of (this drink over others on the market) is that (it's designed with local tastes in mind).
  • The advantage of (using rice-based sweetener) is that (rice is a large part of local culture, so we're tailoring it to local tastes).

Corrected Sentences

  • As there are already a lot of teas on the market, we decided to carbonate our drinks.
  • The advantage of (doing that) is that it'll differentiate us from similar products.
  • I recommend we should develop... は冗長。We should develop ... か I recommend developing ...のほうが自然

Useful Phrases/Words

  • cholesterol ... コレステロール
  • carbonate = add bubbles, make a drink fuzzy(シューシュー音たてて泡立てる)
  • natural ingredients ... 天然成分
  • associate *** with ... "***を連想する
  • in mind ... ~を考慮して、念頭に置いて
  • sweetener ... 甘味料
  • sugar cane ... さとうきび
  • differentiate ... 差別化する
  • assume ... みなす
  • tailor = adapt
  • the product is aimed at ... ~に狙いを定める
  • shares ... 株

2016年4月1日金曜日

NOVAビジネス英語100復習(30)

30a - Evaluating People

Responsibilities

  • Job Title: Project Manager
  • coordinating with onsite engineers(現行エンジニアのまとめ)
  • liaising between departments(部署間の連携)
  • working with customers(顧客対応)

Requirements

  • degree in construction engineering(建築工学学士号)
  • 5-10 year's experience(5-10年の実務経験)
  • strong interpersonal skills(強力な対人関係のスキル)

Key Language: Rating

各スキルで5点満点の採点をする場合
  • I gave (him) a (five) for (work experience).
  • In terms of (education), (he) was a (three).

Useful Words/Phrases

  • coordinate with … まとめる
  • liaise between … 連携する
  • work with … 対応をする
  • anxiety … 心配事、不安、悩み→anxious(adj)
  • strained my knee … 膝を損傷した(使いすぎて痛めた)→ache (adj)
  • data-based/opinion-based rating(評価)
  • quantitative / qualitative
  • academic career



30b - Evaluating People

Key Language: Comparing

  • I think (she) was the most (articulate).
  • For me, (Ryan) seemed the most (decisive).

Useful Sentences

  • He has seven year's experience at Bandai where he did well as a Project Manager.
  • He led a team of thirty people and completed a couple of projects while there.
  • I'd go with Ryan because he was the most decisive. I gave him a four for leadership skills.
  • Kelly seemed the most articulate. In terms of interpersonal skills, I only gave Ryan a two.
  • I agree to some extent, but we're looking to hire a person who can lead.

Useful Words/Phrases

  • Interpersonal Skills → articulate, personable
  • education → educated
  • leadership skills → confident, decisive
  • problem solving → creative
  • work experience → experienced
  • articulate … はきはきとした
  • decisive … 断固とした
  • educated … 教育を受けた
  • personable … 愛想がよい
  • civil engineering … 土木工学
  • a couple of … 2~3の
  • more → 2 things
  • most → three or more things

NOVAビジネス英語100復習(23)

23a - Interview1

Key Language: Describing previous experience

  • I was responsible for (supervising junior office staff).
  • I was in charge of (tracking the office budget).

Applications

  • A: What were your responsibilities in your last job?
  • B: I was responsible for coordinating meetings.
  • C: What relevant experience do you have?
  • D: I was in charge of tracking expenses in my last job.

Corrected sentences by teachers

  • I have had experience with ..
  • my team members are only three persons.
  • I share them with all staff ...
  • I go on overseas business trip ..

Useful sentences

  • the chance/opportunity will increase.
  • I decided to replace him in order to work smoothly.
  • I have experiences with three of these responsibilities.
  • I was team leader for/of the account department.
  • my main responsibilities were ...

Useful Words/Phrases

  • team oriented … チーム指向の -> you prefer working in a team.
  • organized -> meet deadlines, keep schedule, organize myself + team
  • tracking expenses … 支出を把握する -> ex) keep receipts
  • supervise … 指導する
  • coordinate … 調整する  
  • legal executive assistant … 法務部重役補佐
  • preparing presentations and reports



23b - Interview2

Key Languages: Describing strengths and weaknesses

Describing strength

  • I've been told I'm good at (adapting to new situations).
  • I've been told I'm good at (staying calm under pressure).
  • I've been told I'm good at (motivating others).
  • I've been told I'm good at (multitasking even when I extremely busy).
  • I've been told I'm good at (finding the best solutions to problems).
  • この表現の利点は①be elegance, ②other persons agree with my strengths

Describing weaknesses

  • I have trouble (speaking in front of large groups), so I (joined a public speaking club).
  • I have trouble (giving my opinions in meetings), so I (joined a debating club).
  • I have trouble (prioritizing tasks), so I (bought a digital organizer).
  • I have trouble (delegating other office staff), so I (took a management course).
  • I have trouble (managing my time effectively), so I (started setting time goals for tasks).

Applications

  • I've been told I'm good at making presentations. I was in charge of presenting new products in my last project.
  • I sometimes have trouble managing big projects, so I give myself extra time. Specifically I came in an hour early every day to prioritize the day's task.

Corrected sentences by teachers

  • It's good for decreasing stress.
  • I sweat a lot.
  • I got/had a massage(n). ⇔ I got my knee massaged(v).
  • solutions to problems compared to my other team member
  • I'm able to prioritize tasks in order to meet deadlines (canよりbe able toが望ましい)

Useful Words/Phrases

  • the first round of interviews
  • attendance ... 出席
  • adapt … 適応させる
  • start (***ing/infinitive)
  • trouble (***ing) 
  • human resources manager

2015年11月1日日曜日

Writing Idiomatic Python 3.3(Kindle版)を読んで参考になった点~その2

第1弾に引き続き最近読んだ書籍「Writing Idiomatic Python 3.3」で参考になった点をBlogにまとめておこうと思います。

本書籍の特徴はタイトルの通り様々な側面から悪いサンプル(Harmful)をまず示した上でPythonicなサンプル(Idiomatic)を示して、どこが悪いかどこを直すべきかが分かりやすく解説されています。今回は5章「Working with Data」で参考になったTipsをメモしておこうと思います。

ここで紹介してるのはごく一部なので興味あれば一度本書籍をチェックしていただければと思います。


5.2 Strings

5.2.1 Chain string functions to make a simple series of transformations more clear

# Harmful
book_info = ' The Three Musketeers: Alexandre Dumas'
formatted_book_info = book_info.strip()
formatted_book_info = formatted_book_info.upper()
formatted_book_info = formatted_book_info.replace(':', ' by')

# Idiomatic
book_info = ' The Three Musketeers: Alexandre Dumas'
formatted_book_info = book_info.strip().upper().replace(':', ' by')

5.2.2 Use ''.join when creating a single string for list elements

# Harmful
result_list = ['True', 'False', 'File not found']
result_string = ''
for result in result_list:
    result_string += result

# Idiomatic
result_list = ['True', 'False', 'File not found']
result_string = ''.join(result_list)

5.2.3 Prefer the format function for formatting strings

# Harmful
def get_formatted_user_info_worst(user):
    return 'Name: ' + user.name + 'Age: ' + str(user.age) + ', Sex: ' + user.sex

def get_formatted_user_info_slightly_better(user):
    return 'Name: %s. Age: %i, Sex: %c' % (user.name, user.age, user.sex)

# Idiomatic
def get_formatted_user_info(user):
    output = 'Name: {user.name}, Age: {user.age}, Sex: {user.sex}'.format(user=user)
    return output

5.3 Lists

5.3.1 Use a list comprehension to create a transformed version of an existing list

# Harmful
some_other = list()
some_list = list()
for element in some_other_list:
    if is_prime(element):
        some_list.append(element + 5)

# Idiomatic
some_other_list = range(10)
some_list = [element + 5 
    for element in some_other_list
    if is_prime(element)]

5.4 Dictionaries

5.4.1 Use a dict as a substitute for a switch...case statement

# Harmful
# Pythonはswitch-case文がないので以下のようにしがちだが...
def apply_operation(left_operand, right_operand, operator):
    if operator == '+':
        return left_operand + right_operand
    elif operator == '-':
        return left_operand - right_operand
    elif operator == '*':
        return left_operand * right_operand
    elif operator == '/':
        return left_operand / right_operand

# Idiomatic
def apply_operation(left_operand, right_operand, operator):
    import operator as op
    operator_mapper = {'+': op.add, '-': op.sub, '*': op.mul, '/': op.truediv}
    return operator_mapper[operator](left_operand, right_operand)

5.4.2 Use the default parameter of dict.get to provide default values

# Harmful
log_severity = None
if 'severity' in configuration:
    log_severity = configuration['severity']
else:
    log_severity = 'Info'

# Idiomatic
log_severity = configuration.get('severity', 'Info')

5.4.3 Use a dict comprehension to build a dict clearly and efficiently

# Harmful
user_email = {}
for user in user_list:
    if user.email:
        user_email[user.name] = user.email

# Idiomatic
user_email = {user.name: user.email for user in user_list if user.email}

5.5 Sets

5.5.2 Use a set comprehension to generate sets concisely

# Harmful
users_first_names = set()
for user in users:
    users_first_names.add(user.first_name)

# Idiomatic
users_first_names = {user.first_name for user in users}

5.6 Tuples

5.6.1 Use collections.namedtuple to make tuple-heavy code more clear

# Harmful
def print_employee_information(db_connection):
    db_cursor = db_connection.cursor()
    results = db_cursor.execute('select * from employees').fetchall()
    # 基本的にこの手法だと情報取得して出力は不可能
    for row in results:
        print(row[1] + ', ' + row[0] + ' was hired on' \
        + row[5] + ' (for $' + row[4] + ' per annum) info the' \
        + row[2] + ' department and reports to ' + row[3])

# Idiomatic
# 'employees'テーブルは次のカラムを持ってるのを前提とする
# first_name, last_name, department, manager, salary, hire_date
employee_row = namedtuple('EmployeeRow', \
['first_name', 'last_name', 'department', 'manager', 'salary', 'hire_date'])

EMPLOYEE_INFO_STRING = '{last}, {first} was hired on {date} \
${sarlary} per annum) info the {department} department and reports to ager}'

def print_employee_information(db_connection):
    db_cursor = db_connection.cursor()
    results = db_cursor.execute('select * from employees').fetchall()
    for row in results:
        employee = employee_row._make(row)

# これでも間違った場所では出力はほとんど不可能ではある
print(EMPLOYEE_INFO_STRING.format(\
last=employee.last_name,\
first=employee.first_name,\
date=employee.hire_date,\
salary=employee.salary,\
department=employee.department,\
manager=employee.manager))

5.6.2 Use _ as a placeholder for data in a tuple that should be ignored

# Harmful
(name, age, temp, temp2) = get_user_info(user)
# temp, temp2が使われていない
if age > 21:
    output = '{name} can drink!'.format(name=name)

# Idiomatic
(name, age, _, _) = get_user_info(user)
if age > 21:
    output = '{name} can drink!'.format(name=name)

5.6.3 Use tuples to unpack data

# Harmful
list_from_comma_separated_value_file = ['dog', 'Fido', 10]
animal = list_from_comma_separated_value_file[0]
name = list_from_comma_separated_value_file[1]
age = list_from_comma_separated_value_file[2]
output = ('{name} the {animal} is {age} years old'.format(animal=animal, name=name, age=age))

# Idiomatic
list_from_comma_separated_value_file = ['dog', 'Fido', 10]
(animal, name, age) = list_comma_separated_value_file
output = ('{name} the {animal} is {age} years old'.format(animal=animal, name=name, age=age))

5.6.4 Use a tuple to return multiple values from a function

# Harmful
from collections import Counter

STATS_FORMAT = """Statistics:
Mean: {mean}
Median: {median}
Mode: {mode}"""

def calculate_mean(value_list):
    return float(sum(value_list) / len(value_list))

def calculate_median(value_list):
    return value_list(int(len(value_list) / 2)]

def calculate_mode(value_list):
    return Counter(value_list).most_common(1)[0][0]

values = [10, 20, 20, 30]
mean = calculate_mean(values)
median = calculate_median(values)
mode = calculate_median(values)

print(STATS_FORMAT.format(mean=mean, median=median, mode=mode))

# Idiomatic
from collections import Counter

STATS_FORMAT = """Statistics:
Mean: {mean}
Median: {median}
Mode: {mode}"""

def calculate_stastics(value_list):
    mean = float(sum(value_list) / len(value_list))
    median = value_list[int(len(value_list) / 2)]
    mode = Counter(value_list).most_common[1)[0][0]
    return (mean, median, mode)

(mean, median, mode) = calculate_stastics([10, 20, 20. 30])
print(STATS_FORMAT.format(mean=mean, median=median, mode=mode))

5.7 Classes

5.7.2 Use properties to "future-proof" your class implementation

# Harmful
class Product():
    def __init__(self, name, price):
        self.name = name
        self.price = price

# Idiomatic
class Product():
    def __init__(self, name, price):
        self.name
        self._price = price

 @property
 def price(self):
     return self._price * TAX_RATE
 
 @price.setter
 def price(self, value):
     # "setter"関数はpropertyと同名である必要がある
     self._price = value

5.7.3 Define __str__ in a class to show a human-readable representation

# Harmful
class Point():
    def __init__(self, x, y):
        self.x = x
        self.y = y
  
p = Point(1, 2)
print(p)
# 出力結果:'<__main__.Point object at 0x91ebd0>'

# Idiomatic
class Point():
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):
        return '{0}, {1}'.format(self.x, self.y)

p = Point(1, 2)
print(p)

# 出力結果:'1, 2'

5.8 Context Managers

5.8.1 Use a context manager to ensure resources are properly managed

# Harmful
# 例外発生したときにOpenしたファイルをCloseする術がない
file_handle = open(path_to_file, 'r')
for line in file_handle.readlines():
    if raise_excepton(line):
        print('No! An Excepton!')

# Idiomatic
# context manager経由で開くと__enter__, __exit__メソッドを定義する事で容易に処理ができる
with open(path_to_file, 'r') as file_handle:
    for line in file_handle:
        if raise_excepton(line):
            print('No! An Exception!')

5.9 Generators

5.9.1 Prefer a generator expression to a list comprehension for simple iteration

# Harmful
# list comprehensionは直ちに全要素を敷き詰めたリストを生成する
# 膨大なリストの場合、非常に多くのメモリを食う事になる
for uppercase_name in [name.upper() for name in get_all_usernames()]:
    process_normalized_username(uppercase_name)

# Idiomatic
# 一方、generator expressionの場合、要求に応じた要素が都度生成される
for uppercase_name in (name_upper() for name in get_all_usernames()):
    process_normalized_username(uppercase_name)

5.9.2 Use a generator to lazily load infinite sequences

# Harmful
def get_twitter_stream_for_keyword(keyword):
    imaginary_twitter_api = ImaginaryTwitterAPI()
    if imaginary_twitter_api.can_get_stream_data(keyword):
        return imaginary_twitter_api.get_stream(keyword)

current_stream = get_twitter_stream_for_keyword('#jeffknupp')
for tweet in current_stream:
    process_tweet(tweet)

def get_list_of_incredibly_complex_calculation_results(data):
    return [first_incredibly_long_calculation(data),\
    second_incredibly_long_calculation(data),\
    third_incredibly_long_calculation(data)
 ]

# Idiomatic
def get_twitter_stream_for_keyword(keyword):
 """この関数はgeneratorで'can_get_stream_data(user)'がFalse
 になるまで反復可能なデータを生成し続ける
 """
 imaginary_twitter_api = ImaginaryTwitterAPI()
 while imaginary_twitter_api.can_get_stream_data(keyword):
     yield imaginary_twitter_api.get_stream(keyword)

# generatorを呼び出してるので、クライアントが終了するまでプロセス続けてる
for tweet in get_twitter_stream_for_keyword('#jeffknupp'):
    if got_stop_signal:
        break
     process_tweet(tweet)

def get_list_of_incredibly_complex_calculation_results(data):
    yield first_incredibly_long_calculation(data)
    yield second_incredibly_long_calculation(data)
    yield third_incredibly_long_calculation(data)

2015年10月31日土曜日

Youtube動画「Physically Based Rendering In Substance」の英語トランスクリプトしてみた

はじめに

PBRとSubstanceに興味始めたころから気になっていたAllegorithmicが公開している「Physically Based Rendering in Substance」を英語トランスクリプトしてみました。全編50分あるので時間かかりましたが、4つのパートに分けて例の如くYoutubeの自動字幕機能+自分の耳を使って全英文を起こしてみました。

講演者の口癖「you know, kind of, I guess」等の書き起こしても意味がないフレーズはカットしていますができるだけ再現したつもりです。Substance(Designer, Painter共に)を使用したPBRワークフローおよび英語に興味ある方は(Youtube右下のSubtitles/CC機能をEnglish:ONにして)シャドーイング教材としてご活用ください。

各トランスクリプトした動画

Physically Based Rendering In Substance Vol.1/4(英語字幕付き)

Vol.1は、スライドを使ったPBR基礎に関する説明がSubstance Designer/Painterの実例も交えて行われています。具体的には「PBRって何?(基礎理論、利点、新たにアーティストが行う事)」、「PBRのキー要素(エネルギー保存則、フレネル、ラフネスは一番重要)」、「反射性輝度(Intensity of Reflectivity)を制御する3要素(フレネル角度、ラフネス(エネルギー保存則)、F-Zero(反射性))」の説明がされています。


Physically Based Rendering In Substance Vol.2/4(英語字幕付き)

Vol.2は、まずSpecular / Glossiness⇔ Metallic / Roughnessの2つの手法をそれぞれ説明し、その後Algorithmic推奨のMetallic / Roughness手法にフォーカスしてCrossbowのサンプルを使用してSubstance Designer上でフローの説明を行っています。 (まだ途中段階)


Physically Based Rendering In Substance Vol.3/4(英語字幕付き)

Vol.3は、Texture Guidelinesの説明(Base Color/Diffuse/AlbedoおよびMetal)をしながらSubstance Painter, Substance Designer(Crossbow)の実践を交えてPBRワークフローの説明をしています。主にスライドを使ったPBR基礎に関する説明が行われています。


Physically Based Rendering In Substance Vol.4/4(英語字幕付き)

Vol.4は、前半は「マテリアル表面がメタルか非メタルか?」で分類して、メタル(銅、鉄)⇔非メタル(プラスティック)をSebastian Lagarde氏のブログ情報「Feeding a physically based workflow」を参考にSubstance Painter上でデモをして、後半はSubstance Designer上でCrossbowの幾つかのマテリアル(Wood, Iron、Burlap)を紹介し、Woodのノード構成に焦点を当てて細かな解説をしてくれてます。主にスライドを使ったPBR基礎に関する説明が行われています。

2015年7月18日土曜日

Youtube動画「GDC2015 Animation of The Order 1886」の英語トランスクリプトしてみた

はじめに

GDC2015の公開動画で気になっていた「GDC2015 Animation of The Order 1886」を英語学習とゲームアニメーション学習を兼ねて全英文(30分)をスクリプトとして起こしてみました。この動画には2人の講演者が話すのですが、Lead Cinematic AnimatorのDaniel氏の英語が(個人的に)滑舌が悪くかつ高速だったので聞き取りに苦労しました。 ただ今回もYoutubeの自動英語字幕機能と英会話先生のヘルプを借りて何とかまとめる事ができました。

苦労しましたが、格好のシャドーイング素材がまたできたので通勤列車等で聞き取りにくい部分はもちろん重要な部分を何度も聞きながら英語力を高めていければと考えています。本来シャドーイングの素材は5分以内が良いとされてますが今回は30分の動画を約10分ごとに分けて動画化およびスクリプト化しています。よければ(Subtitles/CC機能をONにして)シャドーイング教材としても活用してみてください。

各トランスクリプトした動画

Animation of The Order 1886 Vol.1/3

Vol.1は導入部で、各講演者の自己紹介とThe Order 1886の概要、コンセプト(Filmic Realsm)、プロトタイプから得られた事、モーキャプパイプライン、リグ再考等が紹介されています。
>

Animation of The Order 1886 Vol.2/3

Vol.2の中盤戦は「ゲームプレイアニメーションをいかにリアルにするか」について"共通のアニメーション問題"を5つ挙げながら各対策(Abrupt Transition, Animation Blending, Animation Playback Speed, Animation Layer等)について説明されています。


Animation of The Order 1886 Vol.3/3

最終章は「Game Play⇔Cinematics」をSeamlessに繋げて没入感を高めるために試みたIn-Game Cinematicsに関する手法について説明されてる内容になってます。


さいごに

それにしても改めてYoutubeの英語自動字幕機能の音声解析力は相当なレベルまで来てるのを実感しました・・・。当然全くPerfectでないしとんでもない誤認識も多々あるのですが、自分がどうしても聞き取れなかった部分をいとも簡単に認識している部分も多々あり、リスニング強化(シャドーイング教材作成)にはうってつけの機能だと思いました。

2015年7月6日月曜日

Youtube動画「Using Substance with Unity 01」の英語トランスクリプトしてみた

はじめに

個人的に興味を持ってる「Substancer⇔Unityのワークフロー」を学習する上で効果的な動画がYoutubeに上がっていて、概要を説明した動画が6分ちょいだったので「英語学習のシャドーイング教材」としても使えそうと考え、Youtubeの自動英語字幕機能と英会話の先生のヘルプを借りて、全英文をスクリプトとして起こしてみました。その過程で自分の弱点が浮き彫りになってきて、シャドーイングはもちろんですが「シャドーイング用の教材」を作るのも非常に勉強になるなと実感しました。



起こした全スクリプトはYoutubeの字幕機能としてUPしているので興味ある方はご覧になっていただければと思います(CC機能:ONで)。ここでは、起こした全スクリプトを公開して自分の弱点を3つの要素に分類し
  1. 聞き取れなかった部分→青色
  2. 聞き取れずかつ意味を知らなかった部分→赤色
  3. なんとなく聞き取れてるけどOutputで使えてない重要な部分→緑色
整理しておこうと思います。シャドーイングの教材は「自分が興味あるもので5分前後で何度も繰り返し聞けるもの」が良いそうなので今後もここでまとめた情報をチェックしながらシャドーイングを繰り返してみようと思います。

全スクリプト

Hello and welcome to using SUBSTANCE with UNITY. In this first video, I'd like to take a moment to talk about the big picture and discuss the overall benefit to using Substance. The number one benefit is productivity: SUBSTANCE provides unique work flow and tool sets that greatly enhances productivity that can't be found anywhere else. Throughout these videos, we'll look at each of these main points you see here: dedicated and comprehensive texture tools, physically based rendering and material work flows, 100% non-destructive. These are foundation SUBSTANCE is build upon and I'll showcase each of these points as we walk through examples in later videos. But for now, let's take a closer look at reducing texture size and in engine texture updates. (0:50)

With SUBSTANCE, you can reduce your texture package size up to 90%. The SUBSTANCE engine will generate needed textures at runtime which means the texture package size can be very light weight and allow for a faster download of your content. This in turn allows you to reach a broader audience. Textures are dynamically resized, this means textures are generated at a given resolution so you have the size you need at maximum quality. SUBSTANCE isn't merely up scaling the textures but actually generating at the resolution requested. This means the SUBSTANCE file contains information to generate several textures at various resolutions all within a single compact file. And again, this dramatically reduces the texture package size as the textures don't exist until they are generated. (1:36)

With dynamic runtime support, you can change the look of a texture to create several different iterations all within the UNITY editor. These perimeters are also accessible in code so you can dynamically change a texture during runtime. This is great for creating user generated content for example. (1:53)

Here is a project that showcases how SUBSTANCE can be used to create user generated content by customizing a character. So here I can come through and I can change the jacket pattern size, I can change the jacket colour, I can go in and change the cap colour, as well as the shirt colour, we also have the ability to change our logos so we can switch between different logos and then also add in some jeans ripping and adjust the size, change our shoe colour, and so on. (2:24)

Here's a different example where we are working within an environment so I'll just select the ground and I can actually change the look of the ground, I'll just dial in some age here, and then we will move into the area and I'll just start to age some of these assets as well, so we'll go ahead and dial in some age here, some more aging on this, we'll also affect the wall. So, here I'd like to just run through an overall work flow and pipeline on how SUBSTANCE work, how it relates to your 3D programs and how it relates to the UNITY game engine as well. (2:58)

So, when you're starting on the assets you'll probably start here on the modelling phase, you'll be doing some UV mapping, you've got sculpting and re-topology, uh also animation here will be into that category as well when we're talking about your DCC application. So as you're going through this process you're creating high-reso and low-reso models, what you can then do is that it will export those high and low reso models over here to SUBSTANCE's designer where SUBSTANCE DESIGNER will allow you to do all of the baking. (3:24)

So here we've got our detailed normal maps, displacement curvature, ambient occlusion, world space normals, position and so on. And so one of the key benefits to using SUBSTANCE with UNITY is that SUBSTANCE DESIGNER's baker tools uses the same tangent bases as UNITY so you get a really great synced normal work-flow between UNITY and SUBSTANCE DESIGNER since they're using the same tangent bases. (3:45)

So once you also start to create a lot of these model bakes here, you can then move on over to SUBSTANCE DESIGNER, you're starting to go through the process of texturing, so here we'll be talking about creating our dynamic textures, animate-able properties, dynamic resizing, procedures working with the full material work-flow and you get in that fast texture iterations that we have. We also have the ability to work with SUBSTANCE PAINTER, so in this process you may actually take your objects and start to bring them into SUBSTANCE PAINTER where you could work through 3D painting, you can paint it across multiple channels, and you can then also work between SUBSTANCE PAINTER and DESIGNER very interchangeably. (4:24)

So you may use SUBSTANCE PAINTER to create various mask, that you will then import right into SUBSTANCE DESIGNER for the mask generators, you may want to create your base materials and things like that in 3D, using 3D painting inside of SUBSTANCE PAINTER. So at this point, the key difference between SUBSTANCE PAINTER and SUBSTANCE DESIGNER: So, SUBSTANCE DESIGNER is going to create the SBSAR file, this is going to be the actual SUBSTANCE material that you then import directly into UNITY. (4:56)

SUBSTANCE DESIGNER is where we’re going to actually create all of our tweak-able parameters here in the middle of properties and dynamic textures and so on. Now SUBSTANCE PAINTER is actually going to export bitmaps for us. So again like I said we can use that directly in SUBSTANCE DESIGNER, we can take these bitmaps, directly into Unity or again we can use those back into our DCC application as well. (5:20)

So another key benefit to SUBSTANCE is that SUBSTANCE has native support within very popular 3D applications such as Maya, 3DMax and MODO. So the same SBSAR file that you are using within UNITY you can also take that back into your DCC application so you could actually preview these materials if you want to go back into that stage where you will be making some modelling adjustments you want to see, how these SUBSTANCE materials are affecting the model. You can actually import that directly into your 3D application as well, so you have that what I like to call a material or texture parity between your DCC applications, SUBSTANCE and UNITY. (5:59)

Over the next few videos we’re going to take a look at how I created this asset using SUBSTANCE PAINTER and SUBSTANCE DESIGNER. We’re also going to take a look at how the SUBSTANCE materials works in UNITY and we’ll take a look at how we can use the procedural material API to make changes to our textures dynamically at runtime.

まとめ

こうして興味ある動画の全文スクリプトを起こした上でシャドーイングを繰り返してると自分の弱点が浮き彫りになる事が改めて分かりました。大量の英文内に自分が知らない英単語や熟語は指の数ほど。だけれども、聞き取れないのはとてつもない数がある。今回の一番の気づきは自分は「wh***」ではじまる関係代名詞、関係副詞の聞き取りが圧倒的に弱いという事。そして面白いぐらいに聞き取れない単語は実際に自分がとっさにOutputできないものばかり。やはり「自分がOutputできないと聞き取れない」法則は生きていると実感。前置詞や主語は実際省略されるぐらい素早くいわれてるケースもあると思うので聞き取れないのはある意味自然だけどこの「wh***」は今後意識して聞いたり話したりしていければと思います。

2015年6月14日日曜日

Writing Idiomatic Python 3.3(Kindle版)を読んで参考になった点~その1

KindleでPython関連の書籍は幾つか購入してるのですが、きちんと読んだ内容をBlogでまとめてはいなかったので最近読んだ書籍「Writing Idiomatic Python 3.3」で参考になった点を良くかBlogにまとめておこうと思います。

本書籍の特徴はタイトルの通り様々な側面から悪いサンプル(Harmful)をまず示した上でPythonicなサンプル(Idiomatic)を示して、どこが悪いかどこを直すべきかが分かりやすく解説されています。今回は4章「Control Structures and Functions」で参考になったTipsをメモしておこうと思います。

ここで紹介してるのはごく一部なので興味あれば一度本書席をチェックしていただければと思います。


4.1 If Statement

4.1.2 Avoid repeating variable name in compound in statement

# Harmful
is_generic_name = False
name = 'Tom'
if name == 'Tom' or name == 'Dick' or name == 'Harry':
    is_generic_name = True
    
# Idiomatic
name = 'Tom'
is_generic_name = name in ('Tom', 'Dick', 'Harry')

4.2 For Loops

4.2.3 Use else to execute code after a for loop concludes

# Harmful
for user in get_all_users():
    has_malformed_email_address = False
    print ('Checking {}'.format(user))
    for email_address in user.get_all_email_addresses():
        if email_is_malformed(email_address):
            has_malformed_email_address = True
            print (u'email addressが不正な形式です!')
            break
    if not has_malformed_email_address:
        print ('All email address are valid!')
        
# Idiomatic
for user in get_all_users():
    print ('Checking {}'.format(user))
    for email_address in user.get_all_email_addresses():
        if email_is_malformed(email_address):
            print(u'email addressが不正な形式です!')
            break
    else:
        print('All email address are valid')

4.3 Functions

4.3.2 Use *args and **kwargs to accept arbitrary arguments

# Harmful
def make_api_call(foo, bar, baz):
    if baz in ('Unicorn', 'Oven', 'New York'):
        return foo(bar)
    else:
        return bar(foo)

# I need to add another parameter to 'make_api_call'
# without breaking everyone's existing code.
# I have two options...

def so_many_options():
    # I can tack on new parameters, but only if I make
    # all of them optional ...
    def make_api_call(foo, bar, baz, qux=None, foo_polarity=None,
                      baz_coefficient=None, quux_capacitor=None,
                      file_not_fould=None):
        # ... and so on ad infinitum
        return file_not_found

def version_graveyard():
    # ... or I can create a new function each time the signature
    # hanges.
    def make_api_call_v2(foo, bar, baz, qux):
        return make_api_call(foo, bar, baz) - qux

    def make_api_call_v3(foo, bar, baz, qux, foo_polarity):
        if foo_polarity != 'reserved':
            return make_api_call_v2(foo, bar, baz, qux)
        return None

    def make_api_call_v4(foo, bar, baz, qux, foo_polarity,
                         baz_coefficient):
        return make_api_call_v3(foo, bar, baz, qux, foo_polarity) * baz_coefficient

    def make_api_call_v5(foo, bar, baz, qux, foo_polarity,
                         baz_coefficient, quux_capacitor):
        # I don't need 'foo', 'bar', or 'baz' anymore, but I have to keep
        # supporting them...
        return baz_coefficient * quux_capacitor
    # ...

# Idiomatic
def make_api_call(foo, bar, baz):
    if baz in ('Unicorn', 'Oven', 'New York'):
        return foo(bar)
    else:
        return bar(foo)
    
    # I need to add another parameter to 'make_api_call'
    # without breaking everyone's existing coe.
    # Easy ...
    
    def new_hotness():
        def make_api_call(foo, bar, baz, *args, **kwargs):
            # Now I can accept any type and number of arguments
            # without worring about breaking existing code.
            baz_coefficient = kwargs['the_baz']
            
            # I can even forward my args to a different fucntion 
            # without knwoing their contents!
            return baz_coefficient in new_functions(args)

4.4 Exceptions

4.4.2 Use Exceptions to Write Code in an "EAFP" Style

※EASP→Easier to Ask for Forgiveness than Permission( which assumes things will go well and catches exceptions if they don't.)
# Harmful
def get_log_level(config_dict):
    if 'ENABLE_LOGGING' in config_dict:
        if config_dict['ENABLE_LOGGING'] != True:
            return None
        elif not 'DEFAULT_LOG_LEVEL' in config_dict:
            return None
        else:
            return None

# Idiomatic
def get_log_level(config_dict):
    try:
        if config_dict['ENABLE_LOGGING']:
            return config_dict['DEFAULT_LOG_LEVEL']
    except KeyError:
        # if either value wasn't present,
        # a KeyError will be raised, so return None
        return None

4.4.3 Avoid "Swallowing(無条件で受け入れる)" Useful Exceptions With Bare Except Clauses

# Harmful
import requests
def get_json_response(url):
    try:
        r = requests.get(url)
        return r.json()
    except:
        print('Oops, something went wrong!')
        return None

# Idiomatic
import requests
def get_json_response(url):
    return requests.get(url).json()

# If we need to make note of the exception, we
# would write the function this way ...
def alternate_get_json_response(url):
    try:
        r = requests.get(url)
        return r.json()
    except:
        # do some logging here, but don't handle the exception ...
        raise 

2015年2月23日月曜日

Marmoset Toolbat2の「Tutorial: PBR Texture Conversion」を訳してみた

相変わらず、Physically-Based Rendering(以下PBR)について興味は持っているものの良く理解できてないのですが、Marmoset Toolbag2の公式サイトに久しぶりにPBRチュートリアルの新作「Tutorial: PBR Texture Conversion」が上がっていたので英語の勉強も兼ねて全訳してみました。上述したようにPBRよく分かってない人が訳してるので変な訳があったら突っ込んでいただけると幸いです。特に不明な部分は(?)としてます。




目次

  • PBR:誤解と虚像
  • PBR:何が変わったのか?
  • 従来のコンテンツフローの復習
  • テクスチャ変換:従来手法→PBRスペキュラー
  • メタルネスワークフロー vs スペキュラーワークフロー
  • テクスチャ変換:スペキュラー→メタルネス
  • テクスチャ変換:メタルネス→スペキュラー
  • 比較と否定
  • マテリアルロジック


チュートリアル:PBRテクスチャ変換

本チュートリアルでは「従来のシェーダー用に作られたコンテンツをどのようにPBRシェーダー用に変換できるか」また「あるPBRフローから別のPBRフローに変換する方法」、そして「従来のワークフローとの様々な差異」について説明していきたいと思います。本チュートリアルは中級~上級者を対象にしているので、基本的な概念は簡潔に述べるのみにとどめたいと思います。PBR初級者の方は、まずJeff Russelと私が書いたPBR基礎理論PBRチュートリアルを読んでみてください。これらのチュートリアルはPBRの基本的な概念が詳細に説明されています。

PBR:誤解と虚像

本格的に始める前に、幾つかの要素をクリアーにしておきたいと思います。なぜなら「PBRって何?」とか「PBRシステムに必要とされるテクスチャの入力タイプ」の観点において多くの混乱が存在するからです。

まず「メタルネスマップを使用することはPBRシステムで必須ではありません」。そして「スペキュラーマップを使用することはアセットがPBRではない」事を必ずしも意味しません。私はPBR関連のフォーラムで、スペキュラーマップやグロスマップを作成するアーティストを見かけると「なぜPBRを使用しないのですか?」と質問してる書き込みを良く見かけます。なので、まずは「PBRって実際何なの?」という点について分析してみましょう。

PBRの基本的な考え方は「物理的に正しいライトと物質を表現する洗練されたシェーダーと現実世界のマテリアルを表現するためのもっともららしい計測値を持つアートコンテンツとの組み合わせ」です。PBRは本質的に「コンテンツ生成とレンダリングの全体論的なシステム」であり、実装レベルや使用しているツールやエンジンに依存して、しばしば複数の流儀に分かれがちです(一般的にシェーダーモデルやテクスチャの入力タイプにおいて)。

さらに「従来のいかなるコンテンツをPBRシェーダーに読み込む事は物理的に正しい結果を保証できない」という誤解した書き込みも先ほどの「なぜPBRを使用しない」と同様に良く見かけます。空想的なシェーダーをPBRで表現するのは「half of the equation」に過ぎません、論理的にアートコンテントを計測する必要があります(?)。

最後にもう一つ「ディフューズとアルベドの定義」についても述べておきます。これら2つの用語は本質的には同じもので、"オブジェクトのベースカラー"を意味して、しばしば互換性をもって使用されています。

PBR:何が変わったのか?




図:従来のシェーダーコンテンツ/PBRシェーダーコンテンツの比較図


PBRシステム用のコンテンツを生成したりコンバートする方法を深く理解するためには「シェーダーがどのように変化したかを確認する」のが重要です。最も大きな違いの一つは「現在のシェーダーにおけるライティングの計算がどのように先進的になったか」でしょう。現在では、我々はリアルな影を投影する動的な光源や正確な環境ディフューズやスペキュラー反射を提供するイメージベースドライティングを使う事ができます。これは「テクスチャに直接ライティングや反射あるいは影の要素をもはやペイントする必要がない」ことを意味します。今後はますます我々は「特定のライティング状況をベイキングするよりもマテリアルプロパティの再現に注力できる」事も意味します。

さらに、リニアスペースレンダリングは「もはやニュートラルな白いハイライトを得るためにスペキュラマップにディフューズと反対色を書く必要がない」ことを意味し、マイクロサーフェス関数におけるエネルギー保存則(ライトは幅広い領域ほど分散するため、荒いサーフェースほど鈍い光を放つ幅広いハイライトを持つ)は、「手動でスペキュラーマップに荒い領域は暗く、光沢のある領域は明るくする必要がない」ことも意味します。これは「スペキュラーマップは一般的に各マテリアルタイプ用にほぼ均一の値(絶縁体用のグレースケール値、金属用のカラー値)を持ち、マイクロサーフェスマップがほとんどの表面の変化を定義すべき」事を意味します(?)。

従来のコンテンツフローの復習




図:従来のシェーダーコンテンツの例


従来のシェーダーと現代のシェーダの違いを示すために、Darkest of Daysで私が作成したガンモデルを使用して説明しようと思います。このアセットは非常に良いサンプルです。なぜならこのアセットは、PBRパイプラインにおいて通常使われない多くのテクニックを紹介できるからです。例えば以下のような感じです。
  1. ディフューズマップがとても暗いですね。これは特定のライティング環境下でよい結果を得るために微調整をする必要があるからです。
  2. アンビエントオクルージョンやキャビティ詳細は直接ディフューズマップやスペキュラマップの双方に直接ベイクされています。これらのコンテンツは分離した入力経由で追加されるべきで、そうする事でシェーダーはよりインテリジェントな方法でそれらを使用することができます。
  3. グラディエントマップ(勾配マップ)は同様にディフューズマップとスペキュラマップ双方にベイクされます。グラディエントマップはローカルのエフェクト用のマスクを作成するのに便利なツールですが、それらは(既存の)テクスチャに直接乗算するべきではないです。
  4. このアセットがもともと使用しているシェーダーは、グロスマップをサポートしていませんでした。これは「スペキュラーマップが反射とマイクロサーフェースの双方を表現するというダブルの義務を果たす必要があり、その上全体のマテリアルに対して均一の光沢値を使用する」ことを意味します。
  5. スペキュラーの値は、現実世界のマテリアルプロパティを説明するよりも(?)目によってセットアップされていました。結果として、黒くペイントされた金属はとても反射し、明らかな理由はないですが、わずかに黄色の輝きを持ち、プラスティックやゴムのマテリアルは十分に反射されませんでした。


テクスチャ変換:従来の手法→PBRスペキュラー

ここまでで、従来のシェーダーとPBRシェーダーの共通の違いを理解できたので、物理ベースのスペキュラーワークフロー用に各コンテンツをアップデートする事ができます。


図:従来のワークフローからPBRスペキュラーワークフローへの変換


まず、アルベドマップとスペキュラーマップからベイクしたライティング情報とグラディエント情報を削除しました。次に、全ての表面の偏角情報(surface variation)を古いスペキュラーマップから新しく生成したグロスマップに移動して各マテリアルのマイクロサーフェス構造を表すためにその基本の値を更新しました。もし既にグロスマップを持っている場合は、その値およびそれらがつじつまが合っているかのダブルチェックをすべきでしょう。例えば、ライフルの基本的な生の金属は一般的にコーティングの艶消し仕上げしたものよりもスムーズで光沢があるでしょう。逆に光沢仕上げにおいて傷ついた表面はより粗い下塗り状態が現れるでしょう。

スペキュラーマップからグロスマップへのテクスチャの変化によって、我々は反射性の値に注力できます。この時点で「対象が金属かそうでないかを特定する」のはとても重要です。(たとえあなたがメタルネスのワークフローを使用していない場合でも、です)。この理由はシンプルで「絶縁体は4%(あるいはsRGBの#383838)周辺の着色していない反射率の値を持ち、最小2%~最大16%の範囲を持つ(ただし宝石以外の幾つかの絶縁体は4%以上の値を持ちます)傾向があるから」です。一方で「純粋な金属はより高い反射率の値を持ち一般的に70%~100%の範囲の値を持つ」傾向があります。このように「マテリアルが何のタイプである事を明確に理解する」事は正しい反射率の値を探索する場合にとても重要です。

PROTIP: 異なる材料でペイントあるいはコーティングされた金属オブジェクトは値を参照する場合は絶縁体と考慮されます。ただし表面が磨り減った部分は金属と考慮します。

メタルネスワークフロー vs スペキュラーワークフロー

より詳細な説明に入る前に、メタルネスワークフローとスペキュラーワークフローの主要な違いについて理解しておく事は重要です。大半のゲームエンジンはいずれか一方をサポートしています。Toolbag2はどちらの手法もサポートしているので、それらのメリットを直接比較する事ができます。


図:メタルネスシェーダー用コンテンツ


2つのワークフローの最も大きな違いは「ディフューズと反射性がどのようにテクスチャ内で定義されているか」です。スペキュラーワークフローでは、これらの値は明確に2つのユニークなテクスチャにセットされています。

一方で、メタルネスワークフローはディフューズと反射性を定義するためにアルベドマップを使っていて、そのマテリアルが金属か絶縁体を定義するためにメタルネスマップを使用しています。この理由は「電気を通す金属は多くの光子(電磁波)が表面上で反射する」事を意味していて、表面を通過した多くの光子は拡散するより吸収されます。よって、金属は通常、拡散要素を持ちません。一方で絶縁体はとても少ない量の光(4%以内)を反射し、マテリアルにヒットしたほとんどのライト情報は拡散あるいは表面を跳ね返って、表面色の色の分散が発生します(?)。

実際には、これはほとんどあるいは全て(もしテクスチャが金属あるいは絶縁体であるがどちらも持たない場合)のディフューズマップあるいはスペキュラマップが無駄な情報になるでしょう。よって、メタルネスワークフローは普通より効率的になります。ですが、同じテクスチャ内にディフューズ要素とスペキュラー要素を格納する欠点の一つはマテリアルの変化によるアーティファクトの発生です。


図:スペキュラーワークフローとメタルネスワークフローの比較図


グロスマップとラフネスマップは同じ情報を定義します、ですが通常互いに逆のスケール値を持ちます。「グロスマップは明るい値ほどスムーズで光沢な表面」を意味しますが、「ラフネスマップは明るい値ほど荒く艶のない(くすんだ)表面」を意味します。幾つかの分野では、"glossiness"という用語は反射性(reflectivity)と同意語とされているので、"roguness"を使う方が混乱を少なくするのではないかと考えてる人もいるようです。ただし、ここで重要な事は「テクスチャをなんと呼ぶか」ではなく「その値が何を表すか」です。もし、まだもやもやしてる場合は、近くのTAやエンジニアと話し合ってみてください。

スペキュラーワークフローの強み
  1. 拡散と反射率が2つの明確な入力に直接セットされていて、従来のシェーダーで作業経験のあるアーティストにとって理解しやすい。
  2. 絶縁体の反射性の制御がフルカラー入力で行う事ができる。
スペキュラーワークフローの弱み
  1. 不正確な結果を引き起こす不合理な反射率を使いやすい(うっかり使ってしまう)
  2. メタルネスワークフローよりテクスチャメモリを消費する。
メタルネスワークフローの強み
  1. アルベドマップがどのマテリアルであろうがオブジェクトのカラーとして定義されていて、これはアーティストにとって理論的に理解しやすい。
  2. マテリアルを2つのカテゴリー「絶縁体」と「金属」に分離して簡略化していて、これは非現実なテクスチャ値でコンテンツを表現する際に難易度を下げている(?)
  3. フルカラーのスペキュラーワークフローよりテクスチャメモリを節約できる。
メタルネスワークフローの弱み
  1. マテリアルの遷移点(material transition points?)で白いラインのアーティファクトを引き起こす事がある。
  2. 絶縁体の反射性を制御しにくい(※1
  3. アーテイストがそのワーフフローを理解していない場合、メタルネスマップにおいて容易に不合理な値を使用して、システムを破壊できる。
※1:幾つかのメタルネスワークフローはメタルネスマップと絶縁体の反射性を制御するための第2のスペキュラーマップを提供している場合もある。

メタルネスワークフローの方が理解しやすいと主張する人もいますが、個人的には今の所イーブンな印象です。各ワークフロー共にアーティストが不合理なコンテンツを使用した場合、フローが破綻しますし、各アーティストの経験にも依存する所があります。本質的には客観的にどちらが良い手法かと断言する事は難しいと思います。それらは純粋に異なるものなので。

テクスチャ変換:スペキュラー→メタルネス

既に我々は適切にコンテンツを計測できるようになり、2つのワークフロー間の違いも抑える事ができたので、各ワークフロー用のテクスチャに変換する事は実はとてもシンプルです。


図:メタルネスマップの作成


まず全てのマテリアルに対してそれらの表面が非金属(黒)か金属(白)かをアサインする事によりメタルネスマスクを作成してください。もしPSDテクスチャを持っている場合は、このメタルネス情報を構築する作業は様々なレイヤーからマスクコンテンツを使用することによって素早く実現できるでしょう。メタルネスマップはほとんどが白か黒の情報を持ち、汚れやほこりそしてさび等のソフトな変遷のエフェクトの場合のみグレー値を持つべきです。ここでのグレー値は部分的にメタリックなマテリアルにも使用できますが、これらは一般的に極めてレアケースです。通常は金属オブジェクトは幾つかのコーティングを持っていて、絶縁体として振舞います。


図:スペキュラーワークフローからメタルネスワークフローへの変換


一旦メタルネスマップを作ったら、Photoshopにおいて新しいファイルを生成して、ディフューズマップを背景レイヤーとして追加してください。そしてTOPにスペキュラーレイヤーを追加してさらにレイヤーマスクを追加してください。次にメタルネスマップをスペキュラーレイヤーのレイヤーマスクにペーストしてください。見るべき点は「金属表面であるスペキュラー要素」と「絶縁体であるディフューズ要素」で、これらは「メタルネスワークフローにおいて適切なアルベドマップを持っているかどうか」を意味します。

テクスチャ変換:メタルネス→スペキュラー

メタルネスワークフローからスペキュラーワークフローに変換するのは同様に簡単です。必要なのはアルベドマップからディフューズ情報とスペキュラー情報を抽出して、明確なディフューズマップとスペキュラーマップに分離する事です。


図:メタルネスワークフローからスペキュラーワークフローへの変換


ディフューズマップ

  1. Photoshopにアルベドマップを読み込みます
  2. 真っ黒(#000000) のFillレイヤーを新規作成します
  3. 2で作ったFillレイヤーのレイヤーマスクにメタルネスマップをペーストします

スペキュラーマップ

  1. オリジナルのアルベドマップを複製してFillレイヤーのTOPに移動します
  2. 別のFillレイヤーを#383838で新規作成します
  3. 2で作ったFillレイヤーのレイヤーマスクにメタルネスマップをペーストします
  4. レイヤーマスクを反転します

比較と否定

ここでは(上で説明した)2つの異なる変換ワークフローの効果を比較してみたいと思います。


図:スペキュラーワークフロー、スペキュラー→メタルネスに変換した結果、メタルネスをスペキュラーに変換した結果


注記しておくべき重要な点として「ベースのコンテンツは最初に合理的な値を計測されていたので、その変換プロセスもとても正常に作用している」という点です。もしベースコンテストが正常に計測されていなければ、その変換において大きな結果の差異を引き起こす事になるでしょう。同様に、もしある特定の色つきの反射を持つ絶縁体のようなマテリアル(これは一般的に極めてレアで、通常は髪の毛あるいは虹色マテリアルような特別なマテリアル用のカスタムシェーダーで表現するのが望ましい)を表現する場合、変換プロセスにおいて幾つかの情報を失うでしょう。理想的には、対象のレンダリングシステムのみにコンテンツは生成するべきです。このような変換作業はシステムを変更する場合や古いコンテンツを更新したり、複数のシステム用にコンテンツを生成する必要がある場合のみ使うべきでしょう。

マテリアルロジック

"合理的に正常に計測された値"とは何を意味するのでしょうか?残念ながら、これは答えるのが難しい質問です。なぜなら表現しようとしているマテリアルがどのタイプか依存し、激しく変化するからです。チートシート(cheat sheet)を作成する代わりに「マテリアルロジック(material logic)」と(私が勝手に)呼んでる概念について説明したいと思います。

チャートやスキャンデータにこだわるのはちょっとした"精神的支え"にしかなりません。まず、再現したいと思っている全マテリアルのデータを見つけるのは難しいです。よって、自分自身でどの値が適切かを決断する幾つかのロジックが必要になります。次に、同じマテリアルタイプの表面であっても、時期・磨耗・仕上がり等様々な状況に著しく依存して異なってきます。

(この論理を実現する上での)最初のステップは対象オブジェクトが作られているマテリアルの種類が何であるかを理解する事です。多くのオブジェクトにとってこれは非常に簡単で、その見た目を見る事でそれが金属、プラスチック、ゴム等であるかを認識できます。ですが、幾つかのオブジェクトはより複雑で、様々なマテリアルから作られているパーツを含んでいるかもしれません。ここでは「研究があなたの友」となります、リファレンス画像や似たような現実世界のオブジェクトを観察して、特定のオブジェクトがどのように作られてるかを詳しく調べる必要があるでしょう。


図:マテリアルリファレンス画像の例1(カメラ)


一旦、各オブジェクトが何の種類のマテリアルで作られているかを知る事ができれば、結果として様々な結論にたどり着く事ができるでしょう。例えば、金属は絶縁体よりも多く反射しますし、ゴムは一般的にプラスチックより一般的に荒いですし、コンクリートは通常はアスファルトより明るい等・・・です。これらのほとんどはシンプルな観察を通して理解する事ができると思います。 この時点で、あなたは生成したいテクスチャの質についてより具体的に考慮する事ができるようになっていると思います。例えば、塗料はくすんだ質感から光沢のある質感まで様々な異なった仕上がりになる傾向があります。プラスチックも同様で、金属はどのように表面が磨かれてるかに微妙に依存するでしょう。


図:マテリアルリファレンス画像2


結論として、PBRシステムで作業する事は(今までと)同様に、周囲の現実世界のマテリアルを観察し再現するスキルといった、ゲームアートを作る上で常に必要なアーティスティックなスキルが求められます。PBRシステムの基本概念を理解する事は重要ですが、最終的には各アーティストのアーティスティックな直感が必要という事です。

2014年6月15日日曜日

Marmoset Toolbatの「Tutorial: Physically Based Rendering」を訳してみた

先日公開した第1弾「Basic Theory of Physically-Based Rendering全訳」に引き続きPBRおよび英語の勉強も兼ねて、Marmoset Toolbag2のサイトに掲載されている「Tutorial: Physically Based Rendering」を全訳してみました。PBR自体良く分かってない人が訳してるので変な訳があったら突っ込んでいただいたり、この資料を基にPBRに詳しい人と色々とお話できれば幸いです。そしていい加減実践作業に移ろうと思います。前回同様、不明な部分は(?)としてます。




物理ベースレンダリングチュートリアル~あなたもできるPBR

本チュートリアルは、あまり技術的な内容に入り込まない程度に基礎的なアートコンテンツ生成および様々なPBR標準の背後にある幾つかの根拠をカバーし、幾つかの共通の誤解を解消する事を目的にしています。また、Jeff Russellが素晴らしいチュートリアル"PBR基礎理論"を書いているので、読んでいない方はまずこちらを読む事をお勧めします。 本チュートリアルを書くにあたってJeff RussellTeddy BergsmanそしてRyan Hawkinsには大変お世話になりました。また、 Wojciech KlimasJoeri Vrommanには追加のアーティスト目線での見解、そして素敵なアートを提供していただきました。この場を借りて御礼させていただきたいと思います。

目次

  • 新しい標準
  • PBR FAQ
  • 入力要素と専門用語
    • エネルギー保存則
    • アルベド
    • マイクロサーフェス
    • 反特性
    • フレネル
    • アンビエントオクルージョン
    • キャビティ
  • マテリアル値の探索
  • テクスチャ素材の生成
  • Artist:Q&A:WojciechKillmas 
  • Artist:Q&A:Joeri Vromman
  • 参考文献

新しい標準

PBRは計算能力の向上によりゲーム業界の標準に急激になろうとしていて、開発者誰しもがそのアートコンテンツパイプラインの標準化を求めています。つまりPBRは「どのように我々がアートを生成しレンダリングするか」について再定義を行わせるほどの存在となってきています。


図:PBRの例


物理ベースレンダリング(PBR)は現実世界のマテリアルを正確に表現するための表面の計測値を使用したリアルなシェーディング・ライティングを使用した概念に基づいた手法です。

PBRは厳密な一連のルールをベースに多くの概念が存在します。例えば、現在様々な手法が提案されているPBRシステムの正確な実装方法といったようなものがそれにあたります。しかしながら、全てのPBRシステムは「できるだけ正確にレンダリングする」という同一の理論に基づいているので、多くの概念は容易にプロジェクトからプロジェクト、エンジンからエンジンに移植が可能です。Toolbag2はPBRシステムにおいて今後使用するであろう共通の入力パラメーターを網羅しています。

レンダリングの質よりも、(現実世界のマテリアルを正確に再現するという)無矛盾性の方が現実世界のマテリアル計測値を使用する最も大きな理由です。矛盾のないベースマテリアルを使用する事はアーティストにマテリアル生成作業において推測しやすい状況を導き出すでしょう。また、アートディレクションの視点から見ても、各アーティストが作成したコンテンツがいかなるライティング状況においても見た目が自然になる事を容易にすることでしょう。

PBR FAQs

チュートリアルを始める前に、未経験者がPBRについて語る際に通常出てくる共通の質問をカバーする事は重要だと思いますので、ここでは質疑応答形式でそれらを紹介したいと思います。

1)私はPBRシステムの使い方を知りません。私はアートコンテンツの作り方を0から学びなおす必要はありますか?

ほとんどのケースでその必要はありません。もしあなたが前世代(PS3世代)のシェーダー(すなわち動的なパーピクセルライティングを使うシェーダー)の経験があるのであれば、あなたは既にPBRシステム用のコンテンツ生成に必要なほとんどの知識を持っている事になります。(PBRの)各専門用語がアーティストにとって障害になる大きな要因の一つです。なので、私は以下に各技術用語のセクションを設けて、各用語をアーティストにとってできるだけ噛み砕いて説明しています。ここで挙げてるほとんどの概念がシンプルで習得しやすいものとなっていると思います。

もしあなたの経験が純粋な絵画あるいはモバイルゲームのみであれば、ここで説明する新たな技術やワークフローを学ぶ事はかなりのチャンレジになるかもしれません。しかしながら、伝統的なノーマルマップに基づいたワークフローを習得するよりは難しくないはずです。

2)アーティストは彼らが作りたい各マテリアルのために偏光カメラシステムを用いて各物質に対して写実的あるリファレンスを取得する必要があるのでしょうか?

いいえ。一般的に共通のマテリアル用のリファレンスはスタジオ側で提供されると思います。代わりに、QuixelのMegascansサービスのようなサードパーティからの既に計測された値を容易に使用する事ができるでしょう。アーティスト自身でスキャンデータを生成する事はとても技術的で時間のかかるプロセスになります。よってほとんどのケースでは必要はないでしょう。

3)もしPBRシェーダーを使用したなら、それはアートワークも物理的に正確になるという事なのでしょうか?

必ずしもそうではないです。単にPBRシェーダーを使用する事はアートワークを物理的に正確に変えるという事にはならないです。PBRシステムは物理的に正確なライティング・シェーディングと適切に調整されたアートコンテンツの組み合わせとなります。

4)PBRを実現するためにメタルネスマップを使用する必要があるのでしょうか?

いいえ。メタルネスマップは単に反射特性を決定する一つの手法です。ただ、一般的にメタルネスマップはスペキュラーマップ/明度マップを使用するより多かれ少なかれ物理的に正確、といわれています。

5) PBRにするために屈折インデックス(Index of Refraction:IOR)を使用する必要はありますか?

いいえ。メタルネスマップの入力と似ていて、IORは単に反射性を定義する代替手段ですので必ずしも使用する必要はありません。

6)スペキュラーマップはもはや使用されない要素になるのでしょうか?

そうでもないです。スペキュラー反射明度あるいは反射特性はPBRシステムにおいて依然として"非常に重要な"パラメーターです。マップに直接反射特性を設定する事はなくなるかもしれませんが、その要素自体は依然としてPBRシステムにおいて必要とされています。

7)グロスマップはスペキュラマップに取って代わるものなのでしょうか?

いいえ。グロスあるいはラフネスマップはマテリアルのマイクロサーフェース(表面がどれぐらい粗いか滑らかを表す要素)を定義するもので、スペキュラー明度マップに取って代わるものではありません。しかしながら、もしこれまでグロスマップを使用して作業した事ないのならば、(既存のスペキュラーマップをベースにした)グロスマップに詳細情報を加えるために幾分調整が必要になるかもしれません。

8)PBRシステムは定型化した(スタイライズな)アートにも使用できるのでしょうか?

間違いなくできるでしょう。もし目標が幻想的で定型化された世界を創り上げることであれば、正確なマテリアル定義を使用する事は、依然としてとても重要な事です。たとえ虹を放つユニコーンを作る必要があっても、依然としてユニコーンのベースを物理的な光と物質の法則に則るユニコーンを必要とするでしょうから。

この良い例はPixarの作品です。これらはとてもスタイライズされていて、かつ最先端のマテリアルを正確に表現しています。ここではモンスターユニバーシティのPBRに関する素晴らしいFXGUIDEの記事"fxguide feature on Monsters Universit"を紹介しておきます。

入力要素と専門用語

PBRシステムの概念をよく理解していないアーティストはその専門用語のためにおそらくコンテンツ制作フローが大幅に変化すると予想するでしょう。もし現世代のシェーダーおよびアート制作技術での経験があるのなら、既にPBRシステムの多くの要素を既に経験している事になります。

どの種類のコンテンツを作るべきかあるいは、現状のコンテンツにPBRシェーダーをどのように導入していくかを理解する事はおそらく分かりにくいと思います。なので、ここではPBRシステムを始める上での幾つかの共通の用語および概念を紹介したいと思います。

エネルギー保存側

エネルギー保存則の概念は「1オブジェクトは入射した光よりも多くの光を反射しない」事を意味します。


図:エネルギー保存則の比較図~マイクロサーフェスと反射特性(0.0:拡散しやすく荒い~1.0:反射しやすく滑らか)


実用的な目的のために説明すると、(上図のように)より拡散しやすく荒いマテリアルは薄暗く反射し、よりぼんやりとしたハイライトを持ちますが、より滑らかでより反射しやすいマテリアルは鮮やかに反射し、鋭いハイライトを持ちます。

アルベド

アルベドは「基本的なカラー入力要素」で、一般にディフューズマップとして知られてます。


図:アルベドの比較図


1枚のアルベドマップは、拡散光の色を定義します。PBRシステムにおけるアルベドマップと従来のディフューズマップとの最も大きな相違点は、平行光源あるいはアンビエントオクルージョンの要素が欠落している点です。平行光源はある特定のライト状況において不自然な見え方をするため、アンビエントオクルージョンの要素は別個のAOスロットに追加される事になるでしょう。

アルベドマップは時々、従来のディフューズカラーと同様の定義をする場合があります。例えば、メタルネスマップを使っている時にアルベドマップは絶縁体(非金属)のディフューズカラーや金属表面の反射特性として定義される事があります(?)。

マイクロサーフェス

マイクロサーフェスは「マテリアル表面がどれぐらい粗いかあるいは滑らかか」を定義するものです。


図:マイクロサーフェスの比較図


ここでは、エネルギー保存則の理論がどのようにマテリアルのマイクロサーフェスに影響するかを見てみましょう。粗い表面ほど幅広くてぼやけたスペキュラー反射が見られますが、滑らかなサーフェスだとより鮮やかで鋭いスペキュラー反射が見られます。

どのゲームエンジンでコンテンツのオーサリングをするかによりますが、製作したテクスチャはグロスマップでなくラフネスマップと呼ばれる事があります。実際にはこれら2つの種類の違いは小さいですが、ラフネスマップは反転マップを持っているかもしれません(?)。例えば、暗い値は"光沢のある/滑らかな"表面と同等で、明るい値は"荒く/くすんだ"表面と同等です。デフォルトとして、ツールバッグは白を最も滑らかな表面を意味し、黒は最も粗い表面を意味します。もしグロスマップ/ラフネスマップを反転スケールでロードした場合は、glossモジュールのチェックボックス"invert"をクリックしてください。

反射性

反射性は「表面で反射する光のパーセンテージ」を表します。(スペキュラー、メタルネスそしてIORといった)反射性(別名:基礎反射あるいはF0)入力の全種類は「真上から見た時に表面がどれぐらい反射するか」を定義していて、フレネルは「グレージング角度で表面がどれぐらい反射するか」を定義しています。


図:反射性の比較図


絶縁体マテリアルにとって「反射性の範囲がどれぐらいせまいか」を留意するのは重要です。エネルギー保存則の概念と組み合わせる事で「表面の変化は一般的にマイクロサーフェス内で表現されるべき」と結論付ける事が容易になります。与えられたマテリアル種類にとって、反射性はかなり一定に保たれる傾向にあります。反射色ははっきりしない白っぽくなる傾向があり、金属は色がつく傾向にあります。このように、反射性/明度/色がまとめられている1枚のマップ(一般にスペキュラーマップと呼ばれる)は、メタルネスマップとして落とし込まれるかもしれません(?)。

メタルネスマップを使う時、絶縁体の表面(メタルネスマップで0(黒)が全ピクセルにセットされている)は、固定された反射値(linear:0.04, sRGB:0.06)が割り当てられて、アルベドマップを拡散値として使用します。金属表面(メタルネスマップで1.0(白)が全ピクセルにセットされている)は、スペキュラー色と明度がアルベドマップから引き継がれ、拡散色はシェーダー内で0(黒)がセットされます。メタルネスマップのグレー値は部分的に金属として扱われ、アルベドから反射性を参照し、その値に比例して拡散色は暗くなります。(部分的に金属マテリアルは稀です)


図:スペキュラー vs メタルネス


もう一度言っておきます。メタルネスマップは多かれ少なかれ従来のスペキュラーマップより物理的に正確です。しかしながら、その概念はより理解しやすいものとなっています。そして、メタルネスマップはメモリ節約のためにグレースケールスロットに一まとめにする事ができます。スペキュラマップを使用せずメタルネスマップを使用する欠点は、絶縁体マテリアルを正確な値で制御しにくい点です。

伝統的なスペキュラーマップはより制御しやすいスペキュラーの明度と色を提供します。そしてある特定の複雑なマテリアルを再生しようとする際により柔軟な制御を提供します。スペキュラマップの主な欠点は一般的に24ビットのファイル結果として保存されるためより多くのメモリを消費する点です。そしてアーティストに正確な値を取得するために物理マテリアルプロパティの深い理解を要求します。それは見方によって肯定的にも否定的にもなりえます。

PROTIP:メタルネスマップは0~1の間の値を使うべきです(遷移する場合の幾つかのグラデーションは問題ありません(?))ペイントされた金属のようなマテリアルは、塗料は絶縁体なので金属用の値をセットすべきではありません。メタルネス値は対象マテリアルのトップレイヤーを表すべきです。

屈折インデックス(Index of Refraction、以下IOR)は反射性を定義する別のアプローチで、スペキュラマップやメタルネス入力と同等のものになります。スペキュラ入力と最も大きく異なる点は「IOR値は異なったスケールで定義された値」という点です。IORスケールは真空に関してどれぐらい早くマテリアルを通過するかを定義するものです。水を表す1.33というIOR値は水中を通る際に光は真空と比較して1.33倍の速度でゆっくり通過する事を意味します。より詳細はFilmetrics Refractive Index Databaseで確認することができます。

絶縁体の場合、IOR値は色情報を要求しないので直接インデックス領域で入力可能になります。その際は、消滅(extinction)フィールドが0にセットされる必要があります(?)。色を持つ反射をする金属の場合、RGBチャネルにそれぞれ入力する必要があり、これは(マップの各チャネルが正しい値を格納する)一枚の画像マップで実現可能です。

スペキュラマップあるいはメタルネス入力とは対照的にIORを使用する事は一般的にお勧めできません。なぜならIORは通常ゲームの用途として使われないからです。そして多重マテリアルとテクスチャ内で正しい値を取得する事は難しいからです。IOR入力はToolbag2でサポートされていますが、理論的ではなくより科学的な意味でサポートされています。

フレネル

フレネルは「グレージング角度で表面が反射する光のパーセンテージ」です。


画像:フレネル比較図~フレネルとマイクロサーフェースの関係性(横軸0.0-1.0:マイクロサーフェス


フレネルは全種類のマテリアルがグレージング角度で100%反射するようにするには一般的に1にセットすべきです(メタルネス反射モジュールで値を1にロックする事)。より鮮やかあるいはぼんやりしたフレネル結果に影響するマイクロサーフェスにおける分散は自動的にグロスマップ経由で定義されます。

注意:Toolbag2は現在フレネル明度の制御できるテクスチャマップ機能をサポートしていません!!

アンビエントオクルージョン

アンビエントオクルージョン(以下AO)は「大規模スケールの遮蔽光」を表して、一般的に3Dモデルからベイクして生成されます。


画像:アンビエントオクルージョンマップの例


アルベドやスペキュラマップにベイクするのとは対照的に別マップとしてAOを追加する事はシェーダーでスマートな実装方法で使用する事を可能にします。例えば、AO機能が、動的ライトあるはスペキュラ反射からの直接拡散光でなく(Toolbag2のイメージベースライティングシステムの拡散要素である)Ambient Diffuse Lightのみ遮蔽したりする場合に応用できます。

AOは一般的にスペキュラーやグロスマップに乗算するべきではありません。AOをスペキュラマップに乗算する事は以前、不適切な反射(例えば、遮蔽されたオブジェクト上で空の反射がするといった)を軽減するための共通テクニックとして使用されてきました。しかし、近頃はローカルスクリーンスペース反射という内部オブジェクトの反射を実現するより良い手法画存在するので、その手法は使う必要がありません。

キャビティ

キャビティマップは「小規模スケールの遮蔽情報」を意味し、一般的に3Dモデルからベイクしたりノーマルマップから生成する事ができます。


画像:キャビティマップの例


キャビティマップを乗算する際、キャビティマップは表面の凹んだ領域情報のみ含ませ、凸面の領域情報は含めるべきではありません。キャビティマップは、ほとんど領域が白でライトが捉える表面の埋め込まれた領域を表現するための一部の薄暗い領域によって構成されます。キャビティマップは、環境光と動的ライトを使用して拡散およびスペキュラー共に影響を与えます。

代わりに、1枚の反射オクルージョンマップはCavityスロットにロードする事もできます。ですが、この設定をする際はdiffusion cavity値が0である事を確認してください。

マテリアル値の探索

PBRシステムで作業する際に最も難しいチャレンジは、正確で矛盾のない値を探索する点です。インターネット上には数多くの計測値の情報が存在します。しかしながら、十分信頼できる情報をもつライブラリを探すのは苦労するでしょう。

QuixelのMegascanサービスは非常に有益です。それらは現実世界のデータからスキャンしキャリブレーションしたタイリングテクスチャの多くのライブラリを提供しているからです。(現在はベータ版がリリースされている)


画像:QuixelのMegascanサービスのマテリアル値チャート


ほとんどのライブラリのマテリアル値は各研究室の状況下での生のマテリアルから計測されている傾向があります。pureness of material, age, oxidization(酸化)そしてwearといった(Toolbag2の)パラメータ要素は対象オブジェクトの現実世界の参照値にバリエーションを生み出してくれる可能性があります。

Quixelのスキャン値は現実世界のマテリアルから計測されたもので上述したような様々な状況に依存しているため、特にグロス/ラフネスの場合は同じタイプでありながらもしばしば微妙な変化があるでしょう。上述したマテリアル値チャートの値は最初の目安として捉えるべきで確定した/絶対的なレファレンスとしては捉えるべきではありません。

テクスチャコンテンツの生成方法


図:マルチレイヤーにより作成したPBRテクスチャの応用例


PBRシステム用のテクスチャコンテンツの生成方法は数多く存在します:選択する正確な手法は個人の好みやどのソフトを使用しているかにも依存します。ここでは私が以前に作成した上図に示しているレンズマテリアルを例にその手法を簡単に説明したいと思います。

まず、Megascansからタイリングテクスチャの組み合わせを使用し、各表面の種類ごとにToolbagで基本マテリアルを生成します。次に最適なレファレンス、ロジックそして観察が欠落しているマテリアルの値を決定します。Toolbagで基本マテリアルを生成する事は素早く値を調整する事を可能にし、最終結果のとても正確なプレビューを確認する事ができます。私は最終的なベイクをする前に各そのテクスチャをどのように仕上げるかのアイデアをクリアーにするために、よく基本マテリアルを直接自分の高解像度のポリゴンモデルに貼り付けます。

基本マテリアルのセットアップが終わったら、私はPhotoshopにテクスチャとその値を持っていき、論理的手段としてそれらをレイヤーに登録していきます。一番下にはbrass(黄銅)を、nickel plating, matte primer, semi-gross textured paint, painter for letteringそして最後にred glossy plasticを登録します(詳細は画像を参照)。このレイヤーセットアップは、各レイヤー下の様々なマテリアルをシンプルなマスクで明らかにするのを容易にする効果があります(?)。

dDoMariそしてSubstance Designerでも似たレイヤー機能は実現可能です。


図:各テクスチャ(albedo/reflectivity/microsurface/normal)例


基礎レイヤーのセットアップと様々な着用(wear)ステージを表現するためのブレンド作業を終えたら、幾つかの詳細を追加しました。まず私はdDoを使用して埃と汚れ用パスを生成するためにdDoを使用しました。そしてグロスマップにおいて最適な表面のバリエーションを生成するための調整を行いました。

PBRシステム用のコンテンツを生成するために使用する正確な方法は最終結果よりそれほど重要ではありません。ですので、まずは気楽に実験をしてどの手法があなたのニーズにベストかを確認してみてください。しかしながら、ある特定のライティング環境でのより興味深いマテリアル値の調整は避けるべきでしょう。使用するマテリアルのためのサウンドベースの値は著しくプロセスをシンプルにして、正確性と大規模プロジェクトでのアセットの再利用性を促進し、アセットがどのようにライティングを下としても常に良い見た目になる事が保障されるでしょう。

Artist Q&A

我々はToolbag2がリリースされて以降、次々に公開されるToolbag2上のPBR作品に感銘を受けてきました。ですので、ここでは幾つかの非常に優れた作品を紹介する機会を設けて、その作品を作ったアーティストに幾つかのPBR関連の質問をしたいと思います。

Wojciech Klimas

Wojciech Klimas氏はDNVで働くポーランドのアーティストで、現在はSurvey Simulatorプロジェクトで働いています。Wojciech氏はフリーランスワークとしても活動しています。是非彼のポートフォリオをチェックしてみてください。


図:Wojciech Klimasのアートワーク


Q. PBRワークフローを適応する観点から最も難しい事は何でしょうか?

A. 最も難しい事は、正確なアルベド、反射率そしてラフネスの値を維持する事だと思います。ある一つの特定のライティング状況においてよい見栄えにするためにうそをついたり値を調整する事はいつでも可能です。しかしこれは他のライティング状況で悪い結果を引き起こすかもしれません。もしこの調整を物理的に正確な値を用いてこの調整を正確に行えば、全ての状況において良い結果が得られるでしょう。現実より優れた見た目はないでしょうから:)

当初は、私は1つのスクリーン上でPhotoshnopを使用し、もう一つのスクリーンで異なるマテリアル反射性チャートを参照して作業をしていました。ですが、経験を積めば積むほど値調整作業は容易になってきて、それほど頻繁にチャートの値をチェックする必要はなくなってきました。

Q. 各PBRマテリアル用にどの値を使用するかをどのように決定していますか?

A. 通常インターネット上の研究された値を参照します。ただ、自分自身でマテリアルを計測するのは担当範囲外ではありますが、より理解を深めるために実際に自分自身で計測したいとも考えています。

Q. 素晴らしい見た目にするためのTipsを共有していただけませんか?

A. とても難しい質問ですね。答え得るベストなアドバイスは「物理を勉強する事」ですね:)。物理の概念があるとなぜ各マテリアルがそのように振舞うのかについて実に役立つと思います。イケテル見た目にするためのショートカットはないと思います。純粋に実践、実践、実践する必要があると思います。

Joeri Vromman

Joeri Vromman氏はDAEの学校に行く予定のベルギン在住のアーティストで、また生徒の傍らフリーランスとしても活動しています。彼の作品の詳細はこちらのサイトをご覧ください。


画像:Joeri Vromman氏のアートワーク


Q. PBRワークフローを適応する観点から最も難しい事は何でしょうか?

A. 最も厳しい部分は、様々なソースから有益な情報をまとめる点でした。私はシングルアーティストなので、多くのスタジオが持つような膨大なれソースや便利なツールにアクセスする事ができなかったので。当初はとてもそれが圧倒されるような大変な作業と思っていました。ですが、いったんやり始めればだんだんそのプロセスに詳しくなってきて、各ソースを素早く集める事ができるようになります。私の経験上、そのステップはそれほど大きいものではなかったと言うことは明らかになりました。そして物理ベースシェーダー用のテクスチャを格段に素早く作れるようになりました。

Q. 各PBRマテリアル用にどの値を使用するかをどのように決定していますか?

A. 私が好きな作業方法は以下のステップで構成されています。
  1. 各マテリアルの種類/対象オブジェクトのパーツのリファレンスを集めます
  2. 各マテリアルの種類用の荒いブロックを作る事から始めます。これは正確である必要はありませんが、できるだけ最終イメージに近くなるべきです。そうする事で調整しやすいよいベースマテリアルを持つ事ができます。


画像:Wojciech Klimasのアートワーク2


各マテリアル毎に、まず私は反射率の値を設定します。これらはオンライン上で様々なチャートがあるのでそれらを参照しています。もし特定のマテリアルで反射率の値が見つからない場合、論理的な理由からその値を決定します。(例. 擦り切れてるゴムは反射性は低く、黄銅は銅と亜鉛の融合になるだろう等)

反射率の値は、着手するのに最も簡単なパラメータで、他のマップにとって良いベースになります。絶縁体の場合、非金属が通常反射する微小の範囲内の値にキープ&キープする事は重要です。金属の場合、まず拡散要素を黒くして、最適な反射率の値を探す事が重要です。その後、通常3つのカテゴリ(shiny, middle あるいはrough)においてマテリアルをソートする事により、素早くラフネスの値を割り当てます(?)。次に、アルベドカラーを取り上げ、矛盾なく暗くなりすぎてないかを維持するために注意を払います。私はまた様々な空中画像に切り替えてそのマテリアルが様々なライティング状況において矛盾がないかを確認します。いったんこの初期ステージが終了すると、私はこれらの値をよりよくチューニングするため観測に戻ります。なぜなら全てのマテリアルは異なっていて、PBRの概念を頭に入れておく必要があるからです(?)。この時点で、私は基本的なOverlayをマテリアルのノーマルマップに追加して、凸凹なプラスティックのような感じで、表面のバリエーションを増やしていきます。

Q. 素晴らしい見た目にするためのTipsを共有していただけませんか?

A. 私見ですが、(選択肢から選択する反射性値のように)ある特定のマテリアルが容易に得られたとしても、確実にそれらが信用できるという事ではないと思います。信用できるマテリアルを得るキーは依然として検証中で、現実世界のマテリアルを最終的なテクスチャに説得力のある見た目にいかに変換することができるか、だと思います。

参考文献

2014年5月24日土曜日

GDC2014「Technical Issues in Tools Development Roundtable(3 Days)」マインドマップ

ちょっと前の話題になりますが、thetoolsmith.orgにアップされているGDC2014の「Technical Issues in Tools Development Roundtableメモ」が改めてよくまとめられてるなと思えたのでマインドマップ化(PDF)してみました。3日間に渡ってツール開発に関する様々な話題が討論された内容がコンパクトにまとめられておりガイドラインとして参考になる点が多いと感じたので。日本語化はしてないけど・・・俯瞰するにはこっちの方がいいと思ったので。

2014年5月18日日曜日

Marmoset Toolbatの「Basic Theory of Physically-Based Rendering」を訳してみた

昨今、Physically-Based Rendering(以下PBR)の話題をよく耳にするのですが、その定義が良く分かっていないので英語の勉強も兼ねてMarmoset Toolbag2のサイトに掲載されている「Basic Theory of Physically-Based Rendering」を全訳してみました。上述したようにPBR自体分かってない人が訳してるので変な訳があったら突っ込んでいただけると幸いです。特に不明な部分は(?)としてます。




物理ベースレンダリングの基礎理論

最近リアルタイムレンダリング界ではPBRに関する話題が熱いです。ただ、その定義の境界線はぼんやりとしていて「その正確な定義が何なのか」について混乱を招きがちです。その曖昧な定義をあえて短く説明するならば「状況により様々な意味がある」と私は答えます。この回答はさらに不満を生じさせそうなので、ここではPBRについて取り上げて「PBRとは何を表すのか」「他のレンダリング手法とどう違うのか」について軽く説明してみたいと思います。この説明はアーティストのような非エンジニアを対象にしているため、数式やコードは一切出さない予定です。

「PBRと以前の手法とで何が異なるか」という質問は、ライトとサーフェースの性質(behavior)を掘り下げると大体解決します。その特徴的なシェーディング能力は、幾つかの旧来の近似方法やアート生成手段と比較して著しく進歩しています。よって、エンジニアだけでなくアーティストもこれらの変化の要因について理解しておく必要があるのではないかと思います。

まず何が進歩したのかを説明する前に、それらをよりよく理解するため幾つかの基礎理論について述べたいと思います。「既に基礎は抑えてるはずだ」という方にとっても理解をより深めるための価値はあると思うので、是非我慢して読んでいただきたいと思います。この基礎理論を読みきれば、Jowのチュートリアル記事"Tutorial: Physically Based Rendering, And You Can Too!"をよりチェックしたくなると思います。

拡散と反射

"diffusion(以下拡散)"と"reflection(以下反射)"は"diffuse"と"specular"としても知られています。これら2つの用語は、表面とライトの相互作用を分離した最も基本要素となります。大半の人は実用レベルではこれらの概念は理解していると思いますが、物理的にはそれらがどのように明確に異なるかは知らない方が多いと思います。

光が表面の境界線に衝突すると"反射(reflect)"すなわち"跳ね返り(bounce off)"が起こります。反射方向は表面の法線の反対の方向になります。これはボールを床に投げつける時の現象ととても似ています。その場合も反対側の角度に跳ね返るので。ツルツルの表面上での症状は鏡と同じ現象になるでしょう。"鏡面反射性(specular)"という用語はこの鏡の現象を描写する時に良く使われて、ラテン語の"鏡"という意味から由来しています。

しかしながら、全ての光は表面から反射せず、通常一部は照明を当てられたオブジェクトの内部に浸透していきます。内部に浸透する光は、マテリアルに吸収されたり(通常熱に変換される)、内部で散乱したりします。この散乱光の一部は表面(入射した場所)とは別の場所から反射され、一回以上眼球やカメラの視界に入ってきます。これは、"拡散光", "拡散", "散乱光"といった多くの名前で知られていますが、全て同じ現象を表します。


画像::光の相互作用の基本要素(拡散と反射)


拡散光の吸収および散乱された要素は全く異なる光の波長であり、それぞれオブジェクトに光の色を与える要素になります。(もし1オブジェクトがほとんどの光を吸収してわずかに青色を散乱すると見た目は青になります)散乱要素は一様にカオス状態で全方向から同じ色に見えるとも言え(?)、鏡のケースとは全く異なります。この近似を使用するシェーダーは1入力として"アルベド(albedo)"を必要とします。これは、内部で散乱して表面の裏側から反射する様々なライト色の一部を表し(?)、時に同意語として"拡散色(diffuse color)"とも呼ばれます。

透光性と透明性

幾つかのケースで"拡散(diffusion)"はより複雑になります。例えば、肌やワックスといったより広い範囲で内部散乱するマテリアルを持つ場合です。これらのケースは単純色計算では成立せず、シェーディングシステムがライトに照らされたオブジェクトの形状や厚みを考慮に入れる必要があります。もしそのオブジェクトが十分薄ければ、散乱光がそのオブジェクトの裏側から見られて、translucent(半透明)と呼ばれる現象が起こります。もしグラス(glass)のように拡散要素が通常より低い場合はほとんどの要素が散乱しないのは明白で、全体像はオブジェクトの片方から反対側へ劣化することなく通過することができます。これらの性質は典型的な"表面に近接した(close to the surface)"拡散とは異なり、通常はそれらをシミュレートするためのユニークなシェーダーが必要になります。

エネルギー保存則

これまでの記述で、我々は重要な結論を導く十分な情報を得てきました(?)。それは反射と拡散は相互に排他的であるということです。これは即ちライトが拡散してライトがまず表面で浸透しなければならないということを意味します(即ち、反射に失敗するということを意味します)。これはシェーディングの専門用語において"エネルギー保存則"の一例として知られていて、表面から放たれる光は本来感じる光よりも必ず明るい(→表面から放たれる光はそこに届いた光よりも強くなることはない)事を意味します。

この法則はシェーディングシステムにおいて実行しやすいといわれてます。それは単純に拡散シェーディングを発生する前に反射光を減算するだけで実現できるからです(?)。これは反射率の高いオブジェクトは少量の拡散光を表示することを意味します?(show little to no diffuse light)。これは単に少量の拡散光に表面に光が浸透する事と同意でその結果ほとんどが反射することになります(?)。その逆もまた然りで、もしあるオブジェクトが明るく拡散する場合そのオブジェクトは著しく反射しにくくなるでしょう。


画像::アルベド一定下での反射性の変遷図


この種のエネルギー保存則は、物理ベースシェーディングの重要な側面の1つです。これはアーティストに(見た目が悪くなりがちな)物理法則のうっかり違反を防ぎ、マテリアル用の反射性とアルベドを用いた手法を提供します。コード内でこれらの制約を強要することは必ずしも良い見た目を生み出すとは限りませんが、これはある種の"過保護な物理学者(nanny physist)"として有益な役割を果たし、アートワークから物理法則を捻じ曲げたり、異なるライティング状況下で不安定な見た目になる事を防ぐことができます。

金属

ほとんどの金属が該当する"電気伝導マテリアル(electrically conductive materials)"は、以下の理由によりPBRにとって重要な要素となります。その理由を以下に述べます。

まず「伝導体(金属)は絶縁体(非伝導体)よりもはるかに反射する傾向がある」点です。伝導体は通常高くて60~90%まで反射を行いますが、絶縁体は一般的にそれらより低く0~20%の間で反射します。これらの高反射性は内部からの散乱光が届くことを防ぎ、金属にとても"光沢ある(shinny)"見た目を与えます。

次に「伝導体の反射性は時々可視の(電磁波)スペクトルを通して変化しその結果それらの反射は淡い色を表す」という点。この反射色特性は伝導体内でも稀ですが、我々に馴染みのある幾つかの金属において発生します(例. 金、銅、黄銅等)。一般的に、絶縁体はこの効果を表さずそれらの反射は色がつかないという法則があります。

最後に「電気伝導体は通常表面に浸透する散乱光よりも吸収される」という理由です。これは伝導体理論において拡散光はいかなる兆候も見せないことを意味します。しかしながら実世界では、酸化物が存在し金属の表面の他の残余物が幾つかの少量の光を散乱させます。

この金属と他の物質(非金属)との間の二重性(duality)は幾つかのレンダリングシステムに"metalness"を直感的な入力として採用する事を可能にします。そのようなシステムにおいて、アーティストは金属属性を持つマテリアルに角度(degrees)を示すことで、従来のアルベドと反射特性を明確に示すよりも時にマテリアルを生成する上でよりシンプルな手段として好まれることがあります。しかし、これは必ずしも物理ベースレンダリングの特徴に必要であるわけではありません。

フレネル

"Argstin-Jean Fresnel"はかなり昔に亡くなった白人ですが、我々は恐らくその名を聞いたことがあるでしょう。なぜなら、彼はある重要な現象を明確に説明したため現象名に彼の名前が刻まれてるからです。彼のその発見が無ければ光の反射について議論することは現在でも難しかったことでしょう。

コンピュータグラフィックスにおいて、フレネルという用語は「異なる角度で異なる反射が発生する事」を表します。具体的には"グレージング角度(grazing angles)"で表面に辿り着いた光はその表面上で消失する(dead-on)光よりも多く反射する傾向が強いといわれています。これは適切なフレネル効果でレンダリングされたオブジェクトはエッジ周辺でより明るく反射することを意味します。我々のほとんどはこの現象を実世界で経験していますし、コンピューターグラフィックスの世界でもその存在は新しいものではありません。しかしながら、PBR用シェーダーによってフレネル数式の計算における幾つかの重要な補正をより有名にしました。(ここではその重要な補正について説明します)

まず「全てのマテリアルにとって反射特性は"グレージング角度"において全て成り立つ」というものです。 これはいかなるスムーズなオブジェクト上に現れる"エッジ"は完璧な鏡のように見えるべきでそのマテリアル特性は影響しない事を表します。実際にいかなる物質でもその表面がスムーズでかつ正しい角度から見た場合は、完璧な鏡のように見えるはずです。これは直感で分かりにくいですが、物理的には正しい現象です。

二つ目のフレネル特性は「角度間のカーブあるいは勾配(gradient)はマテリアル毎に変化しない」というものです。金属はもっとも発散しますが、それらは分析的に説明可能です。

これは我々にとって「リアリズムを仮定することを求められていて、フレネル特性を用いる事でアーティスト制御コストは一般的に減少することあるいは最低限でも我々は既に各マテリアルのデフォルト値を知っていること」を意味しています!

これはある意味良いお知らせです。なぜならこの特性によりコンテンツ生成を単純化できるからです。このシェーディングシステムはフレネル現象を処理していて光沢(gloss)や反射性(reflectivity)といった既に存在する幾つかのマテリアル属性を処理(consult)できる唯一の手法です。


画像::クロムめっきした金属とゴムの基礎反射性


PBRワークフローは(上図に示した)"基礎反射性"(Base Reflectivity)"といった1つあるいは幾つかの手段によりアーティストに明白な仕様を与えます。これは最低限の光量?(the minimum amount)あるいは反射された光の色を提供します。いったんレンダリングされると、フレネル効果はアーティストが指定した値を反射性に加えるでしょう。そしてグレージング角度において100%(真っ白になる)まで加算されます。本質的にここで述べてる内容は基礎であり、フレネル数式はそこから引き継がれ、様々な必要な角度において表面をより反射するよう改良を続けています。

一つ重大な注意点がフレネル効果にはあります。それは「表面が滑らかでなくなればなくなるほど明確に素早くその現象は無くなっていく」という点です。この相互作用に関するより詳細な情報は後の項で述べたいと思います。

マイクロサーフェス

上述した反射性と拡散はいずれも表面の向きに依存します。大規模なスケール上ではこの表面の向き情報(?)はレンダリングされるメッシュ形状に依存します。そしてそのより細かな詳細なはノーマルマップによって表現されるかもしれません(?)。この表面の向き情報を持つことでいかなるレンダリングシステムも拡散や反射を極めて良い結果をもたらします。

しかしながら、依然として大きな要素が一つ欠落しています。それは「現実世界のほとんどの表面がもつとても微細な不完全さ(very small imperfections)」です。具体例としては、適切な解像度のノーマルマップで表面すべきの微細な溝・ひび・目に見えるとても小さな集合体(lumps)等が挙げられます。これらのマイクロスコープ的特長は裸眼では見ることはできませんが、ライトの拡散と反射に影響しています。


画像::荒いマイクロサーフェス上の"ぼやけた"反射


極小表面(以下マイクロサーフェース)の詳細は反射において最も分かりやすい効果を得ます(物質の拡散はそれほど作用しないのでここではこれ以上述べません)。上図のように並行した入射光は粗い表面上では反射する際に各光線が様々な方向に分散します。現実世界でボールが断崖あるいは類似した凸凹した表面に衝突する際、ボールはさらに反射しようとしますが予測できない角度に反射する事でしょう。これと同様に、表面が凸凹しているほど反射光は多様な方向に拡散しその結果"ぼやけた"見た目になります。

残念ながら、シェーディングのために各マイクロサーフェスをまともに評価することはアートプロダクション・メモリ使用量・、計算量の観点から現実的ではないでしょう。我々はどうすればこのシェーディングを実現できるのでしょうか?もし我々がそのマイクロサーフェスの詳細は直接記述するアプローチではなく、"表面の粗さ(roughness)"の一般的な計測値を使用すればかなり正確なシェーダーを記述することが可能になります。この計測はよく"gloss", "smoothness"あるいは"roghness"と呼ばれていて、各マテリアルのこれらの計測値は1枚のテクスチャとしてあるいは固定値として格納することが可能です。

このマイクロサーフェースの詳細は各マテリアルの表現にとってとても重要な特徴となります。なぜなら現実世界は様々なマイクロサーフェスの特徴の集合体のようなものだからです。この"gloss mapping"というコンセプトは決して新しいものではありませんが、物理ベースのシェーディングにおいて極めて重要な役割を果たします。なぜならマイクロサーフェスの詳細は光の反射において大きな影響を持つからです。我々はまもなく実際に見ることになりますが、PBRシェーディングシステムを改良するためにはマイクロサーフェスの特性を幾つか考慮する必要があります。以下ではそれらの考慮すべき点について述べたいと思います。

エネルギー保存則(再び)

我々の仮説のシェーディングシステムは「マイクロサーフェスの細部を考慮し反射光が適切に拡散している」ので、反射する光の正確な量を考慮する必要があります。残念ながら、多くの他のレンダリングシステムはこの点については考慮できておらず、マイクロサーフェスの荒さ(roughness)に依存して反射する光が多すぎたり少なすぎたりする傾向にあります。

その数式が適切にバランスがとられている時、レンダラーは荒いサーフェスをより多くの反射のハイライトを持つように描画します。言い換えると、スムーズな表面で見られるより小さなより鋭いハイライトよりもぼんやりと薄暗いハイライトを表します。この明るさを表現する上での明らかな相違はキーとなります。すなわち、各マテリアルは同じ量の光を反射するけれども、粗い表面であればあるほどより多様な方向に拡散し、スムーズな表面は一点集中した"光線"のように反射するという相違を抑えておくことは重要です。


画像::反射性一定下での光沢の変遷図


ここでは、先ほどとは違った切り口でエネルギー保存則を述べてみました。最初に述べた"拡散/反射のバランス"に加えて、"エネルギー保存則"はいかなるレンダラーにとって"物理ベース"を実現するために最も重要な要素の一つであることが分かっていただけたかと思います。

ようこそ!マイクロサーフェースの世界へ

ここでは、我々がここまで学んでてきた知識の中で重要な要素の1つである「マイクロサーフェスの光沢は直接的に反射の明るさ(brightness of reflections)に反映する」点についてさらに掘り下げたいと思います。これは「一人のアーティストがグロスマップに直接"引っかかれた・凹んだ・擦りむかれたあるいは磨かれた領域"等様々なバリエーションをペイントできる」ことを意味します。そして「PBRシステムは反射形状における変化だけでなく関連する明度(intensity)も描画されるでしょう。"spec mask"/反射性の変化("spec mask"/reflectivity changes)は要求されません(?)。

これは非常に重要です。なぜなら、物理的に関連している二つの重要な現実世界の特性"マイクロサーフェスの細部"と"反射性"が"アートコンテント"と"レンダリングプロセス"において初めて適切に結びついているからです。これは以前に拡散/反射の綱渡り(balancing act)を述べたのと同様に我々は独立して双方の値をオーサリング可能です。しかしながらそれらは関連しているので、それらを全く別々のパラメータとして扱うことはかなり難しいと思われます。

さらに、現実世界のマテリアル計測は反射値が幅広く変化しないことが予想されます(詳細は上述した伝導性物質の項を読んでください)。一つの良い例として水と泥が上げられます。双方のマテリアルはとても似た反射特性を持っていますが、泥は非常に荒く水溜りの表面は非常にスムースなので、それらは反射光の観点からは非常に異なる見た目となります。PBRシステムにおいてそのようなシーンを作成する場合、アーティストはその異なりを反射特性を調整するよりも先にまずグロスマップやラフネスマップを通じてオーサリングする事になるでしょう。具体例として以下の画像を示します。


画像::マイクロサーフェスの例(水と泥)


マイクロサーフェスの特性は反射において同様に他の微細な効果も持ちます。例えば"境界線がより明るい"フレネル効果は粗い表面の場合幾分減少します。(粗い表面の混沌とした特徴はフレネル効果を"散乱"します。その結果、観察者にはフレネル効果が見えにくくなります?)さらに、窪んだマイクロサーフェスはライトを"だます"事が可能です。具体的には、表面に対して何度も反射することにより、光の吸収や明るさの現象を引き起こします。異なったレンダリングシステムはこれらの詳細を様々な方法で処理して様々な範囲に応用します。しかしながら、より粗い表面が薄暗く見える傾向は共通してます。

結論

当然ながら、ここでは述べていないPBRの重要なトピックはまだまだ数多くあります。このドキュメントは基礎的な紹介として重要なものを提供しただけに過ぎません。もしあなたがまだJoeの"PBRアートワークチュートリアル"を読んでいないのならば是非読んでみてください。更なる技術情報を求める方のために、いかに幾つかのお勧めの書籍およびウェブページを紹介しておきます。



もし、それでもまだ答えが出ない熱い質問があれば、Twitter等で質問してみてください。


以上です。