Библиотека трехмерной графики Open gl



страница5/20
Дата25.11.2012
Размер1.49 Mb.
ТипДокументы
1   2   3   4   5   6   7   8   9   ...   20

Структура буферов. Методы Get


В этом разделе Вы узнаете

  • О структуре буферов, хранящих информацию о пикселях экрана

  • О том, как считывать информацию о состоянии 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.

///


[DllImport("OPENGL32.
DLL")]

static extern void glGetFloatv(int prmName, float[] parameters);

///

/// Возвращает одно или несколько значений, отвечающих указанному типу параметра.

///


///


/// Символьная постоянная, обозначающая имя параметра,

/// значения которого следует возвратить.

///


///


/// Длина массива возвращаемых значений

///


///

/// Массив значений

///


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 примет вид

void InitGL()

{

// Цвет фона синий

gl.ClearColor((float)clearColor.R / 255, (float)clearColor.G / 255,

(float)clearColor.B / 255, (float)clearColor.A / 255);

// Вывод результатов работы методов 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,

/// INVALID_OPERATION, STACK_OVERFLOW, STACK_UNDERFLOW, OUT_OF_MEMORY.

///


[DllImport("OPENGL32.DLL", EntryPoint = "glGetError")]

static extern int GetError();

///

/// Используется для определения строки, описывающей ошибку в OpenGL.

///


///


/// Код ошибки.

///

///

/// Указатель на строку, описывающую ошибку.

///


[DllImport("GLU32.DLL")]

static extern IntPtr gluErrorString(int errCode);

///

/// Используется для определения строки, описывающей ошибку в OpenGL.

///


///


/// Код ошибки.

///

///

/// Строка, описывающая ошибку.

///


public static string getErrorString(int errCode)

{

return Marshal.PtrToStringAnsi(gluErrorString(errCode));

}

///

/// Порождает объект исключительной ситуации в случае возникновения ошибки

/// при выполнении команд OpenGL.

/// Сообщение объекта исключительной ситуации содержит описание ошибки.

///


public static void ErrorException()

{

int error = GetError();

if (NO_ERROR != error)

throw new Exception("OpenGL error: " + getErrorString(error));

}
Внутри метода RenderFrame() формы f3D (после вызова BuildFrame()) добавьте вызов

gl. ErrorException();

Этот вызов будет предохранять код метода BuildeFrame() от возможных ошибок.

Посмотрите результат работы приложения. Активируйте для сравнения авторское приложение.
Тест рубежного контроля

  1. Что такое битовая плоскость буфера?

  2. Сколько различных чисел могут определять один и тот же пиксель в буфере, состоящем из 8 битовых плоскостей?

  3. Какой метод позволяет возвратить текущие значения параметров OpenGL.?

  4. Что делает метод GetString?

  5. Для чего служат методы GetError и gluErrorString?


Что дальше.

Как изобразить одну точку? Что такое примитивы?

1   2   3   4   5   6   7   8   9   ...   20

Похожие:

Библиотека трехмерной графики Open gl iconВидеоадаптеры. Архитектурные особенности и технические характеристики
Именно за это время разработчики специализированных процессоров, ориентированных на обработку и ускорение трехмерной графики, успевают...
Библиотека трехмерной графики Open gl iconМетодические указания по выполнению лабораторных работ по дисциплине «Компьютерная графика»
Особый акцент делается на практическое применение изучаемых алгоритмов. Также особое внимание уделяется современным алгоритмам обработки...
Библиотека трехмерной графики Open gl iconВиртуальная реальность
Этот эффект является специфическим отличием от обычных систем трехмерной графики широко доступных на персональных компьютерах. Недолгое...
Библиотека трехмерной графики Open gl icon1. Мультимедиа технологии в туристическом бизнесе
При наличии устройств мультимедиа, компьютер можно использовать в качестве кино-, видеопроектора или проектора двух- или трехмерной...
Библиотека трехмерной графики Open gl iconOpenGL: Основы. (Часть 1)
Многие графические пакеты используют Opengl для вывода трёхмерной графики. Многие известные игры, такие как Quake, Serious Sam и...
Библиотека трехмерной графики Open gl iconПрограмма для создания и обработки растровой графики с частичной поддержкой векторной графики
Использование свободного программного обеспечения при изучении компьютерной графики в школе
Библиотека трехмерной графики Open gl iconГрафики и мультимедиа
Баяковский Ю. М., Игнатенко А. В., Фролов А. И. Графическая библиотека OpenGL. Учебно-методическое пособие
Библиотека трехмерной графики Open gl iconГрафики и мультимедиа
Баяковский Ю. М., Игнатенко А. В., Фролов А. И. Графическая библиотека OpenGL. Учебно-методическое пособие
Библиотека трехмерной графики Open gl iconФункции и графики в экзаменационных заданиях при подготовки к гиа
Цель: повторить, обобщить пройденный материал по теме «Функции и графики для решения заданий», «Кусочные графики», «Графические задания...
Библиотека трехмерной графики Open gl iconУстановка системы Библиотека х с компакт-диска
Если режим автозапуска отключен, то Вы должны сами запустить программу установки. Для этого нажмите кнопку Пуск(Start) и выберите...
Разместите кнопку на своём сайте:
ru.convdocs.org


База данных защищена авторским правом ©ru.convdocs.org 2016
обратиться к администрации
ru.convdocs.org