GIModel.SimpleModel
GIModel.New (Общие функции моделей) | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Функция сопоставляет буфер с микрокодом с текущей моделью. Буфер может быть как сопоставлен с текущей моделью (любые изменения в нем приведут к изменениям в модели), так и скопирован в независимую область памяти при сопоставлении, что медленнее при создании, но, возможно более удобно, если модель не изменяется вообще. Выбор подхода остается на усмотрении разработчика, обычно удобнее сопоставлять буфер и этот способ работает по умолчанию. Буфер обычно удобно заполнять функцией AddValues, либо загружать заранее подготовленную модель из файла.
Микрокод зависит от текущей графической спецификации. Микрокод представляет собой последовательность двойных слов (32 бита, но могут быть и слова 64 бита) в буфере с номерами команд спецификации и их аргументами (чаще всего вещественные числа 32 бит или целые числа 32 бит) по данной ниже таблице. При прорисовке модели, система проходит по всем командам буфера до тех пор, пока она не встретит команду 0 или конец буфера. Данный способ прорисовки гораздо быстрее прямого вызова графических команд, так как он происходит на низком уровне. Ниже дана таблица микрокода для спецификации OpenGL:
Команда (32 бит) | Аргументы | Соответствующая команда OpenGL |
---|---|---|
0 | Аргументов нет. Команда окончания рисования. | |
1 | Один аргумент int32, параметр glBegin. Может быть GI.GL_POINTS, GI.GL_LINES, GI.GL_QUADS и т.д. | glBegin
|
2 | Аргументов нет. Окончание транзакции рисования glEnd. | glEnd
|
3 | Один аргумент int32, параметр glEnable. | glEnable
|
4 | Один аргумент int32, параметр glDisable. | glDisable
|
5 | Два аргумента int32, один single, параметры glTexEnv. | glTexEnv
|
6 | Два аргумента int32, параметр glBlendFunc. | glBlendFunc
|
7 | Четыре аргумента int32, параметры glBlendFuncSeparate. | glBlendFuncSeparate
|
8 | Один аргумент int32, параметр glBlendEquation. | glBlendEquation
|
9 | Два аргумента int32, параметры glBlendEquationSeparate. | glBlendEquationSeparate
|
10 | Четыре аргумент single, параметры glBlendColor. | glBlendColor
|
11 | Четыре аргумента int32, параметр glColorMask. | glColorMask
|
12 | Один аргумент int32, параметр glLogicOp. | glLogicOp
|
13 | Один аргумент int32, параметр glDrawBuffer. | glDrawBuffer
|
14 | Один аргумент int32 -- количество буферов (N), затем N-аргументов int32 перечисляющих эти буферы. | glDrawBuffers
|
100 | Три аргумента single, параметры glVertex. | glVertex
|
101 | Три аргумента single, параметры glColor. | glColor
|
102 | Шесть аргументов single, параметры glMaterial (см. glMaterialfv) | glMaterial
|
103 | Три аргумента single, параметры glTexCoord. | glTexCoord
|
104 | Три аргумента single, параметры glNormal. | glNormal
|
105 | Один аргумент int32, параметр glEdgeFlag. | glEdgeFlag
|
106 | Один аргумент single, параметры glFogCoord. | glFogCoord
|
110 | Три аргумента int32, параметры glDrawArrays. | glDrawArrays
|
111 | Три аргумента int32 (mode, count, type), один аргумент int32 (размер данных в байтах), далее N-байт данных. | glDrawElements
|
112 | Пять аргументов int32 (mode, starts, end, count, type), один аргумент int32 (размер данных в байтах), далее N-байт данных. | glDrawRangeElements
|
113 | Четыре аргумента int32, параметры glDrawArraysInstanced. | glDrawArraysInstanced
|
114 | Четыре аргумента int32 (mode, count, type, instancecount), один аргумент int32 (размер данных в байтах), далее N-байт данных. | glDrawElementsInstanced
|
115 | Четыре аргумента int32 (mode, count, type, basevertex), один аргумент int32 (размер данных в байтах), далее N-байт данных. | glDrawElementsBaseVertex
|
116 | Шесть аргументов int32 (mode, start, end, count, type, basevertex), один аргумент int32 (размер данных в байтах), далее N-байт данных. | glDrawRangeElementsBaseVertex
|
117 | Пять аргументов int32 (mode, count, type, instancecount, basevertex), один аргумент int32 (размер данных в байтах), далее N-байт данных. | glDrawElementsInstancedBaseVertex
|
118 | Один аргумент int32 (mode), один аргумент int32 (размер данных в байтах), далее N-байт данных. | glDrawArraysIndirect
|
119 | Два аргумента int32 (mode, type), один аргумент int32 (размер данных в байтах), далее N-байт данных. | glDrawElementsIndirect
|
120 | Два аргумента int32 (mode, id) | glDrawTransformFeedback
|
121 | Три аргумента int32 (mode, id, stream) | glDrawTransformFeedbackStream
|
122 | Пять аргументов int32, параметры glDrawArraysInstancedBaseInstance. | glDrawArraysInstancedBaseInstance
|
123 | Пять аргументов int32 (mode, count, type, instancecount, baseinstance), один аргумент int32 (размер данных в байтах), далее N-байт данных. | glDrawElementsInstancedBaseInstance
|
124 | Шесть аргументов int32 (mode, count, type, instancecount, basevertex, baseinstance), один аргумент int32 (размер данных в байтах), далее N-байт данных. | glDrawElementsInstancedBaseVertexBaseInstance
|
125 | Три аргумента int32, параметры glDrawTransformFeedbackInstanced. | glDrawTransformFeedbackInstanced
|
126 | Четыре аргумента int32, параметры glDrawTransformFeedbackStreamInstanced. | glDrawTransformFeedbackStreamInstanced
|
130 | Два аргумента int32 (mode, drawcount), один аргумент int32 (размер массива начальных индексов "first" в байтах), один аргумент int32 (размер массива количеств индексов "count" в байтах), далее N-байт данных массив "first", далее N-байт массив "count". | glMultiDrawArrays
|
131 | Три аргумента int32 (mode, type, drawcount), один аргумент int32 (размер массива количеств "count" в байтах), один аргумент int32 (размер массива индексов "*indices" в байтах), далее N-байт данных массив "count", далее N-байт массив "*indices". Внимание: массив "*indices" должен содержать реальные адреса в памяти (см. Buffer.SystemAddress). | glMultiDrawElements
|
132 | Три аргумента int32 (mode, type, drawcount), один аргумент int32 (размер массива количеств "count" в байтах), один аргумент int32 (размер массива индексов "*indices" в байтах), один аргумент int32 (размер массива вертексов "basevertex" в байтах), далее N-байт данных массив "count", далее N-байт массив "*indices", далее N-байт данных массив "basevertex". Внимание: массив "*indices" должен содержать реальные адреса в памяти (см. Buffer.SystemAddress). | glMultiDrawElementsBaseVertex
|
133 | Три аргумента int32 (mode, drawcount, stride), один аргумент int32 (размер массива записей "indirect" в байтах), далее N-байт данных массив "indirect" -- элементы этого массива содержат более одного значения, см. описание. | glMultiDrawArraysIndirect
|
134 | Четыре аргумента int32 (mode, type, drawcount, stride), один аргумент int32 (размер массива записей "indirect" в байтах), далее N-байт данных массив "indirect" -- элементы этого массива содержат более одного значения, см. описание. | glMultiDrawElementsIndirect
|
135 | Четыре аргумента int32 (mode, drawcount, maxdrawcount, stride), один аргумент int32 (размер массива записей "indirect" в байтах), далее N-байт данных массив "indirect" -- элементы этого массива содержат более одного значения, см. описание. | glMultiDrawArraysIndirectCount
|
136 | Пять аргументов int32 (mode, type, drawcount, maxdrawcount, stride), один аргумент int32 (размер массива записей "indirect" в байтах), далее N-байт данных массив "indirect" -- элементы этого массива содержат более одного значения, см. описание. | glMultiDrawElementsIndirectCount
|
200 | Одни аргумент int32, параметр glActiveTexture. | glActiveTexture
|
201 | Два аргумента int32, параметры glBindTexture. | glBindTexture
|
202 | Три аргумента int32 (size, type, stride), один аргумент int32 (размер массива "pointer" в байтах), далее N-байт данных массив "pointer". | glVertexPointer
|
203 | Два аргумента int32 (type, stride), один аргумент int32 (размер массива "pointer" в байтах), далее N-байт данных массив "pointer". | glIndexPointer
|
204 | Два аргумента int32 (type, stride), один аргумент int32 (размер массива "pointer" в байтах), далее N-байт данных массив "pointer". | glNormalPointer
|
205 | Три аргумента int32 (size, type, stride), один аргумент int32 (размер массива "pointer" в байтах), далее N-байт данных массив "pointer". | glTexCoordPointer
|
206 | Три аргумента int32 (size, type, stride), один аргумент int32 (размер массива "pointer" в байтах), далее N-байт данных массив "pointer". | glColorPointer
|
207 | Один аргумент int32 (stride), один аргумент int32 (размер массива "pointer" в байтах), далее N-байт данных массив "pointer". | glEdgeFlagPointer
|
208 | Пять аргументов int32 (index, size, type, normalized, stride), один аргумент int32 (размер массива "pointer" в байтах), далее N-байт данных массив "pointer". | glVertexAttribPointer
|
210 | Один аргумент int32, параметр glEnableVertexAttribArray. | glEnableVertexAttribArray
|
211 | Один аргумент int32, параметр glDisableVertexAttribArray. | glDisableVertexAttribArray
|
220 | Один аргумент int32, параметр glBindVertexArray. | glBindVertexArray
|
221 | Два аргумента int32, параметры glBindBuffer. | glBindBuffer
|
222 | Четыре аргумента int32, параметры glBindVertexBuffer. | glBindVertexBuffer
|
300 | Один аргумента int32, параметр glUseProgram. | glUseProgram
|
301 | Три аргумента int32 (уникальный номер переменной программы шейдеров, количество значений для переменных-массивов (к примеру, см. glUniform2fv , для обычных переменных этот аргумент обычно равен 1), тип значений). Далее, в зависимости от типа значений, следуют значения или их системный адрес. Тип значений представлят собой битовую маску со следующими битами (ATttttSSSSssss ):
Примеры: |
glUniform???
|
302 | Один аргумента int32 -- уникальный номер переменной программы шейдеров. Эта команда транслируется как glUniform1f(<номер переменной>,<значение GI.WorldTime>) .
|
Заполнение GI.WorldTime (u_time)
|
303 | Один аргумента int32 -- уникальный номер переменной программы шейдеров. Эта команда транслируется как glUniform2f(<номер переменной>,<значение GI.Width>,<значение GI.Height>) .
|
Заполнение Width/Height (u_resolution)
|
304 | Один аргумента int32 -- уникальный номер переменной программы шейдеров. Эта команда транслируется как glUniform2f(<номер переменной>,<позиция мыши по X>,<позиция мыши по Y>) .
|
Заполнение mouse.x/mouse.y (u_mouse)
|
400 | Аргументов нет. Выполнение glPushMatrix. | glPushMatrix
|
401 | Три аргумента single, движение текущей матрицы по x, y и z. | glTranslatef
|
402 | Три аргумента single, поворот текущей матрицы вокрут осей x, y и z. | glRotatef
|
403 | Три аргумента single, масштабирование текущей матрицы по осям x, y и z. | glScalef
|
404 | Аргументов нет. Выполнение glPopMatrix. | glPopMatrix
|
405 | Один аргумент int32, параметр glMatrixMode. | glMatrixMode
|
Синтаксис
GIModel.SimpleModel(<Источник микрокода (BUFFER)>,<Режим модели (INT)>=0)
Аргументы
<Источник микрокода (BUFFER)>
- Аргумент задает буфер, в котором задан или будет задан микрокод для прорисовки модели.<Режим модели (INT)>
- (необязательный аргумент) Аргумент режим модели и буфера и является битовой маской со следующими битами:- бит 0: 0 -- использовать функции спецификации с числами single (по умолчанию), иначе использовать функции с числами double, где это возможно. Не все драйверы могут поддерживать числа double.
- бит 1: 0 -- указанный буфер будет ассоциирован с моделью, все изменения в буфере будут сказываться на модели (по умолчанию), иначе содержимое буфера будет скопировано в особую область памяти и модель будет рисоваться по этим данным.
Примеры
//Используется фрагмент из обработки tetris.sfo //Создадим новую простую модель с пустым буфером аБуфер:=Buffer.Create(); аМодель:=GIModel.New(); аМодель.SimpleModel(аБуфер); //Заполним буфер микрокодом аСмещ:=0; аБуфер.AddValues(аСмещ,4,201,aGI.GL_TEXTURE_2D,0);//glBindTexture аБуфер.AddValues(аСмещ,4,300,лкПрограммы[3]);//ShaderProgramUse аБуфер.AddValues(аСмещ,4,301,aGI.ShaderProgramGetVariableID(лкПрограммы[3],"u_scrpos"),4,$004); аБуфер.AddValues(аСмещ,104,x,aGI.Height-y,2*dx,2*dx);//u_scrpos аБуфер.AddValues(аСмещ,4,302,aGI.ShaderProgramGetVariableID(лкПрограммы[3],"u_time"));//u_time аБуфер.AddValues(аСмещ,4,301,aGI.ShaderProgramGetVariableID(лкПрограммы[3],"u_starttime"),1,$001); аБуфер.AddValues(аСмещ,104,aGI.WorldTime);//u_starttime аБуфер.AddValues(аСмещ,4,1,aGI.GL_QUADS);//glBegin аБуфер.AddValues(аСмещ,4,100);аБуфер.AddValues(аСмещ,104,x,y,-0.3);//glVertex аБуфер.AddValues(аСмещ,4,100);аБуфер.AddValues(аСмещ,104,x,y+2*dx,-0.3);//glVertex аБуфер.AddValues(аСмещ,4,100);аБуфер.AddValues(аСмещ,104,x+2*dx,y+2*dx,-0.3);//glVertex аБуфер.AddValues(аСмещ,4,100);аБуфер.AddValues(аСмещ,104,x+2*dx,y,-0.3);//glVertex аБуфер.AddValues(аСмещ,4,2);//glEnd аБуфер.AddValues(аСмещ,4,0);//EOF //Создадим новый объект и добавим к нему эту модель аОбъект:=aGI.AddObject("EXP"); аОбъект.Model(аМодель);