naungan berbasis fisik, bagaimana menggabungkan bagian specular & difus?

8

Setelah menulis 'standar' phong & blinn shaders untuk sementara waktu, saya baru-baru ini mulai mencoba-coba shading berbasis fisik. Sebuah sumber yang banyak membantu saya adalah catatan kursus ini , terutama tulisan ini - ini menjelaskan bagaimana membuat blinn lebih teduh secara fisik masuk akal.

Saya menerapkan model blinn yang dipasang di kertas, dan saya sangat suka tampilannya. Perubahan paling signifikan yang diusulkan (imo) adalah dimasukkannya reflektor fresnel, dan ini juga bagian yang memberi saya masalah. Sayangnya, penulis memilih untuk fokus pada bagian specular saja, menghilangkan pantulan difus. Diberikan misalnya refleksi difus lambertian, saya hanya tidak tahu bagaimana menggabungkannya dengan blinn 'ditingkatkan' - karena hanya menambahkan bagian difus & specular tampaknya tidak benar lagi.

Dalam beberapa shader saya telah melihat 'fresnel term' titik mengambang dalam rentang 0 - 1 yang digunakan, berdasarkan indeks bias media yang berpartisipasi. Perkiraan Schlick digunakan setiap saat:

float schlick( in vec3 v0, in vec3 v1, in float n1, in float n2 )
{
    float f0 = ( n1 - n2 ) / ( n1 + n2 );
    f0 *= f0;   
    return f0 + ( 1 - f0 ) * pow( dot( v0, v1 ), 5 );
} 

Melakukannya seperti ini, maka seseorang dapat menginterpolasi secara linear antara kontribusi difus dan spekuler berdasarkan istilah fresnel, misalnya

float fresnel = schlick( L, H, 1.0002926 /*air*/, 1.5191 /*other material*/ );
vec3 color = mix( diffuseContrib, specularContrib, fresnel );

Dalam makalah, penulis menyatakan bahwa pendekatan ini tidak benar - karena pada dasarnya hanya menggelapkan warna specular setiap kali L sejajar atau hampir sejajar dengan H - dan bahwa alih-alih menghitung f0 berdasarkan indeks bias, Anda harus memperlakukan specular warna itu sendiri sebagai f0 dan minta pendekatan schlick Anda menghitung vec3, seperti ini:

vec3 schlick( in vec3 v0, in vec3 v1, in vec3 spec )
{
    return spec + ( vec3( 1.0 ) - spec ) * pow( dot( v0, v1 ), 5 );
}

Ini menghasilkan warna specular menuju putih pada sudut pandang.

Sekarang pertanyaan saya adalah, bagaimana saya memperkenalkan komponen difus ke dalam ini? Pada 90 ° kontribusi specular sepenuhnya putih, ini berarti semua cahaya yang masuk dipantulkan, sehingga tidak mungkin ada kontribusi difus. Untuk sudut datang <90 °, dapatkah saya mengalikan seluruh bagian difus dengan (vec3 (1) - schlick), yaitu proporsi cahaya yang tidak dipantulkan?

vec3 diffuseContrib = max( dot( N, L ), 0.0 ) * kDiffuse * ( vec3( 1.0 ) - schlick( L, H, kSpec ) );

Atau apakah saya memerlukan pendekatan yang sama sekali berbeda?

permata
sumber
2
Apakah Anda pernah memecahkan ini? Saya mengalami masalah ini sekarang.
1
Saya ingin jawaban untuk itu juga. Lagarde telah menyarankan subraksi serupa dari warna specular juga (bahwa ia akhirnya "tidak menggunakan") tetapi ini semua tampaknya sangat sewenang-wenang.
v.oddou

Jawaban:

1

Jawaban singkatnya:

Apakah terlihat cukup baik?

  • Ya - Simpan itu.

  • Tidak - Mainkan lagi.

Jawaban panjang:

Mendapatkan naungan fisik yang realistis dan akurat membutuhkan daya GPU lebih dari yang mungkin, Anda harus selalu berpura-pura melakukan hal-hal sederhana karena komputer tidak dapat mensimulasikan seluruh alam semesta, bahkan seluruh spektrum cahaya yang terlihat.

Ini adalah "lembah luar biasa" dari shading.

Bukan hanya karena pencahayaan dan oklusi ambient tetapi misalnya lingkungan eksternal baik siang dan bulan memiliki sejumlah besar cahaya spektrum UV yang sedikit yang akan kembali ke spektrum yang terlihat oleh berbagai bahan, kebanyakan yang organik. Berbagai jenis lampu tabung neon dan HID juga memancarkan jumlah sinar UV yang baik.

Efeknya halus tetapi berkat evolusi selama bertahun-tahun otak secara naluriah memprosesnya karena ini berarti perbedaan antara makanan yang baik dan mungkin kematian yang sangat menyiksa jadi jika ada sesuatu yang sangat-sedikit-keluar dari otak kita terdengar alarm "ada yang salah" .

Gaya seni kartun, tidak realistis, dan hampir realistis-tapi-sengaja-off-oleh-margin yang baik (misalnya: Halo) menghindari masalah ini.

Masalah lain adalah bahwa tidak ada dua manusia yang memiliki kehadiran reseptor RYGBL yang sama atau kurva respons sementara monitor ketat RGB dan karenanya tidak dapat mereproduksi gambar dengan sempurna untuk semua manusia. (Merah, Kuning, Hijau, Biru, dan Luma, lihat Tetrachromacy - http://en.wikipedia.org/wiki/Tetrachromacy )

Tidak peduli seberapa keras Anda bekerja, akan ada "sesuatu yang salah" dengan itu dan ruang untuk perbaikan, setidaknya untuk seseorang di suatu tempat.

Dan ini adalah salah satu alasan mengapa ada begitu banyak model bayangan.

Karena semua ini, seorang seniman yang baik selalu berakhir dengan menipu tingkat cahaya dan respons cahaya pada lingkungan sampai tingkat tertentu untuk mencapai hasil "cukup baik" (tidak pernah sempurna), hanya memberi mereka akses untuk bermain-main dengan pengaturan dan menipu cara mereka untuk hasil yang menyenangkan.

Stephane Hockenhull
sumber
Ada terlalu banyak penelitian di bidang ini untuk memberikan jawaban seperti itu.
Tara
@Tara, selamat datang di Stack Exchange. Saya yakin bahwa dengan semua "terlalu banyak penelitian di bidang ini" Anda akan meluangkan waktu untuk menulis non-"non-jawaban" yang tepat dan berkontribusi untuk masyarakat daripada hanya komentar satu baris. Ada tombol kecil pada halaman ini yang bertuliskan "Tambahkan Jawaban Lain" jika Anda dapat menemukannya. Mungkin perlu sedikit riset untuk menemukannya tetapi ada di sana.
Stephane Hockenhull
Wow, bagaimana pasif-agresifnya. Saya tidak mengatakan saya tahu lebih baik. Saya bilang saya tahu ada banyak penelitian di luar sana yang mencoba mengatasi masalah ini dengan tidak hanya "melakukan apa saja" dan terus bersinggungan dengan otak dan kematian manusia.
Tara
Saya masih tidak melihat jawaban baru selain dari itu "non-jawaban" 2014 dan satu-baris, tidak konstruktif, komentar agresif aktif diposting 5 tahun kemudian. Anda 100% dipersilakan untuk mengambil semua penelitian itu (yang sejauh ini Anda berikan nol tautan, hanya komentar satu baris) yang sangat cocok untuk mesin gim real-time dan meluangkan waktu untuk merangkumnya menjadi jawaban yang tepat.
Stephane Hockenhull
Saya baik-baik saja, terima kasih. Saya sudah menurunkan pertanyaan dan menambahkan komentar awal saya untuk menjelaskan mengapa saya melakukannya, karena orang tidak suka downvotes yang tidak dapat dijelaskan.
Tara