Shading mengacu pada penggambaran kedalaman suatu objek dalam model 3D atau
ilustrasi dengan mengubah-ubah tingkat dari kegelapan suatu object(darkness).
Menggambar Shading merupakan suatu proses yang digunakan dalam menggambar
dengan tingkat darkness tertentu pada sebuah kertas dengan memakai media yang
lebih padat atau menampilkan bayangan yang lebih gelap untuk area yang lebih
gelap dan memakai media yang tidak terlalu padat atau menampilkan bayangan yang
lebih terang untuk area yang lebih terang. Ada berbagai macam teknik shading,
misalnya cross hatching dimana garis-garis tegak lurus dengan jarak satu sama
lain (kedekatan) yang berbeda-beda digambar pada pola grid untuk membentuk
bayangan area. Semakin dekat garis-garis tersebut, semakin gelap area yang
muncul. Begitu pula sebaliknya, semakin jauh garis-garis tersebut, semakin
terang area yang muncul.
Pola-pola yang terang (misalnya objek yang memiliki area terang dan area
berbayang) akan sangat membantu dalam pembuatan ilusi kedalaman pada kertas dan
layar komputer.
Komputer
grafis
Pada
komputer grafis, shading mengacu pada proses mengubah warna berdasarkan sudut
terhadap cahaya dan jarak dari cahaya untuk menciptakan efek photorealistic.
Shading dilakukan selama proses penggambaran.
Sudut
terhadap sumber cahaya
Shading mengubah warna tampilan dalam model 3D berdasarkan sudut permukaan
terhadap cahaya matahari atau sumber cahaya lainnya.
Gambar pertama di bawah ini menunjukkan permukaan-permukaan kotak yang digambar
dimana semuanya memiliki warna yang sama. Garis tepi telah digambar sehingga
memudahkan gambar dilihat dan dibedakan.
Gambar kedua merupakan model yang sama, namun tidak memiliki garis tepi. Sangat
sulit membedakan permukaan kotak yang satu dengan yang lainnya.
Gambar ketiga memiliki shading dimana membuat gambar menjadi lebih realistis
dan lebih mudah dilihat serta dibedakan.
Sumber cahaya
Ada
berbagai jenis cahaya:
•
Ambient light – Ambient light menyinari semua objek dalam suatu scene secara
merata, membuat objek menjadi terang tanpa menambahkan bayangan.
•
Directional light – Directional light menyinari semua objek secara merata dari
suatu arah tertentu. Ia bagaikan suatu area terang dengan ukuran dan jarak yang
tidak terbatas dari scene. Ada bayangan, tetapi itu bukan merupakan distance
falloff.
•
Point light – Point light berasal dari satu titik dan menyebar dalam berbagai
arah.
•
Spotlight – Spotlight berasal dari satu titik dan menyebar mengikuti arah
kerucut.
•
Area light – Area light berasal dari satu bidang datar dan menyinari semua
objek dalam arah tertentu yang berasal dari bidang datar tersebut.
•
Volume light – Volume light merupakan suatu ruang tertutup yang menyinari objek
dalam ruang tersebut.
Shading diinterpolasikan berdasarkan bagaimana sudut dari sumber cahaya
mencapai objek dalam suatu scene. Tentu saja sumber-sumber cahaya tersebut
mungkin dan seringkali dikombinasikan dalam sebuah scene. Pelukis atau
ilustrator kemudian menginterpolasikan bagaimana cahaya-cahaya ini
dikombinasikan dan memproduksi gambar 2D yang akan ditampilkan di layar.
Distance
fall off
Secara teoritis, dua permukaan paralel disinari jumlah cahaya yang sama dari
sumber cahaya yang jauh, seperti matahari. Walaupun permukaan yang satu jauh,
mata kita melihat permukaan tersebut lebih banyak di ruang yang sama sehingga
penyinarannya tampak sama.
Perhatikan gambar pertama dimana warna pada permukaan depan dari kedua kotak
benar-benar sama. Tampaknya ada sedikit perbedaan ketika kedua permukaan
tersebut bertemu, tetapi ini merupakan ilusi optikal yang disebabkan oleh garis
tepi vertikal di bawah dimana kedua permukaan ini bertemu.
Perhatikan gambar kedua dimana permukaan kotak tampak lebih terang pada bagian
depan dan tampak lebih gelap pada bagian belakang. Selain itu, permukaan lantai
juga tampak semakin gelap seiring makin jauhnya jarak.
Efek distance falloff membuat gambar tampak lebih realistis tanpa harus
menambahkan cahaya tambahan untuk menimbulkan efek yang sama. Distance falloff
dapat dihitung dalam beberapa cara:
•
Tidak ada
•
Linier – Untuk setiap unit x jarak suatu titik dari sumber cahaya, jumlah
cahaya yang diterima adalah unit x dikurangi bright.
•
Kuadratik – Ini menunjukkan bagaimana cahaya kira-kira bekerja di kehidupan
nyata. Suatu titik yang dua kali jauhnya dari sumber cahaya dibandingkan titik
lainnya akan menerima cahaya empat kali lebih sedikit.
•
Faktor n – Suatu titik yang jaraknya sebesar unit x dari suatu sumber cahaya
akan menerima cahaya sebesar 1/xn.
•
Fungsi matematis lainnya juga dapat digunakan.
Flat vs
smooth shading
Flat shading merupakan teknik pencahayaan yang digunakan dalam komputer grafis
3D. Ia membentuk bayangan setiap polygon dari suatu objek berdasarkan sudut
antara permukaan normal polygon dan arah dari sumber cahaya, warna-warna
respective, dan intensitas sumber cahaya. Ini digunakan dalam pembuatan gambar
dengan kecepatan tinggi dimana menggunakan teknik-teknik shading yang lebih
sulit dan secara perhitungan lebih mahal. Akan tetapi, di akhir abad ke-20,
kartu grafis yang terjangkau menawarkan smooth shading yang dapat digunakan
dalam proses penggambaran cepat, membuat flat shading tidak diperlukan lagi.
Kekurangan dari flat shading adalah ia memberikan tampilan model yang
low-polygon. Terkadang tampilan ini dapat menguntungkan juga, misalnya
dalam membuat model objek berbentuk kotak. Pelukis terkadang menggunakan flat
shading untuk melihat polygon dari model padat yang mereka ciptakan.
Teknik-teknik pencahayaan dan shading lanjutan dan lebih realistis meliputi
Gourad shading dan Phong shading.
Model
Shading
Model shading menentukan bagaimana suatu
permukaan objek muncul dalam kondisi pencahayaan yang berbeda-beda. Beberapa
model matematis dapat digunakan untuk menghitung shading. Setiap model shading
memproses relasi dari permukaan normal terhadap sumber cahaya untuk menciptakan
efek shading tertentu.
Phong
Menggunakan warna-warna ambient, diffuse, dan specular. Model shading ini
membaca orientasi permukaan normal dan menginterpolasikannya untuk menciptakan
tampilan smooth shading. Ia juga memproses relasi antara normal, cahaya, dan
sudut pandang kamera untuk menciptakan specular highlight.
Hasilnya adalah suatu objek dengan bayangan smooth, permukaan area yang
disinari diffuse dan ambient, serta suatu specular highlight sehingga objek
tampak bersinar seperti bola biliar atau bola plastik. Pemantulan,
transparansi, refraksi, dan tekstur dapat diterapkan pada objek yang menggunakan
Phongshader.
Lambert
Menggunakan warna-warna ambient dan diffuse untuk menciptakan permukaan matte
tanpa specular highlight. Ia menginterpolasikan normal dari permukaan segitiga
yang berdampingan sehingga shading berubah secara progresif, menciptakan suatu
permukaan matte.
Hasilnya adalah suatu objek dengan smooth shading, seperti telur atau bola
ping-pong. Pemantulan, transparansi, refraksi, dan tekstur dapat diterapkan
pada objek yang menggunakan Lambert shader.
Blinn
Menggunakan warna-warna diffuse, ambient, dan specular, serta refractive index
untuk menghitung specular highlight. Model shading ini identik dengan model
shading Phong, kecuali bentuk specular highlight-nya merefleksikan pencahayaan
lebih akurat ketika ada sudut tinggi antara kamera dan cahaya.
Model shading ini berguna untuk tepian yang kasar atau tajam dan untuk
mensimulasikan permukaan logam. Specular highlight-nya tampak lebih terang
dibandingkan model Phong. Pemantulan, transparansi, refraksi, dan tekstur dapat
diterapkan pada objek yang menggunakan Blinnshader.
Cook-Torrance
Menggunakan warna-warna diffuse, ambient, dan specular, serta refractive index
untuk menghitung specular highlight. Ia membaca orientasi permukaan normal dan
menginterpolasikannya untuk menciptakan tampilan smooth shading. Ia juga
memproses relasi antara normal, cahaya, dan sudut pandang kamera untuk
menciptakan specular highlight.
Model shading ini memproduksi hasil yang berada diantara model shading Blinn
dan Lambert, serta berguna untuk mensimulasikan objek yang lembut dan reflektif
seperti kulit. Pemantulan, transparansi, refraksi, dan tekstur dapat diterapkan
pada objek yang menggunakan Cook-Torrance shader.
Karena model shading ini lebih kompleks untuk dihitung, ia memakan waktu lebih
lama dalam pelukisan daripada model shading lainnya.
//
Copyright (c) 2007 PIXAR. All rights reserved. This program or
//
documentation contains proprietary confidential information and trade
//
secrets of PIXAR. Reverse engineering of object code is prohibited.
// Use
of copyright notice is precautionary and does not imply
//
publication.
//
//
RESTRICTED RIGHTS NOTICE
//
// Use,
duplication, or disclosure by the Government is subject to the
//
following restrictions: For civilian agencies, subparagraphs (a) through
// (d)
of the Commercial Computer Software--Restricted Rights clause at
//
52.227-19 of the FAR; and, for units of the Department of Defense, DoD
// Supplement
to the FAR, clause 52.227-7013 (c)(1)(ii), Rights in
//
Technical Data and Computer Software.
//
//
Pixar Animation Studios
// 1200
Park Avenue
//
Emeryville, CA 94608
//
//------------------------------------------------------------------------------------------------------//
//------------------------------------------------------------------------------------------------------//
//
SCRIPT:
CookTorrance.sl
//
AUTHOR: Scott Eaton
//
DATE:
July 3, 2007
//
//
DESCRIPTION: A simple implementation of the
Cook-Torrance
//
shading model describe in:
//
A Reflectance Model for Computer Graphics
//
R. L. Cook, K. E. Torrance, ACM Transactions on Graphics 1982
//
//------------------------------------------------------------------------------------------------------//
//------------------------------------------------------------------------------------------------------//
surfaceCookTorrance(
floatKa
= 1;
float
Ks = .8;
floatKd
= .8;
float
IOR = 1.3;
float
roughness = .2;
color
opacity = 1;
colorspecularColor
= 1;
colordiffuseColor
= (.6, .6, .6);
floatgaussConstant
= 100;
){
//the things we need:
// normalized normal and vector to eye
normalNn
= normalize(N);
vectorVn
= normalize(-I);
float
F, Ktransmit;
float m
= roughness;
fresnel(
normalize(I), Nn, 1/IOR, F, Ktransmit);
color
cook = 0;
floatNdotV
= Nn.Vn;
illuminance(
P, Nn, PI/2 ){
//half angle vector
vector
Ln = normalize(L);
vector
H = normalize(Vn+Ln);
floatNdotH
= Nn.H;
floatNdotL
= Nn.Ln;
floatVdotH
= Vn.H;
float
D;
float
alpha = acos(NdotH);
//microfacet distribution
D = gaussConstant*exp(-(alpha*alpha)/(m*m));
//geometric
attenuation factor
float G
= min(1, min((2*NdotH*NdotV/VdotH), (2*NdotH*NdotL/VdotH)));
//sum contributions
cook +=
Cl*(F*D*G)/(PI*NdotV);
}
cook =
cook/PI;
Oi =
opacity;
Ci =
(Kd*diffuseColor*diffuse(Nn)+Ks*specularColor*cook) * Oi;
}
Strauss
Hanya menggunakan warna-warna diffuse untuk mensimulasikan suatu permukaan
logam. Surface’s specular dikaitkan dengan parameter smoothness dan “metalness”
yang mengontrol warna-warna diffuse berdasarkan specular ratio seperti
pemantulan dan highlight.
Pemantulan,
transparansi, refraksi, dan tekstur dapat diterapkan pada objek yang
menggunakan Strauss shader.
Anisotropic
Terkadang disebut juga ward. Model shading ini mensimulasikan permukaan glossy
dengan menggunakan warna-warna ambient, diffuse, dan glossy. Untuk menciptakan
efek “digosok” seperti aluminium yang diamplas, dapat menggunakan orientasi
specular color berdasarkan orientasi permukaan objek. Specular dihitung
menggunakan koordinat UV.
Pemantulan,
transparansi, refraksi, dan tekstur dapat diterapkan pada objek yang
menggunakan anisotropic shader.
Constant
Hanya menggunakan warna-warna diffuse. Ia mengabaikan orientasi permukaan
normal. Semua permukaan segitiga objek dianggap memiliki orientasi yang sama
dan memiliki jarak yang sama dari cahaya.
Ia menghasilkan suatu objek yang permukaannya tidak ada shading, tampak seperti
suatu potongan kertas. Ini berguna jika kita ingin menambahkan static blur pada
suatu objek sehingga tidak ada cahaya specular atau ambient. Ia juga mendukung
tekstur sebab tidak ada atribut yang mengganggu definisi tekstur.
Model shading Blinn–Phong (disebut juga model pemantulan Blinn–Phong atau model
pemantulan Phong termodifikasi) merupakan suatu modifikasi dari model
pemantulan Phong yang dikembangkan oleh Jim Blinn.
Blinn-Phong merupakan model shading default yang digunakan di OpenGL dan
Direct3D fixed-function pipeline (sebelum Direct 3D 10 dan OpenGL 3.1), serta
digunakan pada setiap vertex selagi ia melewati pipa grafis; nilai piksel
antara diantara vertice diinterpolasikan oleh Gouraud shading by default,
daripada menggunakan Phong shading yang lebih mahal.
Dalam Phong shading, secara kontinu harus menghitung ulang produk skalar
diantara viewer (V) dan sinar dari sumber cahaya (L) reflected (R) pada suatu
permukaan.
Jika
kita menghitung halfway vector antara vector viewer dan sumber cahaya,
Kita dapat mengganti dengan dimana adalah
permukaan normal yang telah dinormalisasikan. Pada persamaan di
atas, dan adalah vector yang telah dinormalisasikan,
dan adalah solusi terhadap persamaan dimana
adalah matriks Householder yang merefleksikan suatu titik di hyperplane yang
memiliki origin dan memiliki normal.
Produk dot ini merepresentasikan cosinus dari suatu sudut yang merupakan
setengah dari sudut yang direpresentasikan oleh produk dot Phong jika V, L, N,
dan R semuanya berada di bidang datar yang sama. Relasi antara sudut-sudut
tersebut diperkirakan benar jika vektor-vektor tidak berada di bidang datar
yang sama, terutama ketika sudut-sudutnya kecil. Oleh karena itu, sudut antara
N dan H terkadang disebut halfway angle.
Dengan pertimbangan bahwa sudut antara halfway vector dan permukaan normal
kemungkinan lebih kecil daripada sudut antara R dan V yang digunakan dalam
model Phong (kecuali permukaan ditampilkan dari sudut yang sangat curam atau
bersudut besar) dan karena Phong menggunakan eksponen
ditetapkan seperti yang lebih mendekati expression
sebelumnya.
Untuk permukaan front-lit (pemantulan specular pada permukaan berhadapan dengan
viewer), akan menghasilkan specular highlight yang sangat dekat
kecocokannya dengan pemantulan Phong. Namun demikian, di saat pemantulan Phong
selalu bulat untuk permukaan datar, pemantulan Blinn-Phong menjadi elips ketika
permukaan dilihat dari sudut yang curam. Ini dapat dibandingkan terhadap kasus
dimana matahari dipantulkan di permukaan laut yang dekat dengan horizon atau
ketika lampu lalu lintas yang sangat jauh dipantulkan di trotoar yang basah
dimana pantulannya akan selalu tersebar lebih vertikal dari pada horizontal.
Walaupun model Blinn-Phong menyerupai model Phong, ia menghasilkan model yang
lebih akurat secara empiris dari fungsi bidirectional reflectance distribution.
(lihat: Experimental Validation of Analytical BRDF Models, Siggraph 2004).
Dalam banyak kasus, model pelukisan ini kurang efisien dibandingkan Phong
shading karena ada perhitungan kuadrat dan akar. Jika model Phong original
hanya memerlukan pemantulan vektor yang simple, bentuk modifikasi ini
memerlukan lebih banyak perhitungan. Namun demikian, karena banyak CPU dan GPU
sudah memiliki fungsi kuadrat dan akar yang lebih akurat (sebagai fitur
standar), serta instruksi lain yang dapat mempercepat proses pelukisan, masalah
waktu sudah tidak terlalu dipermasalahkan lagi.
Model Blinn-Phong akan lebih cepat digunakan dalam kasus dimana viewer dan
cahaya tidak memiliki keterbatasan. Ini adalah contoh kasus untuk directional
light. Dalam kasus ini, half-angle vector bebas berada di posisi dan permukaan
apapun. Vektor dapat dihitung satu kali untuk setiap cahaya, kemudian digunakan
untuk keseluruhan frame atau ketika cahaya dan sudut pandang relatif tetap
berada di posisi yang sama. Hal ini tidak berlaku bagi vektor cahaya
dipantulkan pada model Phong dimana ia vektor bergantung pada rata tidaknya
permukaan dan harus dihitung ulang untuk setiap piksel gambar (atau untuk
setiap vertex model dalam kasus pencahayaan vertex).
Pada kasus dimana cahaya terbatas, misalnya ketika menggunakan point light,
model Phong original akan lebih cepat digunakan.
Sampel di bawah ini dalam High Level Shader Language merupakan suatu metode
penentuan cahaya diffuse dan specular dari suatu point light. Struktur cahaya,
posisi dalam ruang pada suatu permukaan, tampilan arah vektor dan permukaan
normal merupakan faktor penentu.
A
Lighting structure is returned;
struct
Lighting
{
float3
Diffuse;
float3
Specular;
};
structPointLight
{
float3
position;
float3diffuseColor;
floatdiffusePower;
float3specularColor;
floatspecularPower;
};
Lighting
GetPointLight(PointLight light, float3 pos3D, float3 viewDir, float3 normal )
{
Lighting OUT;
if(light.diffusePower>0)
{
float3lightDir=light.position-
pos3D;//3D position in space of the surface
float
distance = length(lightDir);
lightDir=lightDir/
distance;// = normalize( lightDir );
distance=
distance * distance;//This line may be optimised using Inverse square root
//Intensity
of the diffuse light. Saturate to keep within the 0-1 range.
floatNdotL=
dot( normal,lightDir);
float intensity
= saturate(NdotL);
//
Calculate the diffuse light factoring in light color, power and the attenuation
OUT.Diffuse=
intensity *light.diffuseColor*light.diffusePower/ distance;
//Calculate
the half vector between the light vector and the view vector.
//This
is faster than calculating the actual reflective vector.
float3
H = normalize(lightDir+viewDir);
//Intensity
of the specular light
floatNdotH=
dot( normal, H );
intensity=pow(
saturate(NdotH),specularHardness);
//Sum
up the specular light factoring
OUT.Specular=
intensity *light.specularColor*light.specularPower/ distance;
}
return
OUT;
}
Post a Comment