在 OpenGL 的 Vertex buffer 裡使用 Interger 資料
前言
最近需要在 Vertex buffer 裡使用 Interger 資料,在 Direct3D 時沒什麼問題,但是變成 OpenGL 就會跑出不正確的答案,在此把研究的過程做個紀錄。內容
OpenGL 輸入資料時會透過 glVertexAttribPointer() 來輸入資料,一般輸入的範例如下glVertexAttribPointer( posLoc , 4 , GL_FLOAT , GL_FALSE , 4*sizeof(float), (GLvoid*)0 );
這樣輸入對應到 GLSL 的型別是 vec4 ,所以如果 GLSL 的型別是 int4 的話可能會像以下這樣輸入
glVertexAttribPointer( posLoc , 4 , GL_INT , GL_FALSE , 4*sizeof(GLint), (GLvoid*)0 );
如果你按照上述輸入的話會是錯的!正確的輸入如下
glVertexAttribIPointer( posLoc , 4 , GL_INT , 4*sizeof(GLint), (GLvoid*)0 );
要輸入 interger 資料的話,要用 glVertexAttribIPointer() 來輸入,glVertexAttribPointer() 用來輸入資料是 float 的時候,參數的部分 glVertexAttribIPointer() 沒有 normalized ,詳細的差異可以在[ docs.gl ]glVertexAttribPointer 裡查詢。
題外話,在 OpenGL2 或 OpenGLES2 的時候,由於不支援 Integer 型別,所以只能用 float 的型態來輸入,然後在 GLSL 會提供 int() 來轉型,要注意雖有 int() ,但沒有 uint() ,這是早期的規格制定的缺陷。
沒有留言:
張貼留言