|
|||||||
Шаги для передачи массивов в GLSL через Vertex Attributes
Время создания: 25.12.2024 14:27
Раздел: Компьютер - Программирование - Шейдеры - Шейдеры GLSL
Запись: xintrea/mytetra_syncro/master/base/173512605405990kzeoq/text.html на raw.github.com
|
|||||||
|
|||||||
1. Определение атрибутов в GLSLВ GLSL вершинном шейдере вы определяете входные данные через ключевое слово in. Каждый атрибут будет связан с одной колонкой данных в вашем VBO. Пример: glsl #version 330 core layout(location = 0) in vec3 position; // Позиции вершин layout(location = 1) in vec3 normal; // Нормали layout(location = 2) in vec2 texCoord; // Текстурные координаты out vec2 TexCoord; // Передача текстурных координат во фрагментный шейдер void main() { gl_Position = vec4(position, 1.0); // Преобразуем позицию в пространство экрана TexCoord = texCoord; // Передаем текстурные координаты дальше } 2. Создание и загрузка данных на CPUНа стороне программы (обычно на CPU) создайте массивы данных для всех атрибутов. Пример: cpp float vertices[] = { // Позиции // Нормали // Текстурные координаты 0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, -0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, -0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, }; 3. Создание VBO и загрузка данныхСоздайте Vertex Buffer Object (VBO) и загрузите данные в видеопамять. cpp GLuint VBO; glGenBuffers(1, &VBO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 4. Настройка Vertex Attribute PointersКаждую "колонку" данных свяжите с соответствующим атрибутом в шейдере с помощью glVertexAttribPointer. cpp // Создаем VAO для связывания всех атрибутов GLuint VAO; glGenVertexArrays(1, &VAO); glBindVertexArray(VAO); // Связываем VBO glBindBuffer(GL_ARRAY_BUFFER, VBO); // Атрибут позиции glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); // Атрибут нормалей glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float))); glEnableVertexAttribArray(1); // Атрибут текстурных координат glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float))); glEnableVertexAttribArray(2); // Отключаем VAO glBindVertexArray(0); 5. РендерингПри вызове рендеринга используйте VAO, чтобы активировать все связанные атрибуты. cpp glUseProgram(shaderProgram); glBindVertexArray(VAO); glDrawArrays(GL_TRIANGLES, 0, 4); // Отрисовка glBindVertexArray(0); Использование массивов в GLSLПосле настройки массивов на стороне CPU GLSL автоматически будет получать соответствующие данные для каждой вершины. Например, если у вас 4 вершины и массивы для позиций и текстурных координат, GLSL будет передавать по одной позиции и текстурной координате каждой вершине при вызове glDrawArrays. Пример фрагментного шейдера:glsl #version 330 core in vec2 TexCoord; // Получено из вершинного шейдера out vec4 FragColor; uniform sampler2D texture1; // Текстура void main() { FragColor = texture(texture1, TexCoord); // Использование текстурных координат } Ключевые моменты
Так вы можете передавать массивы данных в GLSL через Vertex Attributes для динамической обработки на GPU. |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|