Для всех целей и целей данные этого типа должны обрабатываться как данные текстуры.Это означает не буквально загрузку их в качестве текстурных данных, а скорее то, что это тот образ мышления, который вам следует использовать при рассмотрении вопроса о том, как передать его.
Или, в более простых терминах:не пытайтесь передавать эти данные как единые данные.
Если у вас есть доступ к OpenGL 4.3+ (который является разумно безопасной ставкой для большинства аппаратных средств не старше 6-8 лет), то буферы хранения шейдеров будут самыми лаконичнымирешение:
//GLSL:
layout(std430, binding = 0) buffer terrainData
{
int data[16][16][16];
};
void main() {
int terrainType = data[voxel.x][voxel.y][voxel.z];
//Do whatever
}
//HOST:
struct terrain_data {
int data[16][16][16];
};
//....
terrain_data data = get_terrain_data();
GLuint ssbo;
GLuint binding = 0;//Should be equal to the binding specified in the shader code
glGenBuffers(1, &ssbo);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
glBufferData(GL_SHADER_STORAGE_BUFFER, GLsizeiptr size, data.data, GLenum usage);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, binding, ssbo);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
В любой точке после этого, где вам нужно обновить данные, просто свяжите ssbo
, вызовите glBufferData
(или ваш предпочтительный метод обновления данных буфера), и тогда вы хорошоидти.
Если вы ограничены более старым оборудованием, у вас есть некоторые варианты, но они быстро становятся неуклюжими:
- Вы можете использовать Унифицированные буферы, которые ведут себя очень похоже наБуферы хранения шейдера, но
- имеют ограниченное пространство для хранения (65 КБ в большинстве реализаций)
- имеют другие ограничения, которые могут иметь или не иметь отношение к вашему варианту использования
- Вы можете использовать текстуры напрямую, где вы преобразуете данные местности в значения с плавающей запятой (или используете их как целые числа, если аппаратное обеспечение поддерживает целочисленные форматы внутри), а затем конвертируете обратно в шейдер
- Совместим практически с любым оборудованием
- Но требует дополнительной сложности и вычислений в коде вашего шейдера