2012-08-13 89 views
0

我有什么现在减少缓冲区对象大小

#define QUAD_VERT_COUNT 4 

#define QUAD_POS_COMP 3 

typedef struct quad_pos 
{ 
GLfloat x, y, z; 
}quad_pos; 

#define SIZE_QUAD_POS = sizeof(quad_pos) * QUAD_VERT_COUNT 

static QUAD_BUFFER = 0; 

void init_quad_buffer() 
{ 
quad_pos* pos_data = malloc(SIZE_QUAD_POS); 

pos_data[0].x = -1.0f; 
pos_data[0].y = -1.0f; 
pos_data[0].z = 0.0f; 

pos_data[1].x = 1.0f; 
pos_data[1].y = -1.0f; 
pos_data[1].z = 0.0f; 

pos_data[2].x = -1.0f; 
pos_data[2].y = 1.0f; 
pos_data[2].z = 0.0f; 

pos_data[3].x = 1.0f; 
pos_data[3].y = 1.0f; 
pos_data[3].z = 0.0f; 

QUAD_BUFFER = create_buffer(GL_ARRAY_BUFFER, GL_STATIC_DRAW, pos_data, SIZE_QUAD_POS); 
free(pos_data); 
} 

void get_quad_buffer 
{ 
    return QUAD_BUFFER; 
} 

而溺水(的一部分)

glBindBuffer(GL_ARRAY_BUFFER, get_quad_buffer()); 
glEnableVertexAttribArray(ss->attrib[0]);//attrib[o] is vertex pos 
glVertexAttribPointer(ss->attrib[0], QUAD_POS_COMP, GL_FLOAT, GL_FALSE, 0, 0); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, QUAD_VERT_COUNT); 

缩放,平移,并与矩阵和着色器旋转实现的,所以是这个缓冲区永远不会更改每个精灵。

但是,为什么我们只需要使用GL_float为-1.0,1.0? GL_Byte就足够了。

typedef struct quad_pos 
{ 
GLbyte x, y, z; 
}quad_pos; 

void init_quad_buffer() 
{ 
quad_pos* pos_data = malloc(SIZE_QUAD_POS); 

pos_data[0].x = -1; 
pos_data[0].y = -1; 
pos_data[0].z = 0; 
.... 
} 

溺水

... 
    glVertexAttribPointer(ss->attrib[0], QUAD_POS_COMP, GL_BYTE, GL_FALSE, 0, 0); 
    glDrawArrays(GL_TRIANGLE_STRIP, 0, QUAD_VERT_COUNT); 

问题1:我需要正常化设置为GL_TRUE?
问题2: GLclampf和GLfloat都是4个浮点数,但颜色值从0.0到1.0,所以如果我把它们放在GLbyte中(val/256,所以255为1.0,128为0.5,0为0)我需要GL_TRUE正常化在glVertexAttribPointer?
问题3:我真的需要在顶点数据/其他数据中填充吗?添加虚构的pos_data.g,仅用于sizeof(pos_data)= 16 ==适用于gpu?

回答

1

但是为什么我们只需要使用GL_float为-1.0,1.0呢? GL_Byte就足够了。

请注意,这是不正确的一般情况下,在大多数情况下,你将需要一个精度浮动。如果你只有这么几个数值和几何如此简单,那么它的可能性非常高,甚至没有理由首先将其优化到glByte。你可能根本没有几个顶点,那么为什么你要在它们上面保存存储?这听起来像是过早优化的一个很好的例子(我知道,这是一个过度使用的术语)。

现在,您的实际问题:

  1. 不,不,如果你想相同的功能,如果正常化是假的,-1将转换为-1.0f,如果是真的,那将是更类似于-0.0078125f (或-1/128.0f)。所以如果你想保持相同的规模,你不希望它正常化。
  2. 你认为GLclampf和GLfloat是8字节的浮点数?它们通常是4字节的浮点数。如果你想通过顶点属性传递RGB颜色,是的,你应该规范化它们,因为OpenGL期望颜色分量在[0.0f,1.0f]范围内。但是,为什么你不把它们作为花车传递呢?你认为要获得什么?在一个简单的游戏中,你可能没有足够的颜色来注意其中的差异,而在非简单游戏中,你更有可能使用纹理。
  3. 这个我不确定。我知道这对老GPU(我的意思是差不多10年后)是真的,但我不知道最近有什么声称这实际上会改善某些事情。在任何情况下,最为人所知的对齐方式是将一个顶点的所有顶点属性一起占用32个字节的(多个),并且用于ATI卡。对于一些棘手的事情/扩展,字节对齐可能是必需的,但我认为您还不需要担心它。
2

一般来说,您总是可以瞄准半浮点型(16位浮点型)扩展来节省内存。

您的实施看起来像造成一些平局的开销。标准化(即时!)将导致额外的开销。绘制这个常数四的多个实例,以下笔者推荐加快速度:

  • 一个几何着色器的执行情况;让它生成,变换并发射四个四边形的顶点给你。
  • 实例化使用含有变换矩阵对于每个四边形实例(每个矩阵列将使用内置均匀访问“gl_InstanceID”)一个纹理缓冲器对象(TBO)绘制与变换缓冲器。
    OR:
    通过顶点属性数组(可能更快)提供矩阵。 这两种方法可以在相同的缓冲区数据布局(仅仅是矩阵阵列)上实现