Blinn-Fong aks ettirish modeli - Blinn–Phong reflection model

The Blinn-Fong aks ettirish modeli, shuningdek o'zgartirilgan Phong aks ettirish modeli, tomonidan ishlab chiqilgan modifikatsiyadir Jim Blinn uchun Fonni aks ettirish modeli.[1]

Blinn-Phong - ishlatilgan standart soyalash modeli OpenGL va Direct3D (Direct3D 10 va OpenGL 3.1 dan oldin) belgilangan funktsiyali quvur liniyasi va har bir tepada, u pastga tushganda amalga oshiriladi grafik quvur liniyasi; piksel tepaliklar orasidagi qiymatlar interpolyatsiya qilinadi Goura soyasi sukut bo'yicha emas, balki hisoblash uchun qimmatroq Fonni soyalash.[2]

Tavsif

Phong va Blinn-Phong soyalarini hisoblash vektorlari

Fonni soyalashda doimo doimiy ravishda qayta hisoblash kerak nuqta mahsuloti tomoshabin o'rtasida (V) va yorug'lik manbasidan nur (L) aks ettirilgan (R) yuzada.

Agar uning o'rniga a ni hisoblasa yarim vektor tomoshabin va yorug'lik manbalari vektorlari o'rtasida,

bilan almashtirilishi mumkin , qayerda bo'ladi normallashtirilgan sirt normal. Yuqoridagi tenglamada, va ikkalasi ham normalizatsiya qilingan vektorlar va - bu tenglamaning echimi qayerda bo'ladi Uy egalarining matritsasi giperplanesdagi kelib chiqishni o'z ichiga olgan va normalga ega bo'lgan nuqtani aks ettiradi

Ushbu nuqta hosilasi, agar Phong ning nuqta mahsuloti bilan ifodalangan burchakning yarmiga teng bo'lgan burchak kosinusini ifodalaydi V, L, N va R barchasi bir tekislikda yotadi. Vektorlar bir tekislikda yotmasa, ayniqsa burchaklar kichik bo'lsa, burchaklar orasidagi bu bog'liqlik taxminan to'g'ri bo'ladi. Orasidagi burchak N va H shuning uchun ba'zan yarim burchak deyiladi.

Yarim vektor va normal sirt orasidagi burchak orasidagi burchakdan kichikroq bo'lishi mumkinligini hisobga olsak R va V Phong modelida ishlatilgan (agar sirt juda katta burchakka qaralmasa), va Phong foydalanayotganligi sababli an ko'rsatkich o'rnatilishi mumkin shu kabi oldingi iboraga yaqinroq.

Old tomondan yoritilgan yuzalar uchun (tomoshabinga qaragan yuzalardagi spekulyar akslar), tegishli Phong aks ettirishlariga juda mos keladigan spektaklli voqealarga olib keladi. Biroq, Fong aksi tekis sirt uchun har doim yumaloq bo'lsa, sirtni tik burchak bilan ko'rganda, Blinn-Fong akslari elliptik bo'ladi. Buni quyosh ufqqa yaqin dengizda aks etganda yoki uzoqdagi ko'cha yorug'ligi ho'l qoplamada aks etadigan holat bilan taqqoslash mumkin, bu erda aks ettirish har doim gorizontalga qaraganda vertikal ravishda ancha kengayadi.[3]

Vizual taqqoslash: Blinn-Phong yoritgichlari bir xil ko'rsatkichga ega bo'lgan Phong-dan kattaroq, ammo ko'rsatkichni pasaytirib, ular deyarli tenglashishi mumkin.

Bundan tashqari, uni Phong modeliga yaqinlashish deb hisoblash mumkin bo'lsa-da, u aniqroq empirik tarzda aniqlangan modellarni ishlab chiqaradi. aks ettirishning ikki tomonlama tarqatish funktsiyalari fonning ko'p turlari uchun.[4]

Samaradorlik

Blinn-Fon Phongga qaraganda tezroq bo'ladi, agar tomoshabin va yorug'lik juda yaqin bo'lsa, masalan, yaqinlashish yoki cheksizlik. Bu yo'naltirilgan chiroqlar va orfografik / izometrik kameralar uchun holat. Bu holda, yarim vektor pozitsiyadan va sirt egriligidan mustaqildir, chunki yarim vektor tomoshabinning pozitsiyasiga va yorug'lik pozitsiyasiga yo'nalishga bog'liq bo'lib, bu alohida masofada yaqinlashadi, shuning uchun yarim vektor deb o'ylash mumkin bu holda doimiy ravishda. shuning uchun har bir yorug'lik uchun bir marta hisoblash mumkin, keyin butun ramka uchun ishlatilishi mumkin, yoki haqiqatan ham yorug'lik va nuqtai nazar bir xil nisbiy holatda qoladi. Fonning sirt egriligiga bog'liq bo'lgan va tasvirning har bir pikseliga (yoki vertikal yoritish holatida modelning har bir uchi uchun) qayta hisoblanishi kerak bo'lgan aks ettirish vektoridan foydalanish usuli bilan bir xil emas. Perspektivli kameralar bo'lgan 3D sahnalarda bu optimallashtirish mumkin emas.

Kod namunalari

Yuqori darajadagi soyalash tili kodining namunasi

Ushbu namuna Yuqori darajadagi soya tili diffuz va ko'zoynakli nurni nuqta nuridan aniqlash usuli. Yorug'lik strukturasi, sirt kosmosidagi holati, ko'rish yo'nalishi vektori va sirtning normal holati o'tadi. Yoritgich tuzilishi qaytarildi;

Quyida, shuningdek, salbiy javoblar bo'lsa, ba'zi bir nuqta mahsulotlarini nolga mahkamlash kerak. Bu holda, kameradan uzoqlashayotgan yorug'lik, unga qaragan yorug'lik kabi qaraladi. Spekulyativ hisoblash uchun ob'ektning chekkalariga va kameradan uzoqlashayotgan nurning noto'g'ri "halo" si yorug'lik to'g'ridan-to'g'ri kameraga aks etganidek yorqin ko'rinishi mumkin.

tuzilmaviy Yoritish{    suzuvchi3 Tarqoq;    suzuvchi3 Maxsus;};tuzilmaviy PointLight{	suzuvchi3 pozitsiya;	suzuvchi3 diffuz rang;	suzmoq  tarqalgan kuch;	suzuvchi3 specularColor;	suzmoq  specularPower;};Yoritish GetPointLight(PointLight yorug'lik, suzuvchi3 pos3D, suzuvchi3 viewDir, suzuvchi3 normal){	Yoritish Chiqdi;	agar (yorug'lik.tarqalgan kuch > 0)	{		suzuvchi3 nurDir = yorug'lik.pozitsiya - pos3D; // Sirt kosmosidagi 3D holat		suzmoq masofa = uzunlik(nurDir);		nurDir = nurDir / masofa; // = normallashtirish (lightDir);		masofa = masofa * masofa; // Ushbu satr teskari kvadrat ildiz yordamida optimallashtirilishi mumkin		// Tarqalgan yorug'likning intensivligi. 0-1 oralig'ida bo'lish uchun to'yingan.		suzmoq NdotL = nuqta(normal, nurDir);		suzmoq intensivlik = to'yingan(NdotL);		// Ochiq rang, kuch va susayishdagi diffuz yorug'lik faktoringini hisoblang		Chiqdi.Tarqoq = intensivlik * yorug'lik.diffuz rang * yorug'lik.tarqalgan kuch / masofa;		// Yorug'lik vektori va ko'rish vektori orasidagi yarim vektorni hisoblang.		// Bu odatda haqiqiy aks ettirish vektorini hisoblashdan sekinroq		// normalizatsiya funktsiyasining o'zaro kvadratik ildizi tufayli		suzuvchi3 H = normallashtirish(nur + viewDir);		// Spekulyar yorug'likning intensivligi		suzmoq NdotH = nuqta(normal, H);		intensivlik = kuch(to'yingan(NdotH), ko'zoynak qattiqligi);		// Spekulyar yorug'lik faktoringini sarhisob qiling		Chiqdi.Maxsus = intensivlik * yorug'lik.specularColor * yorug'lik.specularPower / masofa; 	}	qaytish Chiqdi;}

OpenGL Shading Language kod namunasi

Ushbu namuna OpenGL soyalash tili ikkita kodli fayllardan yoki shaderlar. Birinchisi, deyiladi vertex shader va asboblar Fonni soyalash, bu tepaliklar orasidagi normal sirtni interpolatsiya qilish uchun ishlatiladi. Ikkinchi shader deb ataladi parcha shader va nuqta yorug'lik manbasidan tarqalgan va ko'zoynakli yorug'likni aniqlash uchun Blinn-Phong soyalash modelini amalga oshiradi.

Vertex shader

Ushbu vertikal shader amalga oshiradi Fonni soyalash:

xususiyat vec3 inputPosition;xususiyat vec2 inputTexCoord;xususiyat vec3 kiritishNormal;bir xil mat4 proektsiya, model ko'rinishi, normalMat;turli xil vec3 normalInterp;turli xil vec3 vertPos;bekor asosiy() {    gl_Position = proektsiya * model ko'rinishi * vec4(inputPosition, 1.0);    vec4 vertPos4 = model ko'rinishi * vec4(inputPosition, 1.0);    vertPos = vec3(vertPos4) / vertPos4.w;    normalInterp = vec3(normalMat * vec4(kiritishNormal, 0.0));}

Parcha shader

Ushbu fragment shader Blinn-Phong soyalash modelini amalga oshiradi[5] va gamma tuzatish:

aniqlik vositachilik suzmoq;yilda vec3 normalInterp;yilda vec3 vertPos;bir xil int rejimi;konst vec3 lightPos = vec3(1.0, 1.0, 1.0);konst vec3 lightColor = vec3(1.0, 1.0, 1.0);konst suzmoq yorug'lik kuchi = 40.0;konst vec3 ambientColor = vec3(0.1, 0.0, 0.0);konst vec3 diffuz rang = vec3(0.5, 0.0, 0.0);konst vec3 specColor = vec3(1.0, 1.0, 1.0);konst suzmoq yorqinlik = 16.0;konst suzmoq ekranGamma = 2.2; // Monitor sRGB rang oralig'iga sozlangan deb taxmin qilingbekor asosiy() {  vec3 normal = normallashtirish(normalInterp);  vec3 nurDir = lightPos - vertPos;  suzmoq masofa = uzunlik(nurDir);  masofa = masofa * masofa;  nurDir = normallashtirish(nurDir);  suzmoq lambertian = maksimal(nuqta(nurDir, normal), 0.0);  suzmoq ko'zoynakli = 0.0;  agar (lambertian > 0.0) {    vec3 viewDir = normallashtirish(-vertPos);    // bu blinn fon    vec3 yarim = normallashtirish(nurDir + viewDir);    suzmoq specAngle = maksimal(nuqta(yarim, normal), 0.0);    ko'zoynakli = kuch(specAngle, yorqinlik);           // bu fon (taqqoslash uchun)    agar (rejimi == 2) {      vec3 aks ettirish = aks ettirish(-nurDir, normal);      specAngle = maksimal(nuqta(aks ettirish, viewDir), 0.0);      // bu erda ko'rsatkich ko'rsatkichi boshqacha ekanligiga e'tibor bering      ko'zoynakli = kuch(specAngle, yorqinlik/4.0);    }  }  vec3 rangLinear = ambientColor +                     diffuz rang * lambertian * lightColor * yorug'lik kuchi / masofa +                     specColor * ko'zoynakli * lightColor * yorug'lik kuchi / masofa;  // gamma tuzatishni qo'llang (ambientColor, diffuseColor va specColor deb hisoblang  // chiziqli qilingan, ya'ni ularda gamma tuzatish yo'q)  vec3 rangGammaTuzatilgan = kuch(rangLinear, vec3(1.0 / ekranGamma));  // fragmentda gamma tuzatilgan rangdan foydalaning  gl_FragColor = vec4(rangGammaTuzatilgan, 1.0);}

Ranglar ambientColor, diffuz rang va specColor bo'lmasligi kerak gamma tuzatildi. Agar ular gamma-tuzatilgan rasm fayllaridan olingan ranglar bo'lsa (JPEG, PNG va hokazo.), ular bilan ishlashdan oldin ular chiziqli bo'lishi kerak, bu kanal qiymatlarini diapazonga masshtablash orqali amalga oshiriladi. [0, 1] va ularni tasvirning gamma qiymatiga ko'tarish, bu tasvirdagi tasvirlar uchun sRGB rang maydoni taxminan 2,2 deb taxmin qilinishi mumkin (garchi bu o'ziga xos rang maydoni uchun oddiy quvvat munosabati faqat haqiqiyga yaqinlashish bo'lsa) transformatsiya ). Zamonaviy grafikalar API-lar a dan namuna olganda ushbu gamma tuzatishni avtomatik ravishda amalga oshirish qobiliyatiga ega to'qima yoki a-ga yozish ramka buferi.[6]

Shuningdek qarang

Adabiyotlar

  1. ^ Jeyms F. Blinn (1977). "Kompyuterda sintez qilingan rasmlar uchun yorug'likni aks ettirish modellari". Proc. Kompyuter grafikasi va interaktiv metodlar bo'yicha 4 yillik konferentsiya: 192–198. CiteSeerX  10.1.1.131.7741. doi:10.1145/563858.563893.
  2. ^ Shrayner, Deyv; Khronos OpenGL ARB ishchi guruhi (2010). "Yoritish matematikasi". OpenGL dasturlash bo'yicha qo'llanma: OpenGL, 3.0 va 3.1 versiyalarini o'rganish bo'yicha rasmiy qo'llanma (7-nashr). Pearson Education, Inc. 240-245 betlar. ISBN  978-0-321-55262-4.
  3. ^ Krus, Kristofer (2014), Dengiz holatini simulyatsiya qilish uchun to'lqinli model va suv transporti modeli, Linköping universiteti, p. 97
  4. ^ Ngan, Addi; Durand, Fredo; Matusik, Voytsex (2004). "BRDF analitik modellarining eksperimental tekshiruvi". ACM SIGGRAPH 2004 eskizlari - SIGGRAPH '04. ACM tugmachasini bosing. doi:10.1145/1186223.1186336. Olingan 23 aprel 2019.
  5. ^ "WebGL misoli: Phong / Blinn Phong Shading". www.mathematik.uni-marburg.de. Olingan 2019-09-13.
  6. ^ https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_framebuffer_sRGB.txt