2012-08-13 132 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:
    通過頂點屬性數組(可能更快)提供矩陣。 這兩種方法可以在相同的緩衝區數據佈局(僅僅是矩陣陣列)上實現