នៅក្នុងមេរៀននេះ យើងនឹងរៀនពីរបៀបបន្លិច និងដាក់ស្រមោលគំរូ 3D របស់យើង។ នេះគឺជាបញ្ជីនៃអ្វីដែលយើងនឹងរៀន៖
នៅក្នុងពាក្យផ្សេងទៀត, ភ្លើងបំភ្លឺជាមូលដ្ឋានខ្លាំងណាស់និងការដាក់ស្រមោល។
ធម្មតាទៅត្រីកោណគឺវ៉ិចទ័រឯកតាដែលតម្រង់កាត់កែងទៅត្រីកោណ។ ធម្មតាត្រូវបានគណនាយ៉ាងសាមញ្ញដោយប្រើផលិតផលឈើឆ្កាងនៃជ្រុងពីរនៃត្រីកោណ (ប្រសិនបើអ្នកចាំថាផលិតផលឈើឆ្កាងនៃវ៉ិចទ័រពីរផ្តល់ឱ្យយើងនូវវ៉ិចទ័រកាត់កែងទៅទាំងពីរ) និងធ្វើឱ្យធម្មតា: ប្រវែងរបស់វាត្រូវបានកំណត់ទៅមួយ។
នេះគឺជា pseudocode សម្រាប់ការគណនាធម្មតា៖
ត្រីកោណ (v1, v2, v3)
side1 = v2-v1
side2 = v3-v1
triangle.normal = vectProduct(side1, side2).normalize()
vertex v1, v2, v3, ....
ត្រីកោណ tr1, tr2, tr3 // ពួកគេទាំងអស់ប្រើ vertex v1
v1.normal = normalize(tr1.normal + tr2.normal + tr3.normal)
Gluint normalbuffer;
glGenBuffers(1, &normalbuffer);
glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(glm::vec3), &normals, GL_STATIC_DRAW);
// បណ្តុំគុណលក្ខណៈទីបី៖ ធម្មតា។
glEnableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, normalbuffer);
glVertexAttribPointer(
2,
//
គុណលក្ខណៈ
3,
//
ទំហំ
GL_FLOAT, //ប្រភេទ
GL_FALSE // ធម្មតា?
0, // ជំហាន
(មោឃៈ*) ០ // អុហ្វសិតសតិបណ្ដោះអាសន្ន
);
ហើយនេះគឺគ្រប់គ្រាន់ដើម្បីចាប់ផ្តើម៖
បន្ទាប់ពីធ្នឹមធ្លាក់ ផ្ទៃឆ្លុះបញ្ចាំងពីពន្លឺខុសគ្នា អាស្រ័យលើមុំដែលធ្នឹមប៉ះនឹងផ្ទៃ។ ប្រសិនបើធ្នឹមធ្លាក់កាត់កែងទៅនឹងផ្ទៃ នោះវាត្រូវបានប្រមូលផ្តុំលើផ្ទៃតូចមួយ ប្រសិនបើ tangential វាត្រូវបានរាយប៉ាយលើផ្ទៃធំជាងនេះ៖
តាមទស្សនវិស័យក្រាហ្វិកកុំព្យូទ័រ ពណ៌នៃភីកសែលគឺពឹងផ្អែកយ៉ាងខ្លាំងទៅលើភាពខុសគ្នារវាងមុំទិសដៅពន្លឺ និងផ្ទៃធម្មតា។
//
//
float cosTheta = dot(n,l);
នៅក្នុងកូដនេះ "n" គឺធម្មតា ហើយ "l" គឺជាវ៉ិចទ័រឯកតាដែលចេញពីផ្ទៃទៅប្រភពពន្លឺ (មិនផ្ទុយមកវិញទេ ទោះបីជាវាហាក់ដូចជាមានការយល់ច្រឡំក៏ដោយ)
// កូស៊ីនុសនៃមុំរវាងធម្មតា និងទិសដៅនៃពន្លឺ
//
1 - ប្រសិនបើពន្លឺកាត់កែងទៅត្រីកោណ
//
0 - ប្រសិនបើពន្លឺគឺស្របទៅនឹងត្រីកោណ
// 0 — ប្រសិនបើពន្លឺស្ថិតនៅខាងក្រោយត្រីកោណ
float cosTheta = ការគៀប(dot(n,l), 0.1);
color = LightColor * cosTheta;
យើងអាចយកគំរូតាមការគុណសាមញ្ញ៖
color = MaterialDiffuseColor * LightColor * cosTheta;
ជាមួយនឹងប្រភពពន្លឺបែបនេះ កម្រិតនៃការបំភ្លឺលើផ្ទៃនឹងអាស្រ័យលើចម្ងាយទៅកាន់ប្រភពពន្លឺ៖ កាន់តែឆ្ងាយ កាន់តែងងឹត។ ភាពអាស្រ័យនេះត្រូវបានគណនាដូចខាងក្រោមៈ
color = MaterialDiffuseColor * LightColor * cosTheta / (ចម្ងាយ * ចម្ងាយ);
មិនយូរប៉ុន្មានយើងនឹងត្រូវការប៉ារ៉ាម៉ែត្រមួយផ្សេងទៀតដើម្បីគ្រប់គ្រងកម្រិតនៃអាំងតង់ស៊ីតេពន្លឺ - ពណ៌នៃពន្លឺប៉ុន្តែសម្រាប់ពេលនេះសូមសន្មតថាយើងមានអំពូលពណ៌សដែលមានថាមពលជាក់លាក់មួយ (ឧទាហរណ៍ 60 វ៉ាត់) ។
color = MaterialDiffuseColor * LightColor * LightPower * cosTheta / (ចម្ងាយ * ចម្ងាយ);
MaterialDiffuseColor - យើងអាចយកវាដោយផ្ទាល់ពីវាយនភាព។
LightColor និង LightPower នឹងត្រូវកំណត់នៅក្នុង Shader ដោយប្រើឯកសណ្ឋាន GLSL។
CosTheta នឹងអាស្រ័យលើវ៉ិចទ័រ n និង l ។ វាអាចត្រូវបានគណនាសម្រាប់ចន្លោះណាមួយមុំនឹងដូចគ្នា។ យើងនឹងប្រើទំហំកាមេរ៉ាព្រោះវាងាយស្រួលណាស់ក្នុងការគណនាទីតាំងនៃប្រភពពន្លឺ៖
// បំណែកធម្មតានៅក្នុងទំហំកាមេរ៉ា
vec3 n = normalize(Normal_cameraspace);
// ទិសដៅពន្លឺ (ពីបំណែកទៅប្រភពពន្លឺ
vec3 l = normalize(LightDirection_cameraspace);
Normal_cameraspace និង LightDirection_cameraspace ត្រូវបានរាប់នៅក្នុង vertex shader និងផ្ទេរទៅផ្នែក shader សម្រាប់ដំណើរការបន្ថែម៖
// ទីតាំងនៃចំនុចកំពូលក្នុងចន្លោះកាមេរ៉ា៖ ទីតាំង MVP *
gl_ទីតាំង = MVP * vec4(vertexPosition_modelspace,1);
// ទីតាំងនៃចំនុចកំពូលក្នុងលំហពិភពលោក៖
ម
* ទីតាំង
Position_worldspace = (M * vec4(vertexPosition_modelspace,1)).xyz;
// វ៉ិចទ័រដែលមកពីចំនុចកំពូលកាមេរ៉ានៅក្នុងចន្លោះកាមេរ៉ា
// នៅក្នុងចន្លោះកាមេរ៉ា កាមេរ៉ាមានទីតាំងនៅទីតាំង (0,0,0)
វេក
3
ទីតាំង vertex
_
កន្លែងដាក់កាមេរ៉ា
= (
វ
*
ម
*
វេក
4(
ទីតាំង vertex
_
ចន្លោះគំរូ
,1)).
ឆ្នាំ
;
EyeDirection_cameraspace = vec3(0,0,0) - vertexPosition_cameraspace;
// វ៉ិចទ័រដែលចេញពីចំនុចកំពូលទៅប្រភពពន្លឺក្នុងចន្លោះកាមេរ៉ា។
// ម៉ាទ្រីស
ម
បានរំលង ព្រោះវានៅលីវក្នុងចន្លោះនេះ។
vec3 LightPosition_cameraspace = (V *
vec4(LightPosition_worldspace,1)).xyz;
LightDirection_cameraspace = LightPosition_cameraspace +
EyeDirection_cameraspace;
//
ធម្មតា។
កំពូល
វ
លំហ
កាមេរ៉ា
Normal_cameraspace = (V * M * vec4(vertexNormal_modelspace, 0)).xyz; //
នឹង
ការងារ
តែប៉ុណ្ណោះ
វ
កម្រិតសំឡេង
ករណី
,
ពេលណា
ម៉ាទ្រីស
ម៉ូដែល
ទេ។
ការបន្លំ
របស់នាង
ទំហំ
.
នៅក្រឡេកមើលដំបូង កូដអាចហាក់ដូចជាស្មុគស្មាញ និងច្របូកច្របល់ ប៉ុន្តែតាមពិត គ្មានអ្វីថ្មីនៅទីនេះ ដែលមិនមាននៅក្នុងមេរៀនទី 3៖ Matrices។ ខ្ញុំបានព្យាយាមផ្តល់ឈ្មោះដែលមានអត្ថន័យអថេរនីមួយៗ ដើម្បីងាយស្រួលសម្រាប់អ្នកក្នុងការយល់ពីអ្វីដែលកំពុងកើតឡើងនៅទីនេះ និងរបៀប។
ត្រូវប្រាកដថាសាកល្បង !!!
M និង V គឺជាម៉ាទ្រីស Model និង View ដែលត្រូវបានបញ្ជូនទៅក្នុង Shader ក្នុងវិធីដូចគ្នានឹង MVP ចាស់ដ៏ល្អរបស់យើង។
វាហាក់ដូចជាល្អជាងកាលពីមុន ប៉ុន្តែមានច្រើននៅតែបាត់។ បញ្ហាគឺគួរឱ្យកត់សម្គាល់ជាពិសេសជាមួយនឹងផ្នែកដែលមិនមានពន្លឺ។ ផ្នែកខាងក្រោយក្បាលរបស់ស្វា Suzanne របស់យើងគឺខ្មៅទាំងស្រុង (យើងបានប្រើការគៀប())។
ផ្នែកខាងក្រោយនៃក្បាលរបស់ Suzanne មិនគួរមានពណ៌ខ្មៅទាំងស្រុងនោះទេ ព្រោះនៅក្នុងជីវិតពិត ពន្លឺពីចង្កៀងគួរតែធ្លាក់មកលើជញ្ជាំង ជាន់ ពិដាន ត្រូវបានឆ្លុះបញ្ចាំងដោយផ្នែកពីវា និងបំភ្លឺផ្នែកស្រមោលនៃវត្ថុ។
ទោះជាយ៉ាងណាក៏ដោយ នេះមានតម្លៃថ្លៃក្នុងការគណនាខ្លាំងពេកក្នុងការធ្វើក្នុងពេលវេលាជាក់ស្តែង។ នោះហើយជាមូលហេតុដែលយើងនឹងបន្ថែមសមាសភាគថេរមួយចំនួន។ វាហាក់ដូចជាវត្ថុខ្លួនឯងកំពុងបញ្ចេញពន្លឺតិចតួច ដើម្បីកុំឱ្យខ្មៅទាំងស្រុង។
vec3 MaterialAmbientColor = vec3(0.1,0.1,0.1) * MaterialDiffuseColor;
ពណ៌ =
//
បរិយាកាស
ភ្លើងបំភ្លឺ
:
ធ្វើពុត
ដោយប្រយោល។
ភ្លើងបំភ្លឺ
សម្ភារៈបរិយាកាសពណ៌ +
//
សាយភាយ
: "
ពណ៌
"
វត្ថុខ្លួនឯង
MaterialDiffuseColor * LightColor * LightPower * cosTheta /
(ចម្ងាយ * ចម្ងាយ);
ដូចដែលយើងឃើញនៅក្នុងរូបភាព ពន្លឺដែលឆ្លុះបញ្ចាំងបង្កើតជាកន្លែងពន្លឺ។ ក្នុងករណីខ្លះនៅពេលដែលធាតុផ្សំនៃការសាយភាយគឺសូន្យ ចំនុចពន្លឺនេះគឺតូចចង្អៀតខ្លាំងណាស់ (ពន្លឺទាំងអស់ត្រូវបានឆ្លុះបញ្ចាំងទាំងស្រុងក្នុងទិសដៅតែមួយ) ហើយយើងទទួលបានកញ្ចក់មួយ។
(ទោះជាយ៉ាងណាក៏ដោយ ទោះបីជាអ្នកអាចកែប្រែប៉ារ៉ាម៉ែត្រដើម្បីទទួលបានកញ្ចក់ក៏ដោយ ក្នុងករណីរបស់យើងវានឹងគិតតែពីការឆ្លុះបញ្ចាំងពីប្រភពពន្លឺរបស់យើង។ ដូច្នេះវានឹងក្លាយជាកញ្ចក់ចម្លែក)
// មើលវ៉ិចទ័រ (ឆ្ពោះទៅកាមេរ៉ា)
vec3 E = normalize(EyeDirection_cameraspace);
// ទិសដៅដែលត្រីកោណឆ្លុះបញ្ចាំងពីពន្លឺ
វេក
3
រ
=
ឆ្លុះបញ្ចាំង
(-
លីត្រ
,
ន
);
// កូស៊ីនុសនៃមុំរវាងវ៉ិចទ័រសម្លឹង និងវ៉ិចទ័រឆ្លុះបញ្ចាំង កាត់ទៅជា
កោសប្រសិនបើចាំបាច់
//
- មើលដោយផ្ទាល់ទៅការឆ្លុះបញ្ចាំង -> ១
//
- មើលកន្លែងណាមួយក្នុងទិសដៅផ្សេងទៀត ->< 1
អណ្តែត cosAlpha = ការគៀប(ចំនុច(E,R), 0,1);
ពណ៌ =
// ភ្លើងបំភ្លឺបរិយាកាស៖ ក្លែងធ្វើភ្លើងប្រយោល។
សម្ភារៈបរិក្ខារពណ៌
+
//
សាយភាយ
: "
ពណ៌
"
វត្ថុខ្លួនឯង
MaterialDiffuseColor * LightColor * LightPower * cosTheta /
(ចម្ងាយ * ចម្ងាយ);
// ឆ្លុះបញ្ចាំង : ឆ្លុះបញ្ចាំងដូចកញ្ចក់
MaterialSpecularColor * LightColor * LightPower * pow(cosAlpha,5) /
នៅក្នុងមេរៀនបន្ទាប់ យើងនឹងពិនិត្យមើលពីរបៀបដែលយើងអាចបង្កើនល្បឿននៃការបង្ហាញ VBO របស់យើង។
ផ្នែកទី 1. ការរៀបចំដើម្បីសិក្សាពន្លឺអ្នកត្រូវការ៖
សូមក្រឡេកមើលឧទាហរណ៍កម្មវិធីដែលប្រើភ្លើងបំភ្លឺ។
លេខកូដ៖
/*http://site, isaer*/ #include |
មតិត្រូវបានផ្តល់តាមរយៈនិមិត្តសញ្ញា // - "កាត់" ។
លេខកូដ៖
លេខកូដ៖
លេខកូដ៖
ផ្នែកទី 4. ការសិក្សាពន្លឺ
ដំបូងយើងបើកការគណនាភ្លើងបំភ្លឺដោយប្រើពាក្យបញ្ជា បើកដំណើរការ(GL_LIGHTING). បន្ទាប់មកអ្នកត្រូវដោះសោប្រភពពន្លឺដោយប្រើពាក្យបញ្ជា glEnable(GL_LIGHT). GL_LIGHT អាចយកត្រឹមតែ 8 តម្លៃ (យ៉ាងហោចណាស់នៅក្នុង OpenGL 2.1) ពោលគឺឧ។ GL_LIGHT0..GL_LIGHT7.
ឥឡូវនេះយើងត្រូវបង្កើតប្រភពពន្លឺ។ ប្រភពពន្លឺនីមួយៗមានប៉ារ៉ាម៉ែត្រលំនាំដើមរបស់វា ឧទាហរណ៍ ប្រសិនបើអ្នកគ្រាន់តែដោះសោប្រភពពន្លឺចំនួន 2 GL_LIGHT0 និង GL_LIGHT1 នោះមានតែ 0 ប៉ុណ្ណោះនឹងអាចមើលឃើញ ចាប់តាំងពីប៉ារ៉ាម៉ែត្រលំនាំដើមរបស់វាខុសពីឧបករណ៍ផ្សេងទៀត (ពួកវាដូចគ្នាបេះបិទសម្រាប់ទាំងអស់ផ្សេងទៀត)។
ប្រភពពន្លឺមានប៉ារ៉ាម៉ែត្រជាច្រើនដូចជា៖ ពណ៌ ទីតាំង និងទិសដៅ។
ពាក្យបញ្ជាដែលប្រើដើម្បីបញ្ជាក់ប៉ារ៉ាម៉ែត្រពន្លឺទាំងអស់គឺ ពន្លឺភ្លើង*(). វាត្រូវការអាគុយម៉ង់បី៖ ឧបករណ៍កំណត់ប្រភពពន្លឺ ឈ្មោះទ្រព្យសម្បត្តិ និងតម្លៃដែលចង់បានសម្រាប់វា។
លេខកូដ៖
ឧទាហរណ៍:
លេខកូដ៖
/*http://site, isaer*/ glLightf(GL_LIGHT0, GL_GL_SPOT_CUTOFF, 180); |
វាអានដូចនេះ៖ ជួរទីមួយគឺជាឈ្មោះនៃប៉ារ៉ាម៉ែត្រ ទីពីរគឺជាតម្លៃលំនាំដើម ហើយទីបីគឺជាការពន្យល់។ ប្រសិនបើអ្នកឃើញអ្វីមួយដូចជា (1.0,1.0,1.0,1.0) ឬ (0.0,0.0,0.0.1.0) នោះមានន័យថាតង្កៀបទីមួយគឺជាលំនាំដើមសម្រាប់ប្រភពទទេ ហើយតង្កៀបទីពីរគឺជាលំនាំដើមសម្រាប់អ្វីដែលនៅសល់៖
លេខកូដ៖
លេខកូដ៖
/*http://site, isaer*/ float light_ambient = (0.0,0.0,0.0,1.0); float light_diffuse = (1.0,1.0,1.0,1.0); float light_specular = (1.0,1.0,1.0,1.0); float light_position = (1.0,1.0,1.0,0.0); glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); glLightfv(GL_LIGHT0, GL_POSITION, light_position); |
1. ពណ៌
សាយភាយ
ប៉ារ៉ាម៉ែត្រ GL_DIFFUSE ប្រហែលជាត្រូវគ្នាយ៉ាងជិតស្និទ្ធបំផុតនូវអ្វីដែលអ្នកធ្លាប់ហៅ "ពណ៌ពន្លឺ"។ វាកំណត់ពណ៌ RGBA នៃពន្លឺដែលសាយភាយ ដែលប្រភពពន្លឺនីមួយៗបន្ថែមទៅកន្លែងកើតហេតុ។
បរិយាកាស
ប៉ារ៉ាម៉ែត្រ GL_AMBIENT ប៉ះពាល់ដល់ពណ៌នៃការបន្លិចជាក់លាក់នៅលើវត្ថុ។ នៅក្នុងពិភពពិត វត្ថុដូចជាដបកែវមានចំណុចពិសេសដែលផ្គូផ្គងនឹងពណ៌ពន្លឺ (ជាញឹកញាប់ពណ៌ស)។
ពិសេស
ប៉ារ៉ាម៉ែត្រ GL_SPECULAR ប៉ះពាល់ដល់អាំងតង់ស៊ីតេនៃគំនួសពណ៌លើវត្ថុ។
2. មុខតំណែង
ប៉ារ៉ាម៉ែត្រ GL_POSITION(x, y, z, w)មានតម្លៃ 3 ទីតាំង និងមួយបង្ហាញថាប្រភពពន្លឺណាមួយនឹងត្រូវបានប្រើប្រាស់។
ប៉ារ៉ាម៉ែត្រ 3 (x, y, z) ដំបូងគឺពន្យល់ដោយខ្លួនឯង ហើយប៉ារ៉ាម៉ែត្រទី 4 (w) បញ្ជាក់ថាតើអំពូលភ្លើងគ្មានកំណត់ ឬអំពូលភ្លើងនឹងត្រូវបានប្រើ។ ប្រសិនបើតម្លៃ w = 0បន្ទាប់មកប្រភពពន្លឺគឺនៅឆ្ងាយគ្មានកំណត់ (ដូចព្រះអាទិត្យ)។ ប្រសិនបើ w = ១បន្ទាប់មកប្រភពពន្លឺនេះគឺជាចំណុចមួយ (អ្វីមួយដូចជាអំពូលភ្លើង)។
ប្រសិនបើ w = 0បន្ទាប់មកប៉ារ៉ាម៉ែត្រ 3 ដំបូងគឺជាវ៉ិចទ័រពីកណ្តាលនៃប្រព័ន្ធកូអរដោនេ (0,0,0) ។
3. ការយកចិត្តទុកដាក់
GL_SPOT_DIRECTION- ទិសដៅនៃពន្លឺ។
GL_SPOT_EXPONENT- ការផ្តោតអារម្មណ៍នៃធ្នឹមពន្លឺ។
GL_SPOT_CUTOFF- ទទឹងមុំនៃធ្នឹមពន្លឺ។
រឿងតែមួយគត់ដែលត្រូវបញ្ជាក់គឺទីតាំងគួរតែ w = ១.
4. ចុះខ្សោយ
ប្រសិនបើអ្នកត្រូវការបន្ថយអាំងតង់ស៊ីតេពន្លឺពីកណ្តាល (នោះគឺបន្ថែមពីកណ្តាល dimmer) បន្ទាប់មកអ្នកត្រូវកែតម្រូវប៉ារ៉ាម៉ែត្រ៖ GL_CONSTANT_ATTENUATION, GL_LINEAR_ATTENUATION, GL_QUADRATIC_ATTENUATION.
ប៉ុន្តែនេះមិនងាយស្រួលទេ ដូច្នេះអ្នកអាចប្រើរូបមន្ត៖
លេខកូដ៖
ប្រសិនបើអ្នកត្រូវការកាត់បន្ថយអាំងតង់ស៊ីតេទាំងមូលអ្នកអាចផ្លាស់ប្តូរប៉ារ៉ាម៉ែត្រ att.
ផ្នែកទី 6. ការជ្រើសរើសគំរូភ្លើងបំភ្លឺ
គោលគំនិត OpenGL នៃគំរូភ្លើងបំភ្លឺ ត្រូវបានបែងចែកជា 4 សមាសភាគ៖
លេខកូដ៖
ពន្លឺនៅក្នុង OpenGL ES គឺជាមុខងារដ៏មានប្រយោជន៍ដែលអាចបន្ថែមការប៉ះដ៏ស្រស់ស្អាតដល់ហ្គេម 3D ។ ដើម្បីប្រើមុខងារដូចនេះ យើងត្រូវយល់អំពីគំរូភ្លើង OpenGL ES ជាដំបូង។
របៀបដែលពន្លឺដំណើរការ
ចូរយើងគិតពីរបៀបដែលពន្លឺដំណើរការ។ ដំបូងយើងត្រូវការប្រភពពន្លឺដែលបញ្ចេញពន្លឺ។ អ្នកក៏នឹងត្រូវការវត្ថុបំភ្លឺផងដែរ។ ជាចុងក្រោយ យើងក៏ត្រូវការឧបករណ៍ចាប់សញ្ញា ដូចជាភ្នែក ឬកាមេរ៉ា ដែលទទួល photons ដែលត្រូវបានបញ្ជូនដោយប្រភពពន្លឺ និងឆ្លុះបញ្ចាំងដោយវត្ថុ។ ពន្លឺផ្លាស់ប្តូរពណ៌ដែលយល់ឃើញរបស់វត្ថុមួយអាស្រ័យលើ: ប្រភេទនៃប្រភពពន្លឺ; ពណ៌ឬអាំងតង់ស៊ីតេនៃប្រភពពន្លឺ; ទីតាំងនៃប្រភពពន្លឺ និងទិសដៅរបស់វាទាក់ទងទៅនឹងវត្ថុបំភ្លឺ; វត្ថុធាតុនិងវាយនភាព។
អាំងតង់ស៊ីតេដែលពន្លឺត្រូវបានឆ្លុះបញ្ចាំងដោយវត្ថុមួយអាស្រ័យលើកត្តាជាច្រើន។ កត្តាសំខាន់បំផុតដែលយើងមើលគឺមុំដែលធ្នឹមពន្លឺប៉ះលើផ្ទៃ។ មុំនេះកាន់តែជិតទៅមុំខាងស្តាំ អាំងតង់ស៊ីតេកាន់តែច្រើនដែលពន្លឺនឹងត្រូវបានឆ្លុះបញ្ចាំងពីវត្ថុ។ នេះត្រូវបានបង្ហាញនៅក្នុងរូបភព។ ១១.១.
នៅពេលដែលពន្លឺមួយប៉ះលើផ្ទៃណាមួយ វានឹងឆ្លុះបញ្ចាំងក្នុងទិសដៅពីរផ្សេងគ្នា។ ភាគច្រើននៃពន្លឺនឹងត្រូវបានឆ្លុះបញ្ចាំងយ៉ាងសាយភាយ។ នេះមានន័យថា កាំរស្មីពន្លឺដែលឆ្លុះបញ្ចាំងត្រូវបានខ្ចាត់ខ្ចាយមិនស្មើគ្នា និងចៃដន្យនៅទូទាំងផ្ទៃនៃវត្ថុ។ កាំរស្មីខ្លះត្រូវបានឆ្លុះបញ្ចាំងយ៉ាងជាក់លាក់។ នេះមានន័យថាកាំរស្មីពន្លឺនឹងត្រូវបានឆ្លុះត្រឡប់មកវិញដូចជាពួកគេកំពុងឆ្លុះកញ្ចក់ដ៏ល្អឥតខ្ចោះ។ នៅក្នុងរូបភព។ រូបភាពទី 11.2 បង្ហាញពីភាពខុសគ្នារវាងការឆ្លុះបញ្ចាំងពីការសាយភាយ និងការឆ្លុះបញ្ចាំងជាក់លាក់។
អង្ករ។ ១១.១. មុំកាន់តែជិតទៅមុំខាងស្តាំ អាំងតង់ស៊ីតេនៃពន្លឺដែលឆ្លុះបញ្ចាំងកាន់តែខ្លាំង
អង្ករ។ ១១.២. ការឆ្លុះបញ្ចាំងដែលខ្ចាត់ខ្ចាយ និងជាក់លាក់
ការឆ្លុះបញ្ចាំងជាក់លាក់នឹងបង្ហាញជាគំនួសពណ៌លើវត្ថុ។ ថាតើពន្លឺឆ្លុះបញ្ចាំងពីវត្ថុជាក់លាក់មួយ អាស្រ័យលើសម្ភារៈដែលវាត្រូវបានផលិត។ វត្ថុដែលមានផ្ទៃមិនស្មើគ្នា ឬគ្រើមដូចស្បែក ទំនងជាមិនមានចំណុចរំលេចពិសេសទេ។ វត្ថុដែលមានផ្ទៃរលោងដូចជាកញ្ចក់ ឬថ្មម៉ាបនឹងបង្ហាញវត្ថុបុរាណស្រាលៗទាំងនេះ។ ជាការពិតណាស់ កញ្ចក់ ឬថ្មម៉ាបមិនរលោងឥតខ្ចោះនោះទេ ប៉ុន្តែបើប្រៀបធៀបទៅនឹងឈើ ឬស្បែកមនុស្ស។
នៅពេលដែលពន្លឺប៉ះលើផ្ទៃណាមួយ ការឆ្លុះបញ្ចាំងរបស់វាក៏ផ្លាស់ប្តូរពណ៌អាស្រ័យលើសមាសធាតុគីមីនៃវត្ថុដែលបំភ្លឺ។ វត្ថុដែលលេចចេញជាពណ៌ក្រហមចំពោះយើង ឆ្លុះបញ្ចាំងតែផ្នែកពណ៌ក្រហមនៃពន្លឺ និងស្រូបយកប្រេកង់ផ្សេងទៀតទាំងអស់។ វត្ថុខ្មៅគឺជាវត្ថុមួយដែលស្រូបពន្លឺស្ទើរតែទាំងអស់ដែលធ្លាក់មកលើវា។
OpenGL ES អនុញ្ញាតឱ្យអ្នកក្លែងធ្វើឥរិយាបថក្នុងពិភពពិតដោយកំណត់ប្រភពពន្លឺ និងវត្ថុធាតុ។
ប្រភពពន្លឺ
យើងត្រូវបានហ៊ុំព័ទ្ធដោយប្រភពពន្លឺផ្សេងៗគ្នាជាច្រើន។ ព្រះអាទិត្យកំពុងបញ្ជូនហ្វូតុនរបស់វាចេញជានិច្ច។ ម៉ូនីទ័របញ្ចេញពន្លឺដែលព័ទ្ធជុំវិញយើងដោយពន្លឺដ៏រីករាយនៅពេលយប់។ អំពូល និងចង្កៀងមុខជួយយើងជៀសវាងការប៉ះទង្គិចជាមួយវត្ថុផ្សេងៗនៅក្នុងទីងងឹត។ OpenGL ES អនុញ្ញាតឱ្យអ្នកបង្កើតប្រភពពន្លឺបួនប្រភេទ។
ពន្លឺខាងក្រោយ។ វាមិនមែនជាប្រភពនៃពន្លឺនៅក្នុងខ្លួនវាទេ ប៉ុន្តែជាលទ្ធផលនៃរូបរាងនៃ photons ពីប្រភពពន្លឺផ្សេងទៀត។ រួមគ្នា ហ្វូតុនចៃដន្យទាំងនេះបង្កើតកម្រិតនៃការបំភ្លឺថេរដែលមិនមានទិសដៅ និងបំភ្លឺវត្ថុទាំងអស់ស្មើៗគ្នា។
ចំណុចប្រភពពន្លឺ។ ពួកវាមានទីតាំងនៅក្នុងលំហ និងបញ្ចេញពន្លឺគ្រប់ទិសទី។ ឧទាហរណ៍ ប្រភពនៃពន្លឺគឺជាអំពូលភ្លើង។
ប្រភពពន្លឺទិសដៅ។ បង្ហាញជាទិសដៅនៅក្នុង OpenGL ES ។ គេសន្មត់ថានៅឆ្ងាយគ្មានកំណត់។ តាមឧត្ដមគតិ ព្រះអាទិត្យអាចជាប្រភពបែបនេះ។ យើងអាចសន្មត់ថា កាំរស្មីពន្លឺទាំងអស់ដែលចេញមកពីព្រះអាទិត្យមកប៉ះផែនដីនៅមុំដូចគ្នា ដោយសារតែចម្ងាយរវាងផែនដី និងព្រះអាទិត្យ។
អំពីចង្កៀង។ ពន្លឺទាំងនេះគឺស្រដៀងទៅនឹងភ្លើងចង្អុល ដែលពួកគេមានទីតាំងដែលបានផ្តល់ឱ្យក្នុងលំហ។ លើសពីនេះទៀតពួកគេមានទិសដៅដែលពួកគេបញ្ចេញកាំរស្មីពន្លឺ។ ពួកគេបង្កើតកោណពន្លឺដែលកំណត់ទៅកាំជាក់លាក់មួយ។ ឧទាហរណ៏នៃប្រភពពន្លឺបែបនេះគឺជាចង្កៀងតាមចិញ្ចើមផ្លូវ។
យើងនឹងពិចារណាតែអំពូល Backlight ក៏ដូចជាចំណុច និងប្រភពពន្លឺទិសដៅប៉ុណ្ណោះ។ ពន្លឺជាញឹកញាប់ពិបាកប្រើនៅលើឧបករណ៍ Android ដែលមានកម្រិត GPU ដោយសារវិធីដែល OpenGL ES គណនាពន្លឺ។ អ្នកនឹងយល់ភ្លាមៗថាហេតុអ្វីបានជាដូច្នេះ។
បន្ថែមពីលើទីតាំង និងទិសដៅនៃប្រភពពន្លឺ OpenGL ES អនុញ្ញាតឱ្យអ្នកកំណត់ពណ៌ ឬអាំងតង់ស៊ីតេនៃពន្លឺ។ លក្ខណៈទាំងនេះត្រូវបានបង្ហាញដោយប្រើពណ៌ RGBA ។ ទោះយ៉ាងណាក៏ដោយ OpenGL ES តម្រូវឱ្យអ្នកកំណត់ពណ៌ចំនួនបួនផ្សេងគ្នាក្នុងមួយប្រភពជំនួសឱ្យពណ៌តែមួយ។
ការបន្លិច - អាំងតង់ស៊ីតេ / ពណ៌ដែលរួមចំណែកដល់ការដាក់ស្រមោលនៃវត្ថុមួយ។ វត្ថុនឹងត្រូវបានបំភ្លឺស្មើៗគ្នាពីគ្រប់ជ្រុងទាំងអស់ ដោយមិនគិតពីទីតាំង ឬទិសដៅរបស់វាទាក់ទងទៅនឹងប្រភពពន្លឺនោះទេ។
Diffuse - អាំងតង់ស៊ីតេ / ពណ៌នៃពន្លឺដែលនឹងបំភ្លឺវត្ថុបន្ទាប់ពីគណនាការឆ្លុះបញ្ចាំងដែលសាយភាយ។ គែមរបស់វត្ថុដែលមិនប្រឈមមុខនឹងប្រភពពន្លឺនឹងមិនត្រូវបានបំភ្លឺដូចនៅក្នុងជីវិតពិតនោះទេ។
Specular - អាំងតង់ស៊ីតេ / ពណ៌ស្រដៀងទៅនឹងពណ៌ដែលសាយភាយ។ ទោះយ៉ាងណាក៏ដោយ វាប៉ះពាល់តែចំណុចទាំងនោះនៃវត្ថុដែលមានទិសជាក់លាក់ទាក់ទងនឹងប្រភពពន្លឺ និងឧបករណ៍ចាប់សញ្ញា។
Emissive គឺជាការគណនាពណ៌ដ៏ស្មុគ្រស្មាញដែលមានការប្រើប្រាស់កម្រិតខ្លាំងនៅក្នុងកម្មវិធីរូបវិទ្យាពិភពលោកពិតប្រាកដ ដូច្នេះយើងនឹងមិនគ្របដណ្តប់វាទេ។
ភាគច្រើនយើងនឹងប្រើអាំងតង់ស៊ីតេនៃការសាយភាយ និងជាក់លាក់នៃប្រភពពន្លឺ ហើយផ្តល់តម្លៃលំនាំដើមពីរផ្សេងទៀត។ ដូចគ្នានេះផងដែរ ភាគច្រើននៃពេលវេលាដែលយើងនឹងប្រើពណ៌ RGBA ដូចគ្នាសម្រាប់ទាំងអាំងតង់ស៊ីតេនៃការសាយភាយ និងជាក់លាក់។
សម្ភារៈ
វត្ថុទាំងអស់នៅក្នុងពិភពលោករបស់យើងមានប្រភេទសម្ភារៈមួយចំនួន។ សម្ភារៈនីមួយៗកំណត់ពីរបៀបដែលពន្លឺដែលធ្លាក់លើវត្ថុមួយនឹងត្រូវបានឆ្លុះបញ្ចាំង និងផ្លាស់ប្តូរពណ៌នៃពន្លឺដែលឆ្លុះបញ្ចាំង។ OpenGL ES អនុញ្ញាតឱ្យអ្នកកំណត់ពណ៌ RGBA ចំនួនបួនដូចគ្នាសម្រាប់សម្ភារៈមួយ និងសម្រាប់ប្រភពពន្លឺ។
Backlight គឺជាពណ៌ដែលផ្សំជាមួយពណ៌ផ្ទៃខាងក្រោយនៃប្រភពពន្លឺណាមួយនៅក្នុងកន្លែងកើតហេតុ។
Diffuse គឺជាពណ៌ដែលផ្សំជាមួយពណ៌ដែលសាយភាយនៃប្រភពពន្លឺណាមួយ។
Specular គឺជាពណ៌ដែលរួមបញ្ចូលគ្នាជាមួយពណ៌ specular នៃប្រភពពន្លឺណាមួយ។ វាត្រូវបានប្រើដើម្បីបង្កើតគំនួសពណ៌លើផ្ទៃវត្ថុ។
Emissive - យើងបន្តមិនអើពើនឹងប្រភេទនៃពណ៌នេះ ព្រោះវាមិនត្រូវបានប្រើនៅក្នុងបរិបទរបស់យើងទេ។
រូបភាពទី 11.3 បង្ហាញពីលក្ខណៈសម្បតិ្តនៃសម្ភារៈ/ប្រភពពន្លឺបីប្រភេទដំបូង៖ backlight, diffuse និង specular។
អង្ករ។ ១១.៣. ប្រភេទផ្សេងគ្នានៃសម្ភារៈ/ប្រភពពន្លឺ៖ អំពូលខាងក្រោយតែប៉ុណ្ណោះ (ខាងឆ្វេង) ចែកចាយតែ (កណ្តាល) ពន្លឺខាងក្រោយ និងពណ៌ដែលសាយភាយជាមួយនឹងការបន្លិចជាក់លាក់ (ស្តាំ)
នៅក្នុងរូបភព។ រូបភាពទី 11.3 បង្ហាញពីឥទ្ធិពលនៃលក្ខណៈសម្បត្តិផ្សេងៗនៃសម្ភារៈ និងប្រភពពន្លឺលើពណ៌។ អំពូល Backlight បំភ្លឺទំហំស្មើគ្នា។ ពន្លឺដែលខ្ចាត់ខ្ចាយនឹងត្រូវបានឆ្លុះបញ្ចាំងអាស្រ័យលើមុំដែលកាំរស្មីពន្លឺប៉ះវត្ថុ; តំបន់ដែលប្រឈមមុខនឹងប្រភពពន្លឺដោយផ្ទាល់នឹងត្រូវបានបំភ្លឺកាន់តែភ្លឺ តំបន់ដែលពន្លឺមិនអាចទៅដល់បាននឹងងងឹត។ នៅក្នុងរូបភាពខាងស្តាំ អ្នកអាចមើលឃើញការរួមបញ្ចូលគ្នានៃ backlight, diffuse និង specular light។ ពន្លឺជាក់លាក់លេចឡើងជាគំនួសពណ៌សនៅលើលំហ។
របៀបដែល OpenGL ES គណនាពន្លឺ៖ កំពូលធម្មតា។
អ្នកដឹងថាអាំងតង់ស៊ីតេនៃពន្លឺដែលឆ្លុះបញ្ចាំងពីវត្ថុមួយអាស្រ័យលើមុំនៃឧប្បត្តិហេតុរបស់វាទៅលើវត្ថុ។ OpenGL ES ប្រើការពិតនេះដើម្បីគណនាពន្លឺ។ វាប្រើ vertex normals សម្រាប់ការនេះ ដែលត្រូវតែកំណត់ក្នុងកូដក្នុងវិធីដូចគ្នានឹងកូអរដោនេវាយនភាព ឬពណ៌ vertex ។ នៅក្នុងរូបភព។ រូបភាព 11.4 បង្ហាញរាងស្វ៊ែរ និងចំនុចកំពូលរបស់វាធម្មតា។
អង្ករ។ ១១.៤. ស្វ៊ែរ និងចំណុចកំពូលរបស់វាធម្មតា។
ធម្មតាគឺជាវ៉ិចទ័រឯកតាដែលបង្ហាញពីទិសដៅឆ្ពោះទៅរកការបង្វិលផ្ទៃ។ ក្នុងករណីរបស់យើងផ្ទៃគឺជាត្រីកោណ។ ជំនួសឱ្យការកំណត់ផ្ទៃធម្មតា យើងកំណត់ចំណុចកំពូលធម្មតា។ ភាពខុសគ្នារវាងភាពធម្មតាទាំងនេះគឺថា vertex ធម្មតាអាចមិនចង្អុលក្នុងទិសដៅដូចគ្នាទៅនឹងផ្ទៃធម្មតានោះទេ។ នេះអាចមើលឃើញយ៉ាងច្បាស់នៅក្នុងរូបភព។ 11.4 ដែលចំនុចកំពូលនីមួយៗមានលក្ខណៈធម្មតាជាមធ្យមនៃត្រីកោណទាំងអស់ដែលមានចំនុចកំពូល។ មធ្យមនេះត្រូវបានអនុវត្តដើម្បីបង្កើតស្រមោលរលោងនៃវត្ថុ។
នៅពេលបង្ហាញវត្ថុដោយប្រើពន្លឺ និង vertex ធម្មតា OpenGL ES នឹងកំណត់មុំរវាងចំនុចកំពូលនីមួយៗ និងប្រភពពន្លឺ។ ប្រសិនបើគាត់ដឹងពីមុំនេះគាត់អាចគណនាពណ៌នៃ vertex ដោយផ្អែកលើលក្ខណៈសម្បត្តិនៃសម្ភារៈ។ លទ្ធផលចុងក្រោយគឺពណ៌នៃចំនុចកំពូលនីមួយៗ ដែលបន្ទាប់មកត្រូវបានអនុវត្តទៅត្រីកោណនីមួយៗដោយរួមបញ្ចូលគ្នាជាមួយនឹងពណ៌ដែលបានគណនានៃចំនុចកំពូលផ្សេងទៀត។ ពណ៌នេះនឹងត្រូវបានផ្សំជាមួយនឹងការបំប្លែងវាយនភាពណាមួយដែលយើងអនុវត្តចំពោះវត្ថុ។
នេះស្តាប់ទៅគួរឱ្យខ្លាចណាស់ ប៉ុន្តែតាមពិតវាមិនអាក្រក់នោះទេ។ យើងត្រូវបើកភ្លើង និងកំណត់ប្រភពពន្លឺ សម្ភារៈដែលអាចបង្ហាញបាន និងចំណុចកំពូលធម្មតា (បន្ថែមពីលើប៉ារ៉ាម៉ែត្រចំនុចកំពូលដែលជាធម្មតាយើងកំណត់ ដូចជាកូអរដោនេទីតាំង ឬវាយនភាព)។ សូមក្រឡេកមើលរបៀបដែលវាអាចត្រូវបានអនុវត្តដោយប្រើ OpenGL ES ។
នៅលើការអនុវត្ត
ឥឡូវនេះ ចូរយើងអនុវត្តជំហានទាំងអស់ដែលចាំបាច់ដើម្បីធ្វើការជាមួយភ្លើងបំភ្លឺដោយប្រើ OpenGL ES ។ ចូរបង្កើតថ្នាក់ជំនួយការតូចៗមួយចំនួនដែលនឹងធ្វើឱ្យការធ្វើការជាមួយប្រភពពន្លឺកាន់តែងាយស្រួលបន្តិច ហើយដាក់វានៅក្នុងកញ្ចប់ com.badlogi with.androi dgames.framework.gl ។
ការអនុញ្ញាតនិងការហាមឃាត់ការបំភ្លឺ
ដូចនឹងរដ្ឋ OpenGL ES ផ្សេងទៀត អ្នកត្រូវតែបើកមុខងារដែលមានឈ្មោះជាមុនសិន។ នេះអាចត្រូវបានធ្វើដូចខាងក្រោម:
បន្ទាប់ពីនេះ ពន្លឺនឹងត្រូវបានអនុវត្តចំពោះវត្ថុដែលបានបង្ហាញទាំងអស់។ ដើម្បីទទួលបានលទ្ធផល អ្នកត្រូវកំណត់ប្រភពពន្លឺ និងសម្ភារៈ ក៏ដូចជា vertex normals ។ នៅពេលដែលយើងបានបញ្ចប់ការគូរវត្ថុចាំបាច់ទាំងអស់ ភ្លើងអាចត្រូវបានបិទ៖
ការកំណត់ប្រភពពន្លឺ
OpenGL ES ផ្តល់នូវប្រភពពន្លឺចំនួន 4 ប្រភេទ៖ អំពូល Backlight, Spot, ទិសដៅ និងពន្លឺផ្តោតអារម្មណ៍។ តោះមើលរបៀបកំណត់បីដំបូង។ ដើម្បីឱ្យអំពូលភ្លើងមានប្រសិទ្ធភាព និងមើលទៅល្អ ម៉ូដែលនីមួយៗត្រូវតែមានត្រីកោណជាច្រើន។ វាមិនអាចទៅរួចទេសម្រាប់ឧបករណ៍ចល័តបច្ចុប្បន្នជាច្រើន។
OpenGL ES អនុញ្ញាតឱ្យអ្នកកំណត់ប្រភពពន្លឺអតិបរមាចំនួន 8 ក្នុងពេលដំណាលគ្នា ក៏ដូចជាប្រភពពន្លឺសកលមួយ។ ប្រភពពន្លឺទាំង 8 នីមួយៗមានឧបករណ៍សម្គាល់ចាប់ពី GL10.GL LIGHT0 ដល់ GL10.GL LIGHT7។ ប្រសិនបើអ្នកត្រូវការផ្លាស់ប្តូរលក្ខណៈសម្បត្តិនៃភ្លើងមួយក្នុងចំណោមអំពូលទាំងនេះ អ្នកអាចធ្វើវាបានដោយកំណត់លេខសម្គាល់ដែលត្រូវគ្នា។
អ្នកអាចបើកការប្រើប្រាស់ភ្លើងដោយប្រើវាក្យសម្ព័ន្ធខាងក្រោម៖
បន្ទាប់មក OpenGL ES នឹងទទួលបានលក្ខណៈសម្បត្តិនៃប្រភពពន្លឺនេះ ហើយអនុវត្តពួកវាចំពោះវត្ថុដែលបានបង្ហាញទាំងអស់។ ប្រសិនបើយើងត្រូវបិទការប្រើប្រាស់ប្រភពពន្លឺ យើងអាចធ្វើដូច្នេះបានដោយមានសេចក្តីថ្លែងការណ៍ដូចខាងក្រោម៖
ការបន្លិចគឺជាករណីពិសេសព្រោះវាមិនមានអត្តសញ្ញាណប័ណ្ណ។ មានតែការបន្លិចមួយប៉ុណ្ណោះដែលអាចមាននៅក្នុងឈុត OpenGL ES។ ចូរយើងពិនិត្យមើលឱ្យកាន់តែច្បាស់អំពីប្រភពពន្លឺនេះ។
ពន្លឺខាងក្រោយ
អំពូល Backlight គឺជាប្រភេទភ្លើងបំភ្លឺពិសេស។ វាមិនមានទីតាំង ឬទិសដៅទេ មានតែពណ៌ដែលត្រូវបានអនុវត្តចំពោះវត្ថុបំភ្លឺទាំងអស់ស្មើគ្នា។ OpenGL ES អនុញ្ញាតឱ្យអ្នកកំណត់ការបន្លិចជាសកលដូចខាងក្រោម៖
ambi entCol ឬ array មានតម្លៃ RGBA នៃពណ៌ backlight តំណាងជាលេខចំណុចអណ្តែតចាប់ពី 0 ដល់ 1។ វិធីសាស្ត្រ gl LightModel fv ត្រូវប្រើជាប៉ារ៉ាម៉ែត្រដំបូងរបស់វាដែលបញ្ជាក់ថេរថាយើងចង់កំណត់ពណ៌នៃពន្លឺផ្ទៃខាងក្រោយ ប្រភព អារេនៃលេខចំណុចអណ្តែត ដែលផ្ទុកពណ៌ប្រភព និងអុហ្វសិតសម្រាប់អារេអណ្តែត ដែលវិធីសាស្ត្រនឹងចាប់ផ្តើមអានតម្លៃ RGBA ។ ចូរយើងដាក់កូដដែលដោះស្រាយបញ្ហានេះទៅជាថ្នាក់តូចមួយ។ លេខកូដរបស់វាត្រូវបានបង្ហាញនៅក្នុងបញ្ជី 11.2 ។
ការចុះបញ្ជី 11.2 ។ ថ្នាក់ AmbientLight.java. អរូបីបំភ្លឺសកលសាមញ្ញ ODenGL ES
អ្វីទាំងអស់ដែលយើងធ្វើគឺរក្សាទុកពណ៌បន្លិចនៅក្នុងអារេអណ្តែត ហើយផ្តល់នូវវិធីសាស្រ្តពីរ៖ មួយប្រើដើម្បីកំណត់ពណ៌ និងមួយទៀតប្រើប្រាប់ OpenGL ES ឱ្យប្រើពណ៌នោះ។ ពណ៌លំនាំដើមគឺពណ៌ប្រផេះ។
ប្រភពពន្លឺចំណុច
ភ្លើងចង្អុលមានទីតាំង ក៏ដូចជាផ្ទៃខាងក្រោយ សាយភាយ និងពណ៌/អាំងតង់ស៊ីតេ (យើងមិនពិចារណាពណ៌/អាំងតង់ស៊ីតេដែលបញ្ចេញចោល)។ ប្រភេទនៃផ្កាអាចត្រូវបានកំណត់ដូចខាងក្រោម:
ប៉ារ៉ាម៉ែត្រដំបូងគឺឧបករណ៍កំណត់ប្រភពពន្លឺ។ ក្នុងករណីនេះយើងប្រើប្រភពទីបួន។ ប៉ារ៉ាម៉ែត្របន្ទាប់បញ្ជាក់គុណលក្ខណៈដែលយើងចង់ផ្លាស់ប្តូរ។ ប៉ារ៉ាម៉ែត្រទីបីគឺជាអារេនៃលេខចំណុចអណ្តែតដែលមានតម្លៃ RGBA ហើយចុងក្រោយគឺអុហ្វសិតនៅក្នុងអារេនេះ។ កំណត់ទីតាំងនៃប្រភពគឺងាយស្រួលដូចតទៅ៖
យើងកំណត់គុណលក្ខណៈដែលយើងចង់ផ្លាស់ប្តូរម្តងទៀត (ក្នុងករណីនេះទីតាំង) អារេធាតុបួនដែលមាន x-, y-, និង z-coordinate នៃប្រភពពន្លឺនៅលើពិភពលោកដែលកំពុងត្រូវបានបង្កើត។ ចំណាំថាធាតុទីបួននៃអារេត្រូវតែស្មើនឹងមួយប្រសិនបើប្រភពពន្លឺមានទីតាំងមួយ។ ចូរយើងដាក់វាក្នុងថ្នាក់ជំនួយ។ លេខកូដរបស់វាមាននៅក្នុង Listing 11.3។
ការចុះបញ្ជី 11.3 ។ ថ្នាក់ Point.Light.java ដែលជាអរូបីសាមញ្ញនៃពន្លឺចំណុច OpenGL ES
ថ្នាក់ជំនួយរបស់យើងមានធាតុផ្សំនៃផ្ទៃខាងក្រោយ ការសាយភាយ និងពណ៌ជាក់លាក់នៃពន្លឺ ក៏ដូចជាទីតាំង (ធាតុទីបួនគឺមួយ)។ លើសពីនេះ យើងរក្សាទុកឧបករណ៍កំណត់អត្តសញ្ញាណចុងក្រោយដែលប្រើសម្រាប់ប្រភពដែលបានផ្តល់ឱ្យ ដូច្នេះវាអាចបង្កើតវិធីសាស្ត្រ disableO ដែលនឹងបិទពន្លឺប្រសិនបើចាំបាច់។ យើងក៏មានវិធីសាស្ត្រ enableO ដែលយកឧទាហរណ៍នៃថ្នាក់ GL10 និងឧបករណ៍កំណត់ប្រភពពន្លឺ (ឧទាហរណ៍ GL10.GL LIGHT6)។ វាអនុញ្ញាតឱ្យប្រើភ្លើងបំភ្លឺ កំណត់លក្ខណៈរបស់វា និងរក្សាទុកលេខសម្គាល់ដែលបានប្រើ។ វិធីសាស្ត្រ disableO គ្រាន់តែបិទការប្រើប្រាស់ភ្លើងដោយប្រើសមាជិកថ្នាក់ 1ast.Light.tId ដែលបានកំណត់ក្នុងវិធីសាស្ត្របើក។
យើងប្រើតម្លៃលំនាំដើមដែលសមហេតុផលសម្រាប់ពណ៌ផ្ទៃខាងក្រោយ សាយភាយ និងពណ៌ជាក់លាក់ នៅពេលចាប់ផ្តើមអារេសមាជិកថ្នាក់។ ពន្លឺនឹងមានពណ៌ស ហើយនឹងមិនបង្កើតពន្លឺចាំងណាមួយឡើយ ព្រោះសមាសធាតុពិសេសរបស់វាគឺខ្មៅ។
ប្រភពពន្លឺទិសដៅ
ប្រភពពន្លឺនៃទិសដៅគឺស្ទើរតែដូចគ្នាបេះបិទទៅនឹងចំណុចនីមួយៗ។ ភាពខុសគ្នាតែមួយគត់គឺថាពួកគេមានទិសដៅជំនួសឱ្យទីតាំងមួយ។ របៀបដែលត្រូវបានបង្ហាញគឺមានការយល់ច្រឡំបន្តិច។ ជំនួសឱ្យការប្រើវ៉ិចទ័រដើម្បីចង្អុលបង្ហាញទិសដៅមួយ OpenGL ES រំពឹងថាយើងកំណត់ចំណុចតែមួយ។ បន្ទាប់មកទិសដៅនឹងត្រូវបានកំណត់ដោយប្រើវ៉ិចទ័រតភ្ជាប់ចំណុចនេះ និងប្រភពដើម។ ឈុតខ្លីៗខាងក្រោមអនុញ្ញាតឱ្យអ្នកបង្កើតប្រភពពន្លឺទិសដៅដែលមកពីផ្នែកខាងស្តាំនៃពិភពលោក៖
យើងអាចបំប្លែងវាទៅជាវ៉ិចទ័រ៖
គុណលក្ខណៈផ្សេងទៀត ដូចជាផ្ទៃខាងក្រោយ ឬពណ៌ដែលសាយភាយ គឺដូចគ្នាបេះបិទទៅនឹងពន្លឺចង្អុល។ ការចុះបញ្ជីលេខ 11.4 បង្ហាញលេខកូដសម្រាប់ថ្នាក់ជំនួយតូចមួយដែលប្រើដើម្បីបង្កើតភ្លើងទិសដៅ។
ការចុះបញ្ជី 11.4 ។ Directi onLi class ght.java ដែលជាអរូបីសាមញ្ញនៃប្រភពពន្លឺទិសដៅនៅក្នុង OpenGL ES
ថ្នាក់ជំនួយនេះគឺស្ទើរតែដូចគ្នាទៅនឹងថ្នាក់ PointLight ។ ភាពខុសគ្នាតែមួយគត់គឺថានៅក្នុង directi នៅលើ array ធាតុទីបួនគឺមួយ។ លើសពីនេះទៀត ជំនួសឱ្យវិធីសាស្ត្រ setPosition setDirecti on method បានបង្ហាញខ្លួន។ វាអនុញ្ញាតឱ្យអ្នកកំណត់ទិសដៅឧទាហរណ៍ដូចនេះ៖ (-1; 0; 0) ក្នុងករណីនេះពន្លឺនឹងមកពីផ្នែកខាងស្តាំ។ នៅខាងក្នុងវិធីសាស្រ្ត សមាសធាតុទាំងអស់នៃវ៉ិចទ័រផ្លាស់ប្តូរសញ្ញារបស់វា ដូច្នេះយើងបម្លែងទិសដៅទៅជាទម្រង់ដែលរំពឹងទុកដោយ OpenGL ES ។
ការកំណត់សម្ភារៈ
សម្ភារៈត្រូវបានកំណត់ដោយគុណលក្ខណៈជាច្រើន។ ដូចវត្ថុ OpenGL ES ផ្សេងទៀតដែរ សម្ភារៈគឺជាស្ថានភាពដែលនឹងនៅតែសកម្មរហូតដល់យើងផ្លាស់ប្តូរវាម្តងទៀត ឬបរិបទ OpenGL ES ត្រូវបានបាត់បង់។ ដើម្បីកំណត់លក្ខណៈសម្ភារៈបច្ចុប្បន្ន យើងអាចធ្វើដូចខាងក្រោមៈ
ដូចធម្មតា យើងត្រូវកំណត់ពណ៌ផ្ទៃខាងក្រោយ សាយភាយ និងពណ៌ RGBA ជាក់លាក់។ នេះអាចត្រូវបានធ្វើតាមរបៀបដូចគ្នានឹងមុនដែរ - ដោយប្រើអារេនៃលេខចំណុចអណ្តែតទឹកដែលមានធាតុបួន។
ការរួមបញ្ចូលសកម្មភាពទាំងនេះទៅក្នុងថ្នាក់ជំនួយតែមួយគឺសាមញ្ញណាស់។ អ្នកអាចឃើញលទ្ធផលនៅក្នុងបញ្ជី 11.5 ។
ការចុះបញ្ជី 11.5 ។ ថ្នាក់សម្ភារៈ Java ដែលជាអរូបីសាមញ្ញនៃសម្ភារៈ OpenGL ES
មិនមានអ្វីគួរឱ្យភ្ញាក់ផ្អើលនៅទីនេះទេ។ យើងគ្រាន់តែរក្សាទុកសមាសធាតុចំនួនបីដែលពណ៌នាអំពីសម្ភារៈ ហើយថែមទាំងផ្តល់មុខងារដើម្បីកំណត់តម្លៃរបស់វា និងវិធីសាស្ត្រអនុញ្ញាតដែលបញ្ជូនពួកវាទៅ OpenGL ES ។
OpenGL ES មានសន្លឹកអាត់មួយទៀតនៅលើដៃអាវរបស់វានៅពេលនិយាយអំពីសម្ភារៈ។ ជាធម្មតាវាប្រើអ្វីដែលហៅថាពណ៌សម្ភារៈជំនួសឱ្យវិធីសាស្ត្រ glMaterialfvO ។ នេះមានន័យថាជំនួសឱ្យពណ៌ផ្ទៃខាងក្រោយ និងពណ៌ដែលកំណត់ដោយវិធីសាស្ត្រ glMateri al fv នោះ OpenGL ES នឹងយកពណ៌នៃចំនុចកំពូលនៃម៉ូដែលរបស់យើងធ្វើជាផ្ទៃខាងក្រោយ និងពណ៌ចម្រុះនៃសម្ភារៈ។ ដើម្បីបើកមុខងារនេះ អ្នកគ្រាន់តែហៅវាថា:
នេះជាធម្មតាអ្វីដែលខ្ញុំធ្វើដោយសារតែពណ៌ផ្ទៃខាងក្រោយ និងពណ៌ដែលសាយភាយច្រើនតែដូចគ្នា។ ដោយសារខ្ញុំមិនប្រើការរំលេចពិសេសនៅក្នុងហ្គេម និងការបង្ហាញរបស់ខ្ញុំភាគច្រើន ខ្ញុំអាចប្រើវិធីនេះយ៉ាងងាយស្រួល ហើយមិនហៅថាវិធីសាស្ត្រ glMaterial fv ទាល់តែសោះ។ តើវិធីណាដែលត្រូវប្រើវាអាស្រ័យលើអ្នកក្នុងការសម្រេចចិត្ត។
កំណត់និយមន័យធម្មតា។
ដើម្បីឱ្យពន្លឺដំណើរការក្នុង OpenGL ES អ្នកត្រូវកំណត់ចំនុចធម្មតាសម្រាប់ vertex នីមួយៗនៅក្នុងគំរូ។ ធម្មតានៃ vertex គួរតែជាវ៉ិចទ័រឯកតាចង្អុល (ជាធម្មតា) ក្នុងទិសដៅដែលផ្ទៃខាងលើជាកម្មសិទ្ធិត្រូវបានបង្វិល។ នៅក្នុងរូបភព។ រូបភាពទី 11.5 បង្ហាញពីចំនុចកំពូលធម្មតាសម្រាប់គូបរបស់យើង។
អង្ករ។ ១១.៥. Vertex ធម្មតាសម្រាប់ vertex នីមួយៗនៃគូបរបស់យើង។
ចំនុចកំពូលធម្មតាគឺជាគុណលក្ខណៈមួយផ្សេងទៀតនៃ vertex ដូចជាទីតាំង ឬពណ៌។ ដើម្បីទាញយកអត្ថប្រយោជន៍ពី vertex normals យើងត្រូវផ្លាស់ប្តូរថ្នាក់ Vertices3 ម្តងទៀត។ ដើម្បីប្រាប់ OpenGL ES ពីកន្លែងដែលវាអាចរកឃើញធម្មតាសម្រាប់ vertex នីមួយៗ យើងនឹងប្រើវិធីសាស្ត្រ gl Normal PointerO ដូចកាលពីមុនដែលយើងបានប្រើវិធីសាស្ត្រ gl VertexPointer ឬ gl Col ឬ Pointer ដែរ។ ការចុះបញ្ជី 11.6 បង្ហាញពីកំណែចុងក្រោយនៃថ្នាក់ Vertices3 ។
ការចុះបញ្ជី 11.6 ។ ថ្នាក់ Vertices3.Java កំណែចុងក្រោយដែលគាំទ្រការធម្មតា។
ថ្នាក់មានសមាជិកថ្មី hasNormal.s ដែលតាមដានថាតើកំពូលមានចំនុចធម្មតាដែរឬទេ។
ឥឡូវនេះ អ្នកសាងសង់ក៏ទទួលយកប៉ារ៉ាម៉ែត្រ hasNormals ផងដែរ។ យើងនៅតែត្រូវកែប្រែការគណនានៃសមាជិក vertexSize ដោយបន្ថែមអណ្តែតបីទៅចំនុចកំពូលនីមួយៗតាមដែលអាចធ្វើបាន។
ដូចដែលអ្នកអាចមើលឃើញ វិធីសាស្ត្រ setVertices និង setlndices នៅតែមិនផ្លាស់ប្តូរ។
នៅក្នុងវិធីសាស្រ្ត bindO ដែលយើងទើបតែបង្ហាញ យើងប្រើបច្ចេកទេសដូចគ្នាជាមួយ ByteBuffer ដូចពីមុន ប៉ុន្តែលើកនេះ យើងបន្ថែមធម្មតាដោយប្រើវិធីសាស្ត្រ gl Normal Pointer ។ ដើម្បីគណនាអុហ្វសិតនៃទ្រនិចធម្មតា វាចាំបាច់ក្នុងការគិតថាតើសំរបសំរួលវាយនភាព និងពណ៌ត្រូវបានបញ្ជាក់ឬអត់។
ដូចដែលអ្នកអាចឃើញ វិធីសាស្ត្រនៃការចាប់ឆ្នោតមិនបានផ្លាស់ប្តូរទេ។ សកម្មភាពទាំងអស់កើតឡើងនៅក្នុងវិធីចង O.
ជាចុងក្រោយ យើងកែប្រែវិធីសាស្ត្រ unbindO បន្តិច។ យើងបិទការប្រើប្រាស់ទ្រនិចធម្មតា ប្រសិនបើមាន ការសម្អាតស្ថានភាព OpenGL ES តាមនោះ។
ការអនុវត្តថ្នាក់ Verti ces3 ដែលបានកែប្រែគឺងាយស្រួលដូចពីមុន។ សូមក្រឡេកមើលឧទាហរណ៍តូចមួយ៖
យើងបង្កើតអារេចំណុចអណ្តែតដើម្បីរក្សាទុកបីបញ្ឈរ ដែលនីមួយៗមានទីតាំង (លេខបីដំបូងក្នុងជួរនីមួយៗ) និងធម្មតា (លេខបីចុងក្រោយក្នុងជួរនីមួយៗ)។ ក្នុងករណីនេះ យើងកំណត់ត្រីកោណមួយនៅក្នុងប្លង់ xy ដែលធម្មតារបស់វាចង្អុលទៅទិសនៃផ្នែកវិជ្ជមាននៃអ័ក្ស z ។
អ្វីដែលយើងត្រូវធ្វើគឺបង្កើត instance នៃ Vertices3 class ហើយកំណត់តម្លៃនៃ vertices ។ ងាយស្រួលណាស់មែនទេ?
ការងារចង ការគូរ និង unbinding ទាំងអស់ត្រូវបានធ្វើដូចគ្នាទៅនឹងកំណែមុននៃថ្នាក់។ ដូចពីមុន យើងអាចបន្ថែមពណ៌ vertex និងកូអរដោនេវាយនភាព។
ដាក់វាទាំងអស់គ្នា
តោះដាក់វាទាំងអស់គ្នា។ យើងត្រូវគូរទិដ្ឋភាពដែលមានការបំភ្លឺជាសាកល ចំណុច និងប្រភពពន្លឺទិស។ ពួកគេនឹងបំភ្លឺគូបដែលមានទីតាំងនៅដើម។ យើងក៏ត្រូវហៅទៅ gl uLookAt, method ។ ដើម្បីដាក់កាមេរ៉ា។ នៅក្នុងរូបភព។ រូបភាព 11.6 បង្ហាញពីរូបរាងនៃពិភពលោករបស់យើង។
ដូចឧទាហរណ៍ផ្សេងទៀតដែរ ចូរយើងបង្កើតថ្នាក់មួយហៅថា LightTest ដោយពង្រីកថ្នាក់ GLGame ដូចធម្មតា។ វានឹងត្រឡប់ឧទាហរណ៍នៃថ្នាក់ LightScreen ដោយប្រើវិធីសាស្ត្រ getStartScreenO ។ ថ្នាក់ LightScreen ទទួលមរតកពីថ្នាក់ GLScreen (Listing 11.7) ។
អង្ករ។ ១១.៦. ឈុតឆាកដំបូងរបស់យើង។
ការចុះបញ្ជី 11.7 ។ បំណែកនៃថ្នាក់ LightTest.java ។ បង្កើតពន្លឺដោយប្រើ OpenGL ES
ចូរចាប់ផ្តើមដោយការពិពណ៌នាអំពីសមាជិកមួយចំនួននៃថ្នាក់។ សមាជិកមុំរក្សាទុកព័ត៌មានអំពីមុំបច្ចុប្បន្ននៃការបង្វិលគូបជុំវិញអ័ក្ស y ។ សមាជិក Verti ces3 រក្សាទុកផ្នែកខាងលើនៃគំរូគូប ដែលយើងនឹងកំណត់ក្នុងពេលដ៏ខ្លី។ លើសពីនេះទៀត យើងមានឧទាហរណ៍នៃថ្នាក់ AmbientLight, PointLight និង Directional Light ក៏ដូចជាឧទាហរណ៍នៃថ្នាក់សម្ភារៈផងដែរ។
បន្ទាប់មកអ្នកសាងសង់។ នៅទីនេះ ចំនុចកំពូលនៃគំរូគូបត្រូវបានបង្កើត ហើយវាយនភាពនៃប្រអប់ត្រូវបានផ្ទុក។ យើងក៏ចាប់ផ្តើមភ្លើង និងសម្ភារៈផងដែរ។ ពណ៌ backlight មានពណ៌បៃតងស្រាល។ ប្រភពដែលដឹកនាំគឺពណ៌ក្រហម ហើយមានទីតាំងនៅចំណុច (3; 3; 0) នៃពិភពលោករបស់យើង។ ប្រភពពន្លឺទិសដៅមានពណ៌ខៀវ ពន្លឺធ្លាក់ពីខាងឆ្វេង។ សម្រាប់សម្ភារៈយើងប្រើតម្លៃលំនាំដើម (ផ្ទៃខាងក្រោយពណ៌សសម្រាប់សមាសធាតុសាយភាយ និងពណ៌ខ្មៅសម្រាប់សមាសធាតុ specular)។
នៅក្នុងវិធីសាស្រ្តបន្ត យើងត្រូវប្រាកដថាវាយនភាពរបស់យើងត្រូវបានផ្ទុក (ឡើងវិញ) ប្រសិនបើបរិបទត្រូវបានបាត់បង់។
វិធីសាស្ត្រ createCube គឺសំខាន់មិនផ្លាស់ប្តូរពីឧទាហរណ៍ពីមុនទេ។ ទោះយ៉ាងណាក៏ដោយ លើកនេះ យើងបន្ថែមធម្មតាទៅចំនុចកំពូលនីមួយៗ ដូចបង្ហាញក្នុងរូប។ ១១.៥. ក្រៅពីនោះ អ្វីៗនៅដដែល។
នៅក្នុងវិធីសាស្រ្តធ្វើឱ្យទាន់សម័យយើងគ្រាន់តែបង្កើនមុំបង្វិលនៃគូប។
នេះគឺជាកន្លែងដែលវាកាន់តែគួរឱ្យចាប់អារម្មណ៍។ បន្ទាត់ពីរបីដំបូងគឺកូដ boilerplate ដើម្បីជម្រះពណ៌ និងជម្រៅសតិបណ្ដោះអាសន្ន បើកការធ្វើតេស្តជម្រៅ និងកំណត់វិសាលភាព។
បន្ទាប់មក យើងកំណត់ម៉ាទ្រីសការព្យាករស្មើនឹងម៉ាទ្រីសទស្សន៍ទាយដោយប្រើប្រាស់វិធីសាស្ត្រ gl uPerspecti ve ហើយក៏ប្រើវិធីសាស្ត្រ gl uLookAt សម្រាប់ម៉ាទ្រីសមើលគំរូផងដែរ ដោយសារកាមេរ៉ាដំណើរការដូចគ្នាដូចក្នុងរូប។ ១១.៦.
បន្ទាប់មកយើងអនុញ្ញាតឱ្យប្រើភ្លើងបំភ្លឺ។ នៅពេលនេះ មិនទាន់កំណត់ភ្លើងនៅឡើយទេ ដូច្នេះយើងកំណត់វានៅក្នុងជួរបន្ទាប់ដោយហៅវិធីសាស្ត្រលើភ្លើង និងសម្ភារៈ។
ដូចធម្មតា យើងក៏បើកការវាយនភាព និងចងវាយនភាពប្រអប់ផងដែរ។ ជាចុងក្រោយ យើងហៅវិធីសាស្ត្រ gl RotatefC) ដើម្បីបង្វិលគូប ហើយបន្ទាប់មកគូរបន្ទាត់បញ្ឈររបស់វាដោយប្រើការហៅដែលបានដាក់យ៉ាងល្អទៅកាន់ឧទាហរណ៍នៃថ្នាក់ Verti ces3 ។
នៅចុងបញ្ចប់នៃវិធីសាស្ត្រ យើងបិទភ្លើងកន្លែង និងទិសដៅ (សូមចាំថា អំពូល Backlight គឺជាស្ថានភាពសកល) ក៏ដូចជាការធ្វើតេស្តវាយនភាព និងជម្រៅផងដែរ។ នោះហើយជាវាសម្រាប់បំភ្លឺនៅក្នុង OpenGL ES ។
នៅសល់នៃថ្នាក់រៀនគឺទទេ; យើងមិនចាំបាច់ធ្វើសកម្មភាពណាមួយក្នុងករណីមានការផ្អាកនោះទេ។ នៅក្នុងរូបភព។ រូបភាព 11.7 បង្ហាញលទ្ធផលនៃកម្មវិធី។
អង្ករ។ ១១.៧. ឈុតដែលបង្ហាញក្នុងរូប។ 11.6 បង្ហាញជាមួយ OpenGL ES
កំណត់ចំណាំមួយចំនួនអំពីភ្លើងបំភ្លឺនៅក្នុង OpenGL ES
ខណៈពេលដែលការប្រើប្រាស់ភ្លើងអាចបន្ថែមរសជាតិដល់ហ្គេមរបស់អ្នក វាមានដែនកំណត់ និងគុណវិបត្តិរបស់វា។ មានរឿងមួយចំនួនដែលអ្នកគួរយល់ដឹង។
ការប្រើប្រាស់ភ្លើងប្រើប្រាស់ធនធានច្រើនពេក ជាពិសេសអាចកត់សម្គាល់បាននៅលើឧបករណ៍យឺត។ ប្រើពន្លឺដោយប្រុងប្រយ័ត្ន។ ប្រភពពន្លឺកាន់តែច្រើនដែលអ្នកពណ៌នា ការគណនាកាន់តែច្រើននឹងត្រូវបានទាមទារដើម្បីបង្ហាញឈុត។
ទីតាំង/ទិសដៅនៃប្រភពពន្លឺចំណុច/ទិសដៅគួរតែត្រូវបានកំណត់បន្ទាប់ពីម៉ាទ្រីសរបស់កាមេរ៉ាត្រូវបានផ្ទុក ហើយមុនពេលម៉ាទ្រីសមើលគំរូត្រូវបានគុណដោយម៉ាទ្រីសផ្សេងទៀតដើម្បីផ្លាស់ទី និងបង្វិលវត្ថុ។ នេះជាការរិះគន់។ ប្រសិនបើការណែនាំទាំងនេះមិនត្រូវបានអនុវត្តទេ វត្ថុបុរាណពន្លឺដែលមិនអាចពន្យល់បានអាចនឹងកើតឡើង។
នៅពេលអ្នកប្រើវិធីសាស្ត្រ gl Seal ef ដើម្បីប្តូរទំហំម៉ូដែល ភាពធម្មតារបស់វាក៏នឹងត្រូវបានធ្វើមាត្រដ្ឋានផងដែរ។ នេះមិនល្អទេព្រោះ OpenGL ES រំពឹងថាធម្មតានឹងមានប៉ារ៉ាម៉ែត្រនៅក្នុងឯកតាដែលបានផ្តល់ឱ្យ។ ដើម្បីដោះស្រាយបញ្ហានេះ អ្នកអាចប្រើពាក្យបញ្ជា glEnable(GL10.GL NORMALIZE) ឬក្នុងកាលៈទេសៈខ្លះ gl Enable(GL10 .GL RESCALE N0RMAL)។ ខ្ញុំជឿថាពាក្យបញ្ជាទីមួយគួរតែត្រូវបានប្រើព្រោះការប្រើទីពីរមានកម្រិតនិងការធ្លាក់ចុះ។ បញ្ហាគឺថាការធ្វើឱ្យធម្មតាឬធ្វើឱ្យធម្មតាឡើងវិញតម្រូវឱ្យមានថាមពលដំណើរការច្រើន។ ដំណោះស្រាយដ៏ល្អបំផុតពីទស្សនៈនៃការអនុវត្តគឺមិនត្រូវធ្វើមាត្រដ្ឋានវត្ថុបំភ្លឺ។
ដូចដែលអ្នកអាចមើលឃើញ យើងបានណែនាំម៉ាទ្រីសធម្មតាបន្ថែម វាចាំបាច់ក្នុងការផ្ទេរភាពធម្មតារបស់វត្ថុពីប្រព័ន្ធសំរបសំរួលមូលដ្ឋានរបស់វត្ថុទៅកាន់ពិភពលោកមួយ នេះគឺចាំបាច់ដើម្បីគណនាពន្លឺនៅក្នុងប្រព័ន្ធកូអរដោនេពិភពលោក។
គួរកត់សម្គាល់ថានៅពេលប្រើ FFP OpenGL ពន្លឺត្រូវបានគណនាមិននៅក្នុងប្រព័ន្ធកូអរដោនេពិភពលោកនោះទេប៉ុន្តែនៅក្នុងប្រព័ន្ធកូអរដោនេទិដ្ឋភាព។ តាមគំនិតខ្ញុំ នេះមិនងាយស្រួលទេ ព្រោះ... ប្រព័ន្ធកូអរដោនេទិដ្ឋភាពត្រូវបានភ្ជាប់ទៅកាមេរ៉ាហើយវាងាយស្រួលក្នុងការកំណត់ប្រភពពន្លឺនៅក្នុងប្រព័ន្ធកូអរដោនេពិភពលោកហើយវានៅទីនោះដែលការគណនាទាំងមូលត្រូវបានអនុវត្ត។
ការគណនាពន្លឺនៅក្នុងមេរៀននេះប្រើគំរូស្រមោល Phong ។ គំនិតសំខាន់នៃគំរូគឺថាការបំភ្លឺចុងក្រោយនៃវត្ថុមួយមានធាតុផ្សំបីយ៉ាង៖
បន្ថែមពីលើប៉ារ៉ាម៉ែត្រទាំងនេះ យើងនឹងបន្ថែមពន្លឺផ្ទាល់ខ្លួនរបស់យើងនៃសម្ភារៈ (ការបំភាយ) ប៉ារ៉ាម៉ែត្រនេះអនុញ្ញាតឱ្យអ្នករំលេចវត្ថុមួយទោះបីជាវាមិនត្រូវបានបំភ្លឺដោយប្រភពពន្លឺណាមួយក៏ដោយ។
ដូច្នោះហើយសមាសធាតុនីមួយៗត្រូវបានគណនាដោយគិតគូរពីប៉ារ៉ាម៉ែត្រនៃប្រភពពន្លឺនិងសម្ភារៈនៃវត្ថុ។ អ្នកអាចទទួលបានព័ត៌មានលម្អិតបន្ថែមអំពីគំរូភ្លើងបំភ្លឺនេះនៅក្នុងអត្ថបទនេះ។
ការគណនាពន្លឺអាចជាការបំភ្លឺក្នុងទិសដៅឬពន្លឺក្នុងមួយភីកសែល។ នៅក្នុងមេរៀននេះ យើងនឹងពិនិត្យមើលការបំភ្លឺពីភីកសែល ដោយភីកសែល វាអនុញ្ញាតឱ្យអ្នកធ្វើឱ្យលម្អិតមិនគ្រប់គ្រាន់នៃគំរូពហុកោណ និងគណនាការបំភ្លឺបានត្រឹមត្រូវជាងនៅចំណុចនីមួយៗនៃវត្ថុ។ ការគណនាចម្បងនៃពន្លឺក្នុងមួយភីកសែលកើតឡើងនៅក្នុងស្រមោលបំណែក។
មុនពេលអ្នកចាប់ផ្តើមគណនាពន្លឺ អ្នកត្រូវគណនា និងផ្ទេរប៉ារ៉ាម៉ែត្រ vertex មួយចំនួនពី vertex shader ទៅកាន់ fragment shader:
ពន្លឺធម្មតាចំពោះផ្ទៃវត្ថុ និងទិសដៅនៃពន្លឺឧបទ្ទវហេតុ ត្រូវបានប្រើដើម្បីគណនាពន្លឺដែលសាយភាយ និងជាក់លាក់ ទោះបីជាយ៉ាងណាក៏ដោយ ដើម្បីគណនាពន្លឺដែលឆ្លុះបញ្ចាំង អ្នកក៏ត្រូវដឹងបន្ថែមអំពីទិសដៅនៃទិដ្ឋភាពរបស់អ្នកសង្កេតការណ៍ផងដែរ។ ចំងាយពីចំនុចកំពូលទៅប្រភពពន្លឺគឺចាំបាច់ដើម្បីគណនាមេគុណ attenuation រួម។ ក្រឡាចត្រង្គ vertex នឹងមើលទៅដូចនេះ៖
#version 330 core #define VERT_POSITION 0 #define VERT_TEXCOORD 1 #define VERT_NORMAL 2 layout (location = VERT_POSITION) នៅក្នុងទីតាំង vec3; ប្លង់(ទីតាំង = VERT_TEXCOORD) ក្នុង vec2 texcoord; ប្លង់(ទីតាំង = VERT_NORMAL) ក្នុង vec3 ធម្មតា; // ប៉ារ៉ាម៉ែត្រនៃការផ្លាស់ប្តូររចនាសម្ព័ន្ធឯកសណ្ឋាន Transform (គំរូ mat4; mat4 viewProjection; mat3 normal; vec3 viewPosition;) transform; // ប៉ារ៉ាម៉ែត្រនៃប្រភពពន្លឺចំណុចរចនាសម្ព័ន្ធឯកសណ្ឋាន PointLight (ទីតាំង vec4; vec4 ambient; vec4 diffuse; vec4 specular; vec3 attenuation;) light; // ប៉ារ៉ាម៉ែត្រសម្រាប់ Shader បំណែកចេញ Vertex ( vec2 texcoord; vec3 normal; vec3 lightDir; vec3 viewDir; ចម្ងាយអណ្ដែត;) Vert; មោឃៈ (void) ( // បំប្លែងកូអរដោនេនៃចំនុចកំពូលទៅជាប្រព័ន្ធកូអរដោណេពិភពលោក vec4 vertex = transform.model * vec4(ទីតាំង, 1.0); // ទិសដៅពីកំពូលទៅប្រភពពន្លឺនៅក្នុងប្រព័ន្ធកូអរដោនេពិភពលោក vec4 lightDir = light.position - vertex; // ឆ្លងកាត់ប៉ារ៉ាម៉ែត្រខ្លះទៅ Shader បំណែក // ឆ្លងកាត់កូអរដោនេវាយនភាព Vert.texcoord = texcoord; // ឆ្លងកាត់ធម្មតានៃប្រព័ន្ធកូអរដោនេពិភពលោក Vert.normal = transform.normal * ធម្មតា; // បញ្ជូនទិសដៅទៅប្រភពពន្លឺ Vert.lightDir = vec3(lightDir); // បញ្ជូនទិសដៅពីចំណុចកំពូលទៅអ្នកសង្កេតការណ៍ក្នុងប្រព័ន្ធកូអរដោណេពិភពលោក Vert.viewDir = transform.viewPosition - vec3(vertex); // បញ្ជូនចម្ងាយពីចំនុចកំពូលទៅប្រភពពន្លឺ Vert.distance = ប្រវែង(lightDir); // បំប្លែងកូអរដោនេនៃចំនុចកំពូលទៅជាភាពដូចគ្នា។ gl_Position = transform.viewProjection * vertex; )
ស្នាដៃនៃឆ្នាំ។ Voloshin Maximilian ។ VALOR នៃ POET មួយ។ 1. កែសម្រួលកំណាព្យដូចជាអត្ថបទនៃការបញ្ជូនទៅក្រៅប្រទេស៖ ភាពស្ងួត ភាពច្បាស់លាស់ សម្ពាធ - គ្រប់ពាក្យទាំងអស់គឺនៅលើការប្រុងប្រយ័ត្ន។
កាត់អក្សរតាមអក្សរលើថ្មរឹង និងចង្អៀត៖ ពាក្យឃ្លាតៗ អំណាចរបស់វាកាន់តែខ្លាំង។ វិចារណញ្ញាណនៃការគិតគឺស្មើនឹងឃ្លាស្ងៀម។
លុបពាក្យ "សម្រស់", "ការបំផុសគំនិត" ចេញពីវចនានុក្រម - វចនានុក្រមដ៏អាក្រក់នៃ rhymers ។ ដល់កវី - ការយល់ដឹង៖ សេចក្តីពិត ការរចនា ផែនការ សមមូល សង្ខេប និងភាពត្រឹមត្រូវ។ ក្នុងការប្រកបដោយស្មារតីរឹងប៉ឹង មានការបំផុសគំនិត និងកិត្តិយសរបស់កវី៖ ដើម្បីធ្វើឲ្យមានការប្រុងប្រយ័ត្នខ្ពស់ក្នុងបញ្ហាថ្លង់។ Voloshin M.A. បណ្ណាល័យ៖ Oryol Regional Scientific Universal Public Library ដាក់ឈ្មោះតាម។ I.A. ប៊ុណ្ណា។ - អិម, ; ស្នាដៃដែលបានជ្រើសរើស៖ ជា ២ ភាគ។
អិម , ; ផ្សែងក្រហម៖ រឿង។ - អិម, ; Gladyshev មកពីក្រុមហ៊ុនឈ្លបយកការណ៍៖ រឿងរ៉ាវ។ - អិម, ; អេឆេឡុង; ជៀសមិនរួច: ប្រលោមលោក។ គាត់បានធ្វើការបកប្រែជាច្រើនរបស់ Mari និង Udmurt កវី។ យូរៗម្ដង ខ្ញុំក៏ព្យាយាមប្រើពាក្យសំដី។ អូ។ Maximilian Aleksandrovich Voloshin () គឺជាកវីដ៏អស្ចារ្យបំផុតម្នាក់នៃទីបីដំបូងនៃសតវត្សទី 20 ។ គាត់គឺជាវិចិត្រករដ៏ប៉ិនប្រសប់ អ្នកនិពន្ធទំនុកច្រៀងពហុមុខ ដែលបានធ្វើដំណើរពីនិមិត្តរូប កំណាព្យ esoteric ទៅជាកំណាព្យសង្គម-សារព័ត៌មាន និងវិទ្យាសាស្រ្ត-ទស្សនវិជ្ជា តាមរយៈទស្សនវិជ្ជាបែបនរវិទ្យា-ទៅកាន់ "ឧត្តមគតិនៃទីក្រុងនៃព្រះ" ។
ការបោះពុម្ពដែលបានស្នើឡើងផ្តល់ឱ្យអ្នកអាននូវឱកាសដើម្បីស្គាល់មិនត្រឹមតែជាមួយនឹងស្នាដៃកំណាព្យដ៏ល្អបំផុតរបស់ Voloshin ប៉ុណ្ណោះទេ ថែមទាំងជាមួយនឹងស្នាដៃដ៏គួរឱ្យចាប់អារម្មណ៍បំផុតរបស់គាត់ស្តីពីសោភ័ណភាព កំណាព្យ អនុស្សាវរីយ៍ សារព័ត៌មាន និងអក្សរដែលទាក់ទងនឹងព្រឹត្តិការណ៍ដ៏អស្ចារ្យនៅក្នុងជីវិតរបស់ប្រទេស។ អ្នកនិពន្ធ។ Voloshin Maximilian ។ កំណាព្យទាំងអស់ដោយអ្នកនិពន្ធ។ ការងារ។ ភាពក្លាហានរបស់កវី។ 2. ផ្កាយ។ បង្កើតបណ្តុំអ្នកនិពន្ធ និងកំណាព្យដែលចូលចិត្ត!
ជជែកជាមួយមនុស្សដែលមានគំនិតដូចគ្នា! សរសេរការពិនិត្យឡើងវិញ ចូលរួមក្នុងការប្រកួតកំណាព្យ និងការប្រកួតប្រជែង! ចូលរួមល្អបំផុត! អរគុណសម្រាប់ការចូលរួម Poembook! សំបុត្រដែលមានទិន្នន័យចូលប្រើគណនីត្រូវបានផ្ញើទៅអ៊ីមែលរបស់អ្នក!
អ្នកត្រូវតែចូលក្នុងរយៈពេល 24 ម៉ោង។ បើមិនដូច្នោះទេគណនីនឹងត្រូវបានលុប! អ្នកប្រើប្រាស់ដែលបានចុះឈ្មោះទទួលបានអត្ថប្រយោជន៍ជាច្រើន៖ បោះពុម្ពកំណាព្យ - ដឹងពីទេពកោសល្យរបស់អ្នក! បង្កើតបណ្តុំអ្នកនិពន្ធ និងកំណាព្យដែលចូលចិត្ត! ជជែកជាមួយមនុស្សដែលមានគំនិតដូចគ្នា! សរសេរការពិនិត្យឡើងវិញ ចូលរួមក្នុងការប្រកួតកំណាព្យ និងការប្រកួតប្រជែង! Maximilian Voloshin ។ ការពិពណ៌នា។ Maximilian Aleksandrovich Voloshin គឺជាកវីដ៏អស្ចារ្យបំផុតម្នាក់នៃសតវត្សទី 3 ដំបូងនៃសតវត្សទី 20 ។
គាត់គឺជាវិចិត្រករដ៏ប៉ិនប្រសប់ អ្នកនិពន្ធទំនុកច្រៀងពហុមុខ ដែលបានធ្វើដំណើរពីនិមិត្តរូប កំណាព្យ esoteric ទៅជាកំណាព្យសង្គម-សារព័ត៌មាន និងវិទ្យាសាស្រ្ត-ទស្សនវិជ្ជា តាមរយៈទស្សនវិជ្ជាបែបនរវិទ្យា-ទៅកាន់ "ឧត្តមគតិនៃទីក្រុងនៃព្រះ" ។ ការបោះពុម្ពដែលបានស្នើឡើងផ្តល់ឱ្យអ្នកអាននូវឱកាសដើម្បីស្គាល់មិនត្រឹមតែជាមួយនឹងស្នាដៃកំណាព្យដ៏ល្អបំផុតរបស់ Voloshin ប៉ុណ្ណោះទេ ប៉ុន្តែថែមទាំងជាមួយនឹងស្នាដៃដ៏គួរឱ្យចាប់អារម្មណ៍បំផុតរបស់គាត់អំពីសោភ័ណភាព កំណាព្យ អនុស្សាវរីយ៍ សារព័ត៌មាន និងអក្សរទាក់ទងនឹងរឿងល្ខោន។
ស្នាដៃ និងអក្សរដែលបានជ្រើសរើស។ M.A. Voloshin ។ តម្លៃ។ ជូត។ Maximilian Aleksandrovich Voloshin គឺជាកវីដ៏អស្ចារ្យបំផុតម្នាក់នៃសតវត្សទី 3 ដំបូងនៃសតវត្សទី 20 ។ គាត់គឺជាវិចិត្រករដ៏ប៉ិនប្រសប់ អ្នកនិពន្ធទំនុកច្រៀងពហុមុខ ដែលបានធ្វើដំណើរពីនិមិត្តរូប កំណាព្យ esoteric ទៅជាកំណាព្យសង្គម-សារព័ត៌មាន និងវិទ្យាសាស្រ្ត-ទស្សនវិជ្ជា តាមរយៈទស្សនវិជ្ជាបែបនរវិទ្យា-ទៅកាន់ "ឧត្តមគតិនៃទីក្រុងនៃព្រះ" ។
Voloshin M.A., The Valor's Poet: ស្នាដៃ និងអក្សរដែលបានជ្រើសរើស។ ស៊េរី៖ បណ្ណាល័យថ្មីនៃបុរាណរុស្ស៊ី៖ តម្រូវឱ្យចម្លងក្បួនដង្ហែ ទីក្រុង ទំព័រ ការពិពណ៌នាសៀវភៅ។ Maximilian Aleksandrovich Voloshin () គឺជាកវីដ៏អស្ចារ្យបំផុតម្នាក់នៃទីបីដំបូងនៃសតវត្សទី 20 ។ គាត់គឺជាវិចិត្រករដ៏ប៉ិនប្រសប់ អ្នកនិពន្ធទំនុកច្រៀងពហុមុខ ដែលបានធ្វើដំណើរពីនិមិត្តរូប កំណាព្យ esoteric ទៅជាកំណាព្យសង្គម-សារព័ត៌មាន និងវិទ្យាសាស្រ្ត-ទស្សនវិជ្ជា តាមរយៈទស្សនវិជ្ជាបែបនរវិទ្យា-ទៅកាន់ "ឧត្តមគតិនៃទីក្រុងនៃព្រះ" ។
ប្រភេទការរុករកក្រោយ