Это портативное использование glClearBufferData для составных типов данных? - PullRequest
1 голос
/ 13 марта 2019

У меня есть буфер (используется как в SSBO, так и в VBO), который содержит составной тип данных с чередованием чисел с плавающей точкой и целых чисел без знака:

struct VertexData
{
    struct 
    {   
        float x; 
        float y; 
        float z; 
    } position;

    struct
    {
        float u;
        float v;
    } tex_coords;

    GLuint entity_id;
};

glBufferData(GL_ARRAY_BUFFER, sizeof(VertexData) * buffer_maxSize, nullptr, GL_DYNAMIC_DRAW);

Когда я очищаю буфер, я использую следующую функцию:

glClearBufferData(GL_SHADER_STORAGE_BUFFER, GL_R32UI, GL_RED, GL_UNSIGNED_INT, nullptr);

Это работает, но, поскольку формат GL_R32UI не соответствует фактическому типу данных (VertexData), я боюсь, что код может работать не на всехмашина / драйвер.

В случае, если код не является переносимым, какую функцию мне следует использовать?


В качестве отступления, я должен использовать GL_FLOAT в моем VertexData для лучшегопереносимость

1 Ответ

3 голосов
/ 13 марта 2019

Буферные объекты не имеют «фактического типа данных». Они содержат байты; вот и все. Это использование буфера, который дает байты, в которых он хранит значение, и эти байты имеют значение, которое определенное использование говорит, что они имеют. И даже тогда, это имеет значение только при использовании данных буфера таким конкретным способом.

Ваш вызов clear устанавливает все байты буфера на 0. Если вы используете этот буфер в качестве источника для данных вершин, а тип для определенного атрибута равен GL_FLOAT, то байты, считанные для этого атрибута, будут интерпретироваться как хранение 32-разрядного значения IEEE-754 с плавающей запятой в том же порядке байтов, что и в процессоре, обеспечивающем его эквивалентный тип. IEEE-754 определяет, что последовательность из 0 байтов имеет четко определенное значение (а именно, положительный ноль), поэтому это будет иметь четко определенное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...