簡體   English   中英

如何在OpenGL中為頂點緩沖區對象添加紋理(2.1)

[英]How to add textures to vertex buffer objects in OpenGL (2.1)

在OpenGL 2.1中紋理映射對象的正確方法是什么? 目前我正在執行以下步驟,但無法使紋理在對象上正確顯示。

  1. 生成緩沖區並存儲ID
  2. 綁定緩沖區
  3. 將數據上傳到緩沖區
  4. 每次渲染緩沖區中的對象時:

    4.1。 啟用GL_TEXTURE_2DGL_VERTEX_ARRAYGL_TEXTURE_COORD_ARRAY

    4.2。 綁定紋理然后綁定緩沖區

    4.3設置glTexCoordPointer然后設置glVertexPointer

    4.4使用glDrawArrays渲染對象

    4.5調用glFlush

創建VBO的代碼:

GLuint flagVBO;
glGenBuffers(1, &flagVBO);
glBindBuffer(GL_ARRAY_BUFFER, flagVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(flag), (void*) flag, GL_STATIC_DRAW);

渲染VBO的代碼:

glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glBindTexture(GL_TEXTURE_2D, gameManager->getTextureManager().getTexture("poleEndFlag")); //The get texture method returns 2 which is the correct texture
glColor3f(1.0, 1.0, 1.0);

glBindBuffer(GL_ARRAY_BUFFER, flagVBO);
glTexCoordPointer(2, GL_FLOAT, sizeof(float)*5, (GLvoid*)3);
glVertexPointer(3, GL_FLOAT, sizeof(float)*5, (GLvoid*)0);
glDrawArrays(GL_QUADS, 0, sizeof(flag) / sizeof(float) / 5);
glFlush();

glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glDisable(GL_TEXTURE_2D);

flagVBO數組:

flag[120] = {
    //Bottom
    -0.1, 1.4, 0.025, 1, 1,
    -0.8, 1.4, 0.025, 0, 1,
    -0.8, 1.4, -0.025, 0, 0,
    -0.1, 1.4, -0.025, 1, 0,
    //Top
    -0.1, 1.95, 0.025, 1, 1,
    -0.8, 1.95, 0.025, 0, 1,
    -0.8, 1.95, -0.025, 0, 0,
    -0.1, 1.95, -0.025, 1, 0,
    //Front
    -0.1, 1.4, 0.025, 1, 0,
    -0.8, 1.4, 0.025, 0, 0,
    -0.8, 1.95, 0.025, 0, 1,
    -0.1, 1.95, 0.025, 1, 1,
    //Back
    -0.1, 1.4, -0.025, 1, 0,
    -0.8, 1.4, -0.025, 0, 0,
    -0.8, 1.95, -0.025, 0, 1,
    -0.1, 1.95, -0.025, 1, 1,
    //Left
    -0.8, 1.95, 0.025, 1, 1,
    -0.8, 1.4, 0.025, 0, 1,
    -0.8, 1.4, -0.025, 0, 0,
    -0.8, 1.95, -0.025, 1, 0,
    //Right
    -0.1, 1.95, 0.025, 1, 1,
    -0.1, 1.4, 0.025, 0, 1,
    -0.1, 1.4, -0.025, 0, 0,
    -0.1, 1.95, -0.025, 1, 0
}

頂點坐標似乎正確渲染,但tex坐標則沒有。 對象呈現與紋理中的主要顏色相同的顏色,但整個紋理不存在。

圖像顯示左側的渲染對象和右側應具有的紋理

圖像顯示左側的渲染對象和右側應具有的紋理

你的紋理坐標指針是錯誤的。 偏移量以字節單位 您指定的3個字節位於頂點位置的x和y坐標之間。 正確的價值將是

glTexCoordPointer(2, GL_FLOAT, sizeof(float)*5, (GLvoid*) (3*sizeof(GLfloat)) );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM