О структуре буферов, хранящих информацию о пикселях экрана
О том, как считывать информацию о состоянии OpenGL
Информация о каждом пикселе хранится в различных областях памяти – буферах цвета, глубины, трафарета, буфере-аккумуляторе. Каждый буфер имеет стандартную структуру. Он состоит из битовых плоскостей. В каждой битовой плоскости хранится часть информации обо всех пикселях, выводимых на экран. На битовой плоскости столько же ячеек, сколько пикселей на экране. В каждой ячейке битовой плоскости может храниться только единичка или ноль – один бит информации. Отсюда название плоскости. Сколько битовых плоскостей в конкретном буфере, столько битов информации о каждом пикселе содержит буфер. Так, если в буфере две битовые плоскости, то на каждый пиксель приходится два бита информации, т.е. может быть 4 типа пикселей, отличающихся числами-индексами 0, 1, 2, 3. В общем случае в буфере с n битовыми плоскостями каждый пиксель может иметь 2n индексов со значениями от 0 до 2n – 1. К примеру, если в буфере красного цвета (Red) 8 битовых плоскостей, то каждый пиксель может иметь 28 = 256 интенсивностей красного в своем цвете.
Метод Get. Получение информации о состоянии OpenGL
Ответы на любые вопросы о текущем состоянии настроек OpenGL можно получить, используя метод Get из библиотеки OpenGL.
Метод Get позволяет получить, в частности, информацию об объеме всех буферов, на которые рассчитан формат пикселя. Добавьте в класс gl библиотеки GL раздел "Методы Get и их аргументы" со следующим содержанием
#region Методы Get и их аргументы
// Аргументы метода Get, для определения числа битовых плоскостей
// в буферах цвета RED,GREEN,BLUE,ALPHA
public const int RED_BITS = 0x0D52;
public const int GREEN_BITS = 0x0D53;
public const int BLUE_BITS = 0x0D54;
public const int ALPHA_BITS = 0x0D55;
// Аргумент метода Get, для определения числа битовых плоскостей в буфере глубины
public const int DEPTH_BITS = 0x0D56;
// Аргумент метода Get, для определения числа битовых плоскостей в буфере трафарета
public const int STENCIL_BITS = 0x0D57;
// Аргументы метода Get для определения числа битовых плоскостей в буфере-аккумуляторе
public const int ACCUM_RED_BITS = 0x0D58;
public const int ACCUM_GREEN_BITS = 0x0D59;
public const int ACCUM_BLUE_BITS = 0x0D5A;
public const int ACCUM_ALPHA_BITS = 0x0D5B;
///
/// Возвращает значения параметра с именем prmName в виде массива типа float.
/// Возвращает одно или несколько значений, отвечающих указанному типу параметра.
///
///
/// Символьная постоянная, обозначающая имя параметра,
/// значения которого следует возвратить.
///
///
/// Длина массива возвращаемых значений
///
///
/// Массив значений
///
public static float[] Get(int prmName, int arrayLength)
{
float[] resultArray = new float[arrayLength];
glGetFloatv(prmName, resultArray);
return resultArray;
}
#endregion
Добавьте в метод InitGL формы f3D оператор вывода в строку статуса информации о числе битовых плоскостей буферов цвета, глубины, трафарета и аккумулятора
// Сведения о буферах
stLabel.Text = stLabel.Text +
" Color: Red: " + gl.Get(gl.RED_BITS, 1)[0] +
" Green: " + gl.Get(gl.GREEN_BITS, 1)[0] +
" Blue: " + gl.Get(gl.BLUE_BITS, 1)[0] +
" Alpha: " + gl.Get(gl.ALPHA_BITS, 1)[0] +
" Depth: " + gl.Get(gl.DEPTH_BITS, 1)[0] +
" Stencil: " + gl.Get(gl.STENCIL_BITS, 1)[0] +
" Acc: Red: " + gl.Get(gl.ACCUM_RED_BITS, 1)[0] +
" Green: " + gl.Get(gl.ACCUM_GREEN_BITS, 1)[0] +
" Blue: " + gl.Get(gl.ACCUM_BLUE_BITS, 1)[0];
Посмотрите результат.
Метод GetString.
В библиотеке OpenGL есть метод GetString, позволяющий, в частности, получить сведения о версии библиотеки, установленной на компьютере, ее производителе и микросхеме, ответственной за визуализацию команд OpenGL (так называемый Renderer). Добавьте в раздел "Методы Get и их аргументы" класса gl библиотеки GL описание
///
/// Имя объекта-аргумента GetString для определения версии OpenGL.
///
public const int VERSION = 0x1F02;
///
/// Имя объекта-аргумента GetString для определения производителя OpenGL.
///
public const int VENDOR = 0x1F00;
///
/// Имя объекта-аргумента GetString для определения имени визуализатора OpenGL.
/// Возвращаемое имя специфично для конкретной аппаратной платформы компьютера.
///
public const int RENDERER = 0x1F01;
///
/// Возвращает указатель на объект с именем name.
///
[DllImport("OPENGL32.DLL")]
static extern IntPtr glGetString(int name);
///
/// Возвращает строку с объектом с именем name.
///
public static string GetString(int name)
{
IntPtr i = glGetString(name);
return Marshal.PtrToStringAnsi(i);
}
Добавьте к предыдущей редакции метода InitGL оператор вывода в строку статуса информации о версии, производителе и визуализаторе так, что метод InitGL примет вид
// Вывод результатов работы методов Get и GetString
stLabel.Text +=
" Color: Red: " + gl.Get(gl.RED_BITS, 1)[0] +
" Green: " + gl.Get(gl.GREEN_BITS, 1)[0] +
" Blue: " + gl.Get(gl.BLUE_BITS, 1)[0] +
" Alpha: " + gl.Get(gl.ALPHA_BITS, 1)[0] +
" Depth: " + gl.Get(gl.DEPTH_BITS, 1)[0] +
" Stencil: " + gl.Get(gl.STENCIL_BITS, 1)[0] +
" Acc: Red: " + gl.Get(gl.ACCUM_RED_BITS, 1)[0] +
" Green: " + gl.Get(gl.ACCUM_GREEN_BITS, 1)[0] +
" Blue: " + gl.Get(gl.ACCUM_BLUE_BITS, 1)[0] +
"; Version: " + gl.GetString(gl.VERSION) +
"; Vendor: " + gl.GetString(gl.VENDOR) +
"; Renderer: " + gl.GetString(gl.RENDERER);
}
Две последние строки – имя производителя (Vendor) и тип схемы воспроизведения команд OpenGL (Renderer) являются решающими в определении особенностей работы команд библиотеки OpenGL, установленной на компьютере.
Методы GetError и gluErrorString
Метод GetError из библиотеки opengl32.dll и метод gluErrorString из библиотеки glu32.dll позволяют получить информацию об ошибке, допущенной при обращении к командам OpenGL или при выполнении этих команд.
Для использования этих методов добавьте в раздел "Методы Get и их аргументы" класса gl библиотеки GL описание кодов возможных ошибок в форме констант и описание методов, используемых для регистрации ошибок. Комментарии, дающиеся в описании, позволяют понять смысл этих новых членов класса gl.
///
/// Код отсутствии ошибки.
/// Используется как результат вызова GetError.
///
const int NO_ERROR = 0;
///
/// Код ошибки "Недопустимое значение перечислимого аргумента".
/// Используется как результат вызова GetError.
///
const int INVALID_ENUM = 0x0500;
///
/// Код ошибки "Численное значение аргумента выходит за границы допустимых значений".
/// Используется как результат вызова GetError.
///
const int INVALID_VALUE = 0x0501;
///
/// Код ошибки "Указанная операция недопустима в данном состоянии".
/// Используется как результат вызова GetError.
///
const int INVALID_OPERATION = 0x0502;
///
/// Код ошибки "Стек переполнен".
/// Используется как результат вызова GetError.
///
const int STACK_OVERFLOW = 0x0503;
///
/// Код ошибки "Недостаточно данных в стеке".
/// Используется как результат вызова GetError.
///
const int STACK_UNDERFLOW = 0x0504;
///
/// Код ошибки "Не хватает памяти для выполнения команды".
/// Используется как результат вызова GetError.
///
const int OUT_OF_MEMORY = 0x0505;
///
/// Используется для определения ошибки в командах OpenGL.
///
///
/// Целое число (код ошибки), указывающее на отсутствие или наличие ошибки
/// в выполненных командах OpenGL.
/// Может иметь одно из 7-ми значений из числа NO_ERROR, INVALID_ENUM, INVALID_VALUE,
Виртуальная реальность Этот эффект является специфическим отличием от обычных систем трехмерной графики широко доступных на персональных компьютерах. Недолгое...
OpenGL: Основы. (Часть 1) Многие графические пакеты используют Opengl для вывода трёхмерной графики. Многие известные игры, такие как Quake, Serious Sam и...