Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

GLuint это хранение форм а GLfloat это хранение координат по которым формы должны быть отрисованы?

ФермаКактусов Высший разум (218806), закрыт 10 месяцев назад
Дополнен 10 месяцев назад
#define X .525731112119133606
#define Z .850650808352039932

GLfloat vdata[12][3] = {
{-X,0.0,Z},{X,0.0,Z},{-X,0.0,-Z},{X,0.0,-Z},
{0.0,Z,X},{0.0,Z,-X},{0.0,-Z,X},{0.0,-Z,-X},
{Z,X,0.0},{-Z,X,0.0},{Z,-X,0.0},{-Z,-X,0.0}
};

GLuint tindices[20][3] = {
{1,4,0},{4,9,0},{4,5,9},{8,5,4},{1,8,4},
{1,10,8},{10,3,8},{8,3,5},{3,2,5},{3,7,2},
{3,10,7},{10,6,7},{6,11,7},{6,0,11},{6,1,0},
{10,1,6},{11,0,9},{2,11,9},{5,2,9},{11,2,7}
};

int i;

glBegin(GL_TRIANGLES);
for(i=0;i<20;i++)
{
// Здесь помещается информация о цвете

glVertex3fv(&vdata[tindices[i][0]][0]);
glVertex3fv(&vdata[tindices[i][1]][0]);
glVertex3fv(&vdata[tindices[i][2]][0]);
}
glEnd();
Лучший ответ
Лайт Ягами Искусственный Интеллект (337829) 10 месяцев назад
GLuint - это 32-битный беззнаковый целочисленный тип
GLfloat - это 32-битный с плавающей точкой в формате, описанном стандартом IEEE-754
ФермаКактусовВысший разум (218806) 10 месяцев назад
хорошо тогда зачем их тут два? вершины и сами полигоны одним методом не отрисовываются?
Лайт Ягами Искусственный Интеллект (337829) ФермаКактусов, это вопрос к тому, кто этот код писал, зачем он отдельно хранит индексы, но видимо, ему так проще или удобнее
Остальные ответы
damn Просветленный (47429) 10 месяцев назад
Не совсем...
GLuint — это беззнаковый целый тип данных, используемый в OpenGL для хранения идентификаторов (ID) различных объектов, таких как текстуры, шейдеры, буферы и т. д. Это не относится к самим формам, а, скорее, к способу, которым OpenGL отслеживает и ссылается на эти объекты. А GLfloat — это тип данных с плавающей точкой, используемый для хранения числовых значений, таких как координаты вершин, цвета, текстурные координаты и т. д. Координаты вершин, которые определяют форму, обычно хранятся в массивах типа GLfloat.
По типу:
 GLuint textureID;  // Хранит ID созданной текстурки
glGenTextures(1, &textureID); // Генерируется текстурка с ID

GLfloat vertices[] = {
-0.5f, -0.5f, 0.0f, // Координаты вершины 1
0.5f, -0.5f, 0.0f, // Координаты вершины 2
0.0f, 0.5f, 0.0f // Координаты вершины 3
};
ФермаКактусовВысший разум (218806) 10 месяцев назад
то есть наоборот?
damn Просветленный (47429) Ну, по сути, да. Мысль немного неточно сформулирована, извиняюсь.
Роберт Мыслитель (5717) 10 месяцев назад
 Привет ФермаКактусов!

Нет, это не совсем так. Давайте разберемся подробнее.
GL-(u)int и GLfloat -- это типы данных, используемые в OpenGL для хранения информации. Они определяют, как именно данные будут представлены в памяти и какой объем памяти они будут занимать.
* GLuint - это беззнаковое целое число. Используется для хранения индексов, счетчиков и других целочисленных значений.
* Пример: количество вершин в фигуре, идентификатор текстуры.
* GLfloat - это число с плавающей точкой. Используется для хранения координат, цветов, освещения и других значений, требующих дробной части.
* Пример: координаты вершин треугольника (x, y, z), цвет пикселя (R, G, B, A).
Важно: ни GLuint, ни GLfloat напрямую не хранят информацию о формах.
Как же OpenGL 'понимает' формы?
OpenGL работает с примитивами - базовыми геометрическими фигурами, такими как точки, линии, треугольники.
1. Определение данных: Вы определяете координаты вершин (с помощью GLfloat) и другую информацию о форме (например, цвет, нормали).
2. Создание буферов: Данные загружаются в буферы на видеокарте.
3. Определение атрибутов вершин: Вы указываете OpenGL, как интерпретировать данные в буферах. Например, что первые три значения GLfloat - это координаты x, y, z вершины.
4. Отрисовка: Вы выбираете примитив (например, треугольники) и указываете OpenGL, какие вершины использовать (часто с помощью индексов, хранящихся в GLuint).
Пример:
```cpp
// Координаты вершин треугольника (GLfloat)
GLfloat vertices[] = {
-0.5f, -0.5f, 0.0f, // Левая нижняя вершина
0.5f, -0.5f, 0.0f, // Правая нижняя вершина
0.0f, 0.5f, 0.0f // Верхняя вершина
};
// Индексы вершин для треугольника (GLuint)
GLuint indices[] = {
0, 1, 2
};
// Создание буферов и загрузка данных...
// Указание OpenGL, как интерпретировать данные...
// Отрисовка треугольника
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
```
Таким образом, GLuint и GLfloat -- это всего лишь строительные блоки, которые OpenGL использует для обработки информации. Формы определяются комбинацией этих данных, атрибутов вершин и выбранного примитива.


!!! Ответ сгенерированный нейросетью !!!
Cogni Просветленный (48841) 10 месяцев назад
Ты почти угадал!
GLfloat действительно используется для хранения координат, но не только для форм. GLfloat - это просто тип данных OpenGL, который представляет собой число с плавающей точкой. Он используется для хранения различных значений, таких как:
Координаты вершин (x, y, z): как в твоем примере, где vdata хранит координаты вершин икосаэдра.
Цвета (r, g, b, a): для задания цвета вершин или других объектов.
Текстурные координаты (u, v): для определения положения текстуры на поверхности.
Другие параметры: например, для освещения, материалов и т.д.
GLuint, с другой стороны, используется для хранения индексов. Это беззнаковый целочисленный тип данных OpenGL. В твоем примере tindices хранит индексы вершин, которые определяют, какие три вершины образуют каждый треугольник.
В твоем коде происходит следующее:
Определение координат вершин: vdata хранит координаты 12 вершин икосаэдра.
Определение индексов треугольников: tindices хранит 20 наборов индексов, каждый из которых указывает на три вершины в vdata, образующие треугольник.
Отрисовка треугольников: Цикл проходит по массиву tindices и для каждого набора индексов:
Извлекает координаты вершин из vdata по индексам.
Рисует треугольник, используя функцию glVertex3fv.
Важно отметить:
Использование индексов (tindices) позволяет избежать дублирования координат вершин, что экономит память и повышает производительность.
В твоем коде отсутствует информация о цвете. Чтобы задать цвет треугольников, нужно использовать функции OpenGL, такие как glColor3f или glColor4f перед вызовом glVertex3fv.
В итоге: GLfloat используется для хранения различных числовых значений, включая координаты вершин, а GLuint используется для хранения индексов, которые определяют порядок соединения вершин в примитивы, такие как треугольники.
Похожие вопросы