Perbedaan antara Material dan Shader


27

Dalam permainan, materi seringkali hanya memengaruhi tampilan visual objek. Tampilan visual dipengaruhi oleh shader. Jadi terkait dengan terminologi, apakah ada perbedaan antara bahan dan shader? Haruskah Anda menulis satu shader untuk satu bahan?


1
Saya telah melihat beberapa mesin di mana bahan adalah shader + tekstur difus + bumpmap, tapi saya tidak berpikir ada satu definisi ringkas.
Roy T.

3
@ Roy. Mesin-mesin itu akan menyalahgunakan terminologi. Sebuah materi tidak setara dengan shader - shader adalah program yang , suatu bahan adalah sekelompok nilai data. 2 program shader yang berbeda dapat membuat materi yang sama dan mendapatkan hasil yang berbeda.
bobobobo

@obobobo Atau lebih umum, shader tunggal akan digunakan untuk membuat banyak bahan, dengan cara menghubungkannya dengan tekstur yang berbeda, nilai parameter dan semacamnya.
Nathan Reed

Jawaban:


29

Materi adalah kombinasi atribut yang menggambarkan bagaimana permukaan material yang diberikan akan terlihat.

Beberapa mesin menggunakan shader yang berbeda untuk material yang berbeda, dalam hal ini definisi material dapat terlihat seperti ini:

[Material]
Shader=NormalMappedSpecular.glsl
Texture1=Rock.png
Texture2=RockNormal.png
Texture3=RockSpecular.png

Mesin lain menggunakan satu shader untuk semua objek (atau lebih tepatnya mesin memutuskan shader apa yang akan digunakan tergantung pada parameter, kemampuan GPU dan faktor-faktor lain seperti jarak), dalam hal ini bahan akan terlihat lebih seperti ini:

[Material]
Ambient=0.5
Specularity=0.7
DiffuseMap=Rock.png
NormalMap=RockNormal.png
SpecularMap=RockSpecular.png

2
tidak bisakah seseorang memperluas definisi suatu materi ke setiap indera yang didukung oleh mesin game? Misalnya, suara yang akan dihasilkan material saat dipukul, diinjak, dll., Atau parameter gesekannya?
didierc

10

Sebuah bahan menspesifikasikan bagaimana suatu objek merespon cahaya.

Ada beberapa parameter umum:

  • Kd: Respons difus terhadap cahaya
  • Ks: Respons khusus terhadap cahaya
  • Ns: "Shininess"
  • map_Kd: Tekstur

Sekarang katakan Anda memiliki segitiga yang dirender dengan material M. Mmemiliki Kd = (1,0,0) (respons difus merah), Ks = (1,1,1) (respons specular putih), Ns = 25 (sorotan specular akan cukup tajam dan tidak kabur) dan tidak ada map_Kd ( tidak ada tekstur).

Tugas shader adalah menggunakan matematika untuk mengambil posisi puncak segitiga , posisi cahaya, nilai warna material, dan mencari tahu warna apa yang harus ditampilkan segitiga. Vertex shader melakukan "perhitungan bayangan" ini satu kali pada setiap titik dan menginterpolasi warna melintasi segitiga.

Operasi umum dalam shader untuk menghitung respons difus pada titik adalah:

// hlsl
float3 vertexToLight = normalize( lightPos.xyz - vertexPos.xyz ) ;

float3 diffuseColor = max( dot( vertexToLight, vertexNormal ), 0.0 ) * kd * lightColor ;

3

Materi adalah apa yang Anda terapkan pada geometri untuk memberinya warna dan pola. Tekstur adalah komponen dari suatu bahan.

Shader adalah program kecil yang memungkinkan materi ini dirender saat runtime. Hal yang menyenangkan tentang shader adalah Anda dapat melakukan semuanya mulai dari sekadar merender bahan, hingga menambahkan efek dinamis seperti sorotan specular dan refleksi hingga ke hal-hal yang sangat pintar seperti merender lubang palsu melalui dinding tempat peluru terkena.

jadi dalam menjawab pertanyaan Anda - ya ada perbedaan, ada sedikit tumpang tindih juga - Anda bisa membuat bahan merah atau menulis shader untuk membuat hal-hal menjadi merah, tetapi keduanya juga memungkinkan Anda untuk banyak hal yang Anda tidak bisa dengan yang lain.

dan tidak, Anda tidak perlu satu shader per bahan. meskipun suatu material membutuhkan shader untuk dirender, Anda bisa memiliki satu untuk semua materi Anda jika Anda mau. mereka melakukan hal-hal tertentu jadi jika Anda ingin semuanya mengkilap misalnya, Anda bisa menulisnya.

Sebuah contoh yang bagus tentang shader ada di roda gigi perang. ada satu set bahan untuk adegan itu, tetapi ketika Anda menekan tombol untuk beralih ke tampilan taktis, shader yang membuat materi ini berubah sehingga hal-hal terlihat diuraikan dan umumnya berbeda. Hal yang sama terjadi pada batman: 'mode detektif' Arkarkham.


1
Secara teknis, tekstur sebenarnya bukan bahan itu sendiri, itu biasanya bagian dari bahan.
bobobobo

1

Meski terlambat, ada "cheat" yang bisa membantu Anda memahami lebih baik.

Materi adalah segala sesuatu yang melekat pada shader tertentu untuk panggilan draw itu.

Misalnya, dalam jawaban di atas, Anda memiliki bahan ini: [Bahan] Shader = NormalMappedSpecular.glsl Texture1 = Rock.png Texture2 = RockNormal.png Texture3 = RockSpecular.png

yang menerjemahkan bahwa Anda akan merender dengan shader yang melakukan peta normal dan perhitungan specular, dan itu akan menggunakan 3 tekstur di dalam shader itu.

Kemudian, Anda dapat menggunakan kembali shader yang sama, dengan 3 tekstur berbeda lainnya (seperti mobil, carNormal, dan carSpecular), Anda akan melakukan draw draw yang berbeda dengan material yang berbeda, hanya karena Anda mengubah parameter shader.

Secara keseluruhan, materi adalah segala sesuatu yang secara unik membuat panggilan draw menggunakan shader yang sama dengan parameter yang sama (tekstur, seragam, atribut).

Saya harap ini membantu memvisualisasikannya dengan lebih baik


apakah itu sesuatu seperti: shader adalah kelas, tetapi materi adalah contohnya?
Bengalaa
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.