MyTetra Share
Делитесь знаниями!
Шаги для передачи массивов в 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); // Использование текстурных координат

}



Ключевые моменты


  1. Размеры компонентов: Следите за правильным числом компонентов (например, vec2 для текстурных координат, vec3 для позиций).
  2. Шаг данных: Укажите корректное смещение данных для каждого атрибута в вызове glVertexAttribPointer().
  3. VAO: Используйте Vertex Array Object (VAO) для сохранения состояния атрибутов.


Так вы можете передавать массивы данных в GLSL через Vertex Attributes для динамической обработки на GPU.


Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования