Mencoba memahami cahaya pada Opengl, bagaimana cara mensimulasikan cahaya matahari yang realistis?

13

Saya tidak tahu apakah saya melakukan sesuatu yang salah atau melewatkan sesuatu tetapi saya ingin mensimulasikan cahaya matahari, seperti di hari yang cerah.

Ketika objek menghadap cahaya directional, itu menyala dengan baik dan tidak ada masalah di sana. Jika saya berkeliling objek dan melihat kembali, itu gelap. Tidak terlalu gelap karena saya menggunakan GL_AMBIENTtetapi masih terlalu gelap untuk hari yang cerah. Jika saya meningkatkan nilainya, itu tidak akan pernah terlihat lebih baik karena sisi objek yang menghadap cahaya akan terlalu terang.

Dan ada masalah lain yang mengganggu dengan cahaya sekitar, ketika melihat bagian belakang objek, saya tidak bisa melihat bentuk apa pun, hanya warna polos. Sulit dijelaskan, berikut beberapa gambar:

Obyek Depan: http://i.stack.imgur.com/YW53X.png
Objek Kembali: http://i.stack.imgur.com/Qufha.png

Seperti yang dapat Anda lihat dengan mudah, sisi depan terlihat bagus, Anda dapat melihat bentuk benda merah itu. Di sisi belakang, polos, Anda tidak bisa melihat bentuk yang sama.

Sekarang, saya tahu bahwa saya melihat bagian belakang sebuah objek dan saya melihat ke arah cahaya dan itu harus lebih gelap daripada sisi depan. Tapi seharusnya tidak terlihat begitu polos seperti ini. Bukan itu yang kita lihat ketika melawan cahaya matahari melihat beberapa objek, kita melihat bahwa objek membentuk beberapa bentuk.

Bagaimana saya dapat memiliki efek yang sama (atau serupa) pada OpenGL?

Cahaya saya saat ini didefinisikan seperti ini:

float posLight0[4] = {-1.0f, 1.0f, 1.0f, 0.0f};
float ambLight0[4] = {0.5f, 0.5f, 0.5f, 0.5f};

glLightfv(GL_LIGHT0, GL_POSITION, posLight0);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambLight0);
rfgamaral
sumber
Saya sarankan agar Anda mempertimbangkan untuk menggunakan shader, jika memungkinkan. Pipeline fungsi tetap OpenGL menggunakan model pencahayaan yang cukup sederhana, sedangkan shader memberi Anda kendali penuh atas matematika.
Biksu Luar Biasa

Jawaban:

11

Dengan cahaya sekitar objek Anda tampak terlalu terang karena cahaya difus ditambahkan ke cahaya sekitar, dan cahaya difus standar ke 1.0. Ini menambahkan hingga 1,5, dan semua yang di atas 1,0 dijepit. Atur cahaya difus ke 0,5:

float difLight0[4] = {0.5f, 0.5f, 0.5f, 1.0f};
glLightfv(GL_LIGHT0, GL_DIFFUSE, difLight0);

Masalah kedua lebih sulit untuk dipecahkan. Anda dapat mencoba menambahkan beberapa detail halus ke permukaan seperti tekstur atau benjolan peta. Di OpenGL cahaya ambient konstan, tetapi di dunia nyata tidak pernah demikian. Untuk mensimulasikan dunia nyata, beberapa bentuk solusi penerangan global diperlukan. Ambient occlusion sangat membantu di sini, tetapi lebih sulit untuk diterapkan daripada hanya mengatur status OpenGL. Anda dapat memanggang oklusi ambien ke simpul model Anda di perangkat lunak pemodelan 3D Anda atau menggunakan SSAO , tetapi saya tidak akan menjelaskan detailnya.

Yang dapat Anda lakukan dengan mudah adalah menambahkan sumber cahaya redup lain dari beberapa arah lain (mis. Arah berlawanan). Ini tidak akan realistis, tetapi setidaknya itu akan memberikan bentuk untuk sisi belakang objek Anda juga.

Juga pertimbangkan untuk menambahkan highlight specular ke aplikasi Anda. Itu akan membuat benda mengkilap.

float specLight0[4] = {0.5f, 0.5f, 0.5f, 1.0f};
glLightfv(GL_LIGHT0, GL_SPECULAR, specLight0);
glMaterialfv(GL_FRONT, GL_SHININESS, 10.0f); // Shininess between 0 and 128

Anda juga dapat menentukan warna terang dan material secara terpisah, terutama jika standarnya tidak sesuai untuk Anda.

msell
sumber
Jadi tidak ada cara sederhana dan langsung untuk melakukan apa yang saya inginkan di OpengGL ... Sayang sekali. Mungkin saya akan mencoba menambahkan sumber cahaya lain, tetapi bagaimana cara menentukan intensitas cahaya?
rfgamaral
The GL_SPECULARdan GL_SHININESStampaknya tidak menghasilkan efek apapun meskipun ... saya lakukan perubahan glMaterialfvuntuk glMaterialikarena tidak kompilasi. Dan juga mencoba nilai yang lebih besar seperti 128. Kelihatannya sama dengan saya ... Mungkin masalahnya ada pada model saya yang dimuat (obj / mtl), harus melihat.
rfgamaral
1
@Nazgulled Hanya memeriksa bahwa specular light0 default ke 1.0, tetapi material specular default ke 0.0. Jadi ubah glLightfv (GL_LIGHT0, GL_SPECULAR, specLight0); untuk glMaterialfv (GL_FRONT, GL_SPECULAR, specLight0); Juga baik untuk mengatur glLightModeli (GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); atau specular mungkin salah dihitung saat kamera berputar.
msell
1
@Nazgulled Untuk cahaya sekunder, atur ambient dan specular ke nol dan beberapa nilai kecil seperti 0,2 untuk difus. Anda juga dapat mengatur ambient semua lampu menjadi nol dan menggunakan ambient global dengan GL_LIGHT_MODEL_AMBIENT sebagai gantinya.
msell
2

Cahaya ambient OpenGL adalah satu warna, tetapi cahaya sekitar di dunia nyata biasanya lebih terang dari atas dan lebih gelap dari bawah. Anda dapat memperkirakan ini di OpenGL dengan mengatur cahaya sekitar menjadi biru sangat gelap, dan menambahkan cahaya arah biru tua mengarah ke bawah. Itu, ditambah cahaya arah putih terang yang datang dari mana pun matahari berada, dapat mendekati cahaya luar dengan cukup baik.

Apa yang benar-benar harus Anda lakukan adalah menulis shader yang menghitung cahaya per piksel, tetapi untuk sampai ke sana dari mana Anda akan mengambil sedikit waktu.

bmcnett
sumber
1

Jawaban yang Anda dapatkan di sini cukup bagus. Hanya satu tambahan. Setelah Anda menginginkannya lebih bagus, coba terapkan hamburan atmosfer

Notabene
sumber