我有一个缓冲区(同时用作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);
它可以工作,但是由于 format GL_R32UI
与数据的实际类型(VertexData
)不匹配,因此我担心代码可能无法工作在每台机器/驱动程序上。
在代码不可移植的情况下,我应该使用什么正确的功能?
顺便说一句,我应该在VertexData中使用GL_FLOAT以获得更好的可移植性吗?
答案 0 :(得分:3)
缓冲区对象没有“数据的实际类型”。它们包含字节;而已。缓冲区的用法给出了它存储的字节的含义,而这些字节的含义是特定用法表明它们具有的含义。即便如此,它只有在以这种特定方式使用缓冲区的数据时才具有这种含义。
您的clear调用将缓冲区的所有字节设置为0。如果您将该缓冲区用作顶点数据的源,并且特定属性的类型为myFile = open("gameofthrones.txt", "r")
words = []
for line in myFile:
print(add_unique(line, words))
myFile.close()
print("Unique words in my file are: ")
for word in words:
print(word)
,则为该属性读取的字节将为解释为以与CPU提供其等效类型相同的字节顺序存储IEEE-754 32位浮点值。 IEEE-754定义0字节的序列具有明确定义的值(即正零),因此将具有明确定义的行为。