glCopyPixels - копіювання пікселів у буфер кадру.

C-специфікація

void glCopyPixels (GLint x,
                   GLint y,
                   GLsizei width,
                   GLsizei height,
                   GLenum type) ;

 

Параметри

x, y вказують на координати вікна лівого правого кута прямокутного регіону, який необхідно скопіювати.

width, height вказують розмір прямокутного регіону пікселів, який необхідно скопіювати. Обидва повинні бути позитивними числами.

type вказує на колірні значення, значення глибини або трафарету, які необхідно скопіювати. Приймаються символічні константи GL_COLOR, GL_DEPTH і GL_STENCIL.

Опис

Функція glCopyPixels копіює пікселі прямокутного регіону екрану з вказаного буферу кадру у регіон відносний до поточної растрової позиції. Її операції працює тільки якщо цілий регіон пікселів міститься у показуваній порції вікна. Результати копіювання з зовні вікна, або з регіону вікна, який не відображається, являються залежними від реалізації і невизначеними.

Параметри x і y вказують віконні координати нижнього лівого кута прямокутного регіону, який необхідно скопіювати. Параметри width і height вказують розмір прямокутного регіону, який потрібно скопіювати. Обидва параметри width і height не повинні бути негативними.

Декілька параметрів контролюють обробку піксельних даних, під час їх копіювання. Дані параметри встановлюються за допомогою трьох команд: glPixelTransfer, glPixelMap і glPixelZoom. Даний документ в більшості описує дії команди glCopyPixels, але не усі параметри, які вказуються цими трьома командами.

Команда glCopyPixels копіює значення з кожного пікселя з нижнім лівим кутом x+i y+j для 0<=i<width і 0<=j<height. Говориться, що це є i-тий піксель у j-тому рядку. Пікселі копіюються у порядку рядків з найнижчого до найвищого, зліва на право для кожного рядка.

Параметр type вказує чи потрібно копіювати колір, глибину або трафаратні дані. Деталі кожної передачі для кожного типу даних наступні:

  • GL_COLOR Індекси кольорів RGBA зчитуються з буферу поточного вказаного у якості джерела для зчитування (перегляньте glReadBuffer). Якщо система OpenGL міститься у індексованому режимі, кожен індекс, який зчитується з цього буферу перетворюється у формат фіксованої точки з невизначеною кількістю бітів справа бінарного формату. Кожен індекс зміщується вліво на значення GL_INDEX_SHIFT бітів, і додається до значення GL_INDEX_OFFSET. Якщо GL_INDEX_SHIFT містить негативне значення, зміщення відбувається вправо. У будь-якому випадку, нульові біти заповнюють не вказані позиції у результаті. Якщо GL_MAP_COLOR містить значення true, індекс заміщується значенням, на яке він відноситься у таблиці GL_PIXEL_MAP_I_TO_I. Незалежно від того чи відбувся пошук і заміна, ціла частина індексу проходить операцію AND з значенням 2b-1, де b являється кількістю бітів у колір індексному буфері. Якщо у системі OpenGL активовано режим RGBA, компоненти червоного, синього, зеленого і канал прозорості кожного пікселя, який зчитується перетворюється до формату внутрішнього представлення дійсного числа з невизначеною точністю. Дане перетворення відображає найбільше значення компоненту у 1.0, а компонент з значенням 0 у 0.0. Результуючі дійсні значення колірних компонентів перемножуються на значення GL_c_SCALE і додається до GL_c_BIAS де c являється RED, GREEN, BLUE, і ALPHA для відповідних колірних компонентів. Результат обрізається до проміжку [0,1]. Якщо параметр GL_MAP_COLOR містить значення true, кожен з колірних компонентів масштабується на розмір у таблиці пошуку GL_PIXEL_MAP_c_TO_c, і замінюється на значення, яке воно відображає у даній таблиці. с являється R, G, B, або A. Якщо підтримується розширення ARB_imaging, колірні значення можуть додатково оброблятися за допомогою пошуку по таблицям, колір-матричними перетвореннями, і фільтруванням згортання. Після цього, система OpenGL перетворює результуючі індекси або значення RGBA кольорів у фрагменти, за допомогою прикріплювання поточної растрової позиції z координати і текстурних координат до кожного пікселя, після цього присвоює віконні координати xr+i yr+j, де xr, yr являються поточними растровими позиціями і піксель є i-тим пікселем у j-тому рядку. Дані піксельні фрагменти трактуються як фрагменти згенеровані точками растеризації, лініями або багатокутниками. Текстурні перетворення, димка і усі фрагментні операції застосовуються перед тим, як фрагменти записуються у буфер кадру.
  • GL_DEPTH значення глибини зчитуються з буферу глибини і перетворюються безпосередньо у внутрішній формат представлення дійсних чисел з невідомою точністю. Кінцеве дійсне значення глибини перемножується на GL_DEPTH_SCALE і додається до GL_DEPTH_BIAS. Результат обрізається до проміжку [0;1]. Система OpenGL перетворює кінцеві компоненти глибини у фрагменти, приєднуючи поточний колір растрової позиції або колірний індекс і текстурні координати у кожен піксель, після чого присвоюються віконним координатам xr+i yr+j, де xr, yr являються поточними растровими позиціями з i-тим піксельом у j-тому рядку. Піксельні фрагменти трактуються на подобі фрагментів згенерованих растровими точками, лініями або полігонами. Накладання текстур, туману і усі фрагментні операції застосовуютья перед тим, як фрагмент записується у буфер кадру.
  • GL_STENCIL. Трафаретні індекси зчитуються з трафаретного буферу і перетворюються у дійсне число внутрішнього представлення з невизначеною кількістю бітів з права бінарної точки. Кожен індекс з фіксованою точкою зміщується вліво на GL_INDEX_SHIFT бітів, і додається до GL_INDEX_OFFSET. Якщо значення параметру GL_INDEX_SHIFT являється від'ємним, зміщення відбувається направо. У обох випадках, нульові біти заповнюють не вказані бітові позиції у кінцевому результаті. Якщо параметр GL_MAP_STENCIL містить значення true, індекси замінюються значенням на яке воно вказує у таблиці GL_PIXEL_MAP_S_TO_S. Не залежно від того, чи відбувалось заміщення з таблиці, цілочисельна частина індексу проходить операцію AND з значенням 2b-1, де b являється кількістю бітів у буфері трафарету. Кінцеві індекси трафарету записуються у буфер трафарету у спосіб, при якому індекс з i-тої позиції j-того рядка записується у позицію xr+i yr+j, де xr, yr являються поточною растровою позицією. Тільки текст піксельної власності, тест обрізання і накладання трафаретної маски змінюють значення цих операцій.

До даного моменту растеризація припускала множник масштабування з значенням 1.0. Якщо glPixelZoom використовується для зміни значень множників масштабу x і y пікселі перетворюються на фрагменти наступним чином. Якщо xr і yr являється поточною растровою позицією, і даний піксель міститься у i-тій позиції j-того рядка джерельного прямокутника пікселів, тоді фрагменти генеруються для пікселів центри яких містяться в прямокутнику з кутами у

xr+(zoom x)i; yr+(zoom y)j

і

xr + (zoom x)(i+1); yr + (zoom y) (j+1)

де zoom x являється значенням GL_ZOOM_X і zoom y являється значенням параметру GL_ZOOM_Y.

Приклади

Для копіювання колірного пікселя у лівому нижньому кута вікна до поточної растрової позиції, використовуйте

glCopyPixels (0, 0, 1, 1, GL_COLOR) ;

Нотатки

Режими встановлені за допомогою функції glPixelStore не впливають на операцію glCopyPixels.

Помилки

GL_INVALID_ENUM генерується якщо type не містить доступного значення.

GL_INVALID_VALUE генерується якщо width або height містить негативне значення.

GL_INVALID_OPERATION генеруються якщо type містить значення GL_DEPTH і не існує буфера глибини.

GL_INVALID_OPERATION генерується якщо type містить значення GL_STENCIL і не існує буфера трафарату.

GL_INVALID_OPERATION генерується якщо glCopyPixels викликається між відповідними викликами glBegin і glEnd.

Пов'язані параметри

glGet з аргументами GL_CURRENT_RASTER_POSITION

glGet з аргументом GL_CURRENT_RASTER_POSITION_VALID

Перегляньте також

glColorTable, glConvolutionFilter1D, glConvolutionFilter2D, glDepthFunc, glDrawBuffer, glDrawPixels, glMatrixMode, glPixelMap, glPixelTransfer, glPixelZoom, glRasterPos, glReadBuffer, glReadPixels, glSeparableFilter2D, glStencilFunc, glWindowPos

Оригінал

https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glCopyPixels.xml