簡體   English   中英

OpenGL-繪制帶有紋理的正方形的最簡單方法

[英]OpenGL - Easiest way to draw a square with a texture

通常我會繪制一個具有如下紋理的正方形:

  • 創建一個具有4個坐標的VBO(正方形為A,B,C,D)
  • 創建一個包含4個索引(A,C,D和B,C,D)的EBO,告訴我要從2個三角形中繪制一個正方形。
  • 用紋理繪制此元素

沒有EBO陣列不是最簡單的方法嗎?

因為使用起來不是很方便...如果我想這樣使用:

VAO = [-0.8f,0.5f,0.0f,...]

EBO = [0,1,3,1,2,3,...]

然后,我需要從我的VAO中刪除一個正方形...然后,我還需要從我的EBO數組中刪除索引,然后重新排列它。 有一個更好的方法嗎?

如果您真的只想繪制一個帶有紋理的正方形,則應考慮制作一個新的空VAO,然后調用glDrawArrays(GL_TRIANGLE_STRIP, 0,3);

頂點着色器如下所示:

out vec2 mapping;

void main()
{
    float size = 1.0f;

    vec2 offset;
    switch(gl_VertexID)
    {
    case 0:
        //Bottom-left
        mapping = vec2(0.0f, 0.0f);
        offset = vec2(-size, -size);
        break;
    case 1:
        //Top-left
        mapping = vec2(0.0f, 1.0f);
        offset = vec2(-size, size);
        break;
    case 2:
        //Bottom-right
        mapping = vec2(1.0, 0.0);
        offset = vec2(size, -size);
        break;
    case 3:
        //Top-right
        mapping = vec2(1.0, 1.0);
        offset = vec2(size, size);
        break;
    }

     gl_Position = vec4(offset, 0.0f, 1.0f);
}

映射變量告訴fragmenthader紋理坐標是什么。

沒有EBO陣列不是最簡單的方法嗎?

復制您的頂點並使用glDrawArrays()

您可以使用DrawArray繪制索引。

像這樣:

Vertex2D* vertex = (Vertex2D*) vbo->lock();
        vertex[0].x = x[0]; vertex[0].y = y[0]; vertex[0].u = u[0]; vertex[0].v = v[0]; vertex[0].color = color;
        vertex[1].x = x[0]; vertex[1].y = y[1]; vertex[1].u = u[0]; vertex[1].v = v[1]; vertex[1].color = color;
        vertex[2].x = x[1]; vertex[2].y = y[1]; vertex[2].u = u[1]; vertex[2].v = v[1]; vertex[2].color = color;
        vertex[3].x = x[1]; vertex[3].y = y[0]; vertex[3].u = u[1]; vertex[3].v = v[0]; vertex[3].color = color;
vbo->unlock();

shader->bind();
vbo->bind();
vao->bind();
tex->bind();
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
tex->unbind();
vao->unbind();
vbo->unbind();
shader->unbind();

暫無
暫無

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

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