Steps3D - Tutorials - Розширення роботи з текстурами, що увійшли в останні версії OpenGL
Розширення ARB_texture_swizzle
Дане розширення (що увійшло OpenGL 3.3) дозволяє задати часто використовувану в GLSL операціюswizzleдля довільної текстури. Для текстури можна задати, що має повертатися під час читання для кожного з чотирьох колірних каналів. Як джерело даних для каналу може виступати як один із чотирьох каналів (GL_RED, GL_GREEN, GL_BLUE і GL_ALPHA), так і значення нуль та одиниця (GL_ZERO та GL_ONE).
Завдання "swizzle" можна робити покомпонентно, а можна задати відразу для всіх чотирьох компонент. Зауважте, що таким чином можна визначити значення всіх чотирьох каналів для текстури, що містить менше чотирьох каналів (наприклад, двоканальної RG-текстури).
Для завдання перестановки для активної (bind) текстури типуtargetслужать функціїglTexParameteriтаglTexParameteriv. Так наступний приклад змінює RED та ALPHA компоненти текстури на нуль та одиницю.
Наступний приклад переставляє місцями RED і BLUE компоненти, а компоненти ALPHA повертає нуль, роблячи це за один викликglTexParameteriv.
Отримати поточну перестановку можна за допомогою функціїglGetTexParameteriv:
Розширення ARB_seamless_cube_map
Традиційно, при читанні з кубічної текстурної карти відбувається вибір однієї зі сторін і далі всі операції йде в межах обраної сторони. Хоча в багатьох випадках це і працює, проте є ситуації, коли така поведінка в принципі є невірною. Так при білінійній інтерполяції потрібно прочитати блок 2х2 текселу і якщо потрібне нам значення лежить близько до ребра, то відповідні чотири значення повинні братися з різних боків кубічної карти, чого в даниймомент не відбувається (тобто всі чотири значення беруться в межах однієї сторони).
Дане розширення (що увійшло OpenGL 3.2) дає нарешті можливість коректно обробляти подібні випадки і брати значення для фільтрації кубічної текстури при необхідності з різних сторін. Ця функціональність є глобальною і включається та вимикається за допомогою командglEnableтаglDisableз параметром GL_TEXTURE_CUBE_MAP_SEAMLESS.
Розширення ARB_texture_gather
Як зазначалося для фільтрації текстури читається відразу блок 2х2 текселу і з цих чотирьох значень будується одне. Розширення ARB_texture_gather додає в GLSL можливість, яка присутня в DX10.1, а саме отримати відразу всі чотири значення за одну команду без будь-якої фільтрації. На жаль, можна отримати лише значення для RED-компонент блоку текселів, які повертаються як 4-мірний вектор. Ця функціональність увійшла до OpenGL 4.0.
При цьому якщо відповідний блок 2х2 тексел має текстурні координати(i0,j0)-(i1,j1), то повернутий вектор буде влаштований наступним чином:
Зауважте, що за допомогою розширення ARB_texture_swizzle можна замість RED-компоненти підставити будь-яку іншу. У GLSL додано такі функції:
Черезgvec4тут позначений будь-який із класівvec4,ivec4таuvec4, відповідний типу семплераsampler(який також може повертати речові, цілі та цілі невід'ємні значення).
Розширення ARB_texture_rgb10_a2ui
Це розширення (що увійшло OpenGL 3.3) вводить новий ненормалізований формат текстур - GL_RGB10_A2UI. У цьому форматі на червоний, зелений та синій канали відводиться по 10 біт, а на альфа-канал – всього 2 біти, таким чином одинтексел займає рівно 32 біти. Зверніть увагу, що текстури цього формату можна здійснювати рендеринг.
Рис 1. Розкладання піксела по бітах усередині GPU DRAM.
На наступному малюнку наводиться як бітове значення 0x22222222 розкладається в RGBA-подання.
Рис 2. Розкладання піксела по бітах усередині GPU DRAM.
Існує два способи заповнення такої текстури даними - можна як для звичайної текстури передати покомпонентний масив (використовуючи як тип даних дляglTexImage*константи GL_UNSIGNED_INT або GL_UNSIGNED_SHORT), тоді упаковка даних буде зроблена автоматично. Другий варіант - відразу передати вже упаковані дані (по одному 32-му слову на тексел), для цього як параметрtypeфункціїglTexImage*слід задати константу GL_UNSIGNED_INT_10_10_10_2. Нижче наводиться простий приклад створення подібної текстури та заповнення її даними.
Розширення ARB_texture_cube_map_array
До складу OpenGL 3.0 увійшли масиви одновимірних і двовимірних текстур (введені раніше через розширення EXT_texture_array). Підтримка масивів кубічних текстурних карт з'явилася пізніше, вона вводиться розширенням ARB_texture_cube_map_array і увійшла до складу OpenGL 4.0.
Масиву кубічних текстур відповідає тип (target) GL_TEXTURE_CUBE_MAP_ARRAY, всі кубічні карти, що входять до складу масиву, повинні мати однаковий розмір грані та внутрішній формат. Для завдання даних масиву служить функціяglTexImage3D.
При цьому параметрtargetдорівнює GL_TEXTURE_CUBE_MAP_ARRAY, параметриwidthіheightзбігаються, а значення параметраdepthдорівнює розміру масиву, помноженому на 6, т .е. масив кубічних текстур сприймається просто як масив граней - спершу йдуть шістьграней першої карти, потім шість граней другої карти тощо.
Максимальний розмір масиву можна дізнатися за допомогою наступного фрагмента коду:
Можна використовувати окремі грані масиву кубічних текстур як цілі для рендерингу за допомогою функціїglFramebufferTextureLayer:
При цьомуlayer/6задає елемент масиву, аlayer % 6- грант обраного елемента, куди буде здійснюватись рендеринг. ЗамістьglFramebufferTextureLayerможна використовувати функціюglFramebufferTextureARB, задавши відразу весь текстурний масив як ціль для рендерингу. У цьому випадку вибір елемента масиву і конкретної грані здійснюється в геометричному шейдері записом в зміннуgl_Layer, яка грає таку ж роль, як і параметрlayerу викликуglFramebufferTextureLayer.
При роботі з масивами кубічних текстур використовуються всі чотири текстурні координати -(s,t,r,q), координатаqслужить для вибору елемента з масиву, а далі координати(s,t,r)використовуються для вибірки значення вибраного елемента масиву.
Для роботи з масиву кубічних текстур в GLSL були додані нові типи семплерів -samplerCubeArray,sampleCubeArrayShadow,isamplerCubeArrayтаusampleCubeArrayта відповідні функції читання.