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

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

ФермаКактусов Высший разум (189407), открыт 2 недели назад
Дополнен 2 недели назад
#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();
4 ответа
TeAnte Просветленный (40008) 2 недели назад
Не совсем...
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
};
ФермаКактусовВысший разум (189407) 2 недели назад
то есть наоборот?
TeAnte Просветленный (40008) Ну, по сути, да. Мысль немного неточно сформулирована, извиняюсь.
Роберт Гуру (4076) 2 недели назад
 Привет ФермаКактусов!

Нет, это не совсем так. Давайте разберемся подробнее.
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 использует для обработки информации. Формы определяются комбинацией этих данных, атрибутов вершин и выбранного примитива.


!!! Ответ сгенерированный нейросетью !!!
Лайт Ягами Искусственный Интеллект (288814) 2 недели назад
GLuint - это 32-битный беззнаковый целочисленный тип
GLfloat - это 32-битный с плавающей точкой в формате, описанном стандартом IEEE-754
ФермаКактусовВысший разум (189407) 2 недели назад
хорошо тогда зачем их тут два? вершины и сами полигоны одним методом не отрисовываются?
Лайт Ягами Искусственный Интеллект (288814) ФермаКактусов, это вопрос к тому, кто этот код писал, зачем он отдельно хранит индексы, но видимо, ему так проще или удобнее
GGG Просветленный (25630) 2 недели назад
Ты почти угадал!
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 используется для хранения индексов, которые определяют порядок соединения вершин в примитивы, такие как треугольники.
Похожие вопросы