我的頂點緩衝區對象代碼應該很好地渲染紋理,但相反,紋理渲染奇怪與一些三角形形狀。OpenGL頂點緩衝對象代碼給出了不好的輸出
會發生什麼 - http://godofgod.co.uk/my_files/wrong.png
什麼是應該發生 - http://godofgod.co.uk/my_files/right.png
這個函數創建VBO並設置頂點和紋理座標數據:
extern "C" GLuint create_box_vbo(GLdouble size[2]){
GLuint vbo;
glGenBuffers(1,&vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
GLsizeiptr data_size = 8*sizeof(GLdouble);
GLdouble vertices[] = {0,0, 0,size[1], size[0],0, size[0],size[1]};
glBufferData(GL_ARRAY_BUFFER, data_size, vertices, GL_STATIC_DRAW);
data_size = 8*sizeof(GLint);
GLint textcoords[] = {0,0, 0,1, 1,0, 1,1};
glBufferData(GL_ARRAY_BUFFER, data_size, textcoords, GL_STATIC_DRAW);
return vbo;
}
下面是一些初步認識代碼另一個應該用VBO繪製紋理的函數。
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor4d(1,1,1,a/255);
glBindTexture(GL_TEXTURE_2D, texture);
glTranslated(offset[0],offset[1],0);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glVertexPointer(2, GL_DOUBLE, 0, 0);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer (2, GL_INT, 0, 0);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDrawArrays(GL_TRIANGLES, 1, 3);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
我本來希望在代碼中使用的前三個座標(左上,左下,右上)和最後三個(左下,右上,右下)以最有效的方式正確繪製具有紋理數據的三角形。我不明白爲什麼三角形應該使它更有效率,但顯然這是要走的路。當然,它由於某種原因失敗。
我在問什麼是壞的,但我是否正常地以正確的方式去做?
謝謝。
真正挑剔,但您最好使用某種形式的offsetof來查找紋理座標的偏移量。這裏y和s之間可能沒有填充,但是說你有3個短褲,那麼這個故事會非常不同(3 * sizeof(GLshort)將是錯誤的偏移量,因爲偏移量可能是8個字節,而不是6)。 – Bahbar 2010-06-02 08:11:20
非常感謝您的支持。我現在正在研究它。 – 2010-06-02 12:11:48
使用GLdouble作爲紋理座標以及頂點,當然我可以使用多維數組?我需要爲我的圓角紋理使用雙精度紋理座標。 – 2010-06-02 12:36:16