2015-07-10 89 views
0

一般我繪製正方形像這樣的紋理的最簡單方法:的OpenGL - 繪製一個正方形帶紋理

  • 創建VBO與4點的座標(A,B,C,d爲方形)
  • 創建具有4個索引(A,C,d和B,C,d)告訴我想要繪製正方形出2個三角形的EBO。
  • 繪製此元素與質感

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

因爲它不是使用起來非常順手......如果我想用這樣的:

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

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

然後我需要從我的VAO除去正方形...然後我還需要從我的EBO陣列和重新取出索引安排一下。 有沒有更好的方法來做到這一點?

+1

你沒有指定你的目標GL版本。使用可編程管道,你可以做這個_attribute-less_,所以VBO和EBO都可以完全跳過。儘管如此,您仍然需要獲取頂點數據着色(除非它是常量),但現在還有其他可能性。 – derhass

回答

1

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

複製頂點&使用glDrawArrays()

+0

但是,這會給頂點的開銷50%嗎? – waas1919

+0

這是權衡,是的。 – genpfault

1

您可以使用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(); 
2

如果你真的只是想畫上有一個質感的正方形,你應該考慮做一個新的空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); 
} 

映射變量告訴fragmentshader什麼紋理座標。

+1

這是我的首選渲染全屏四邊形的方式。但是我想補充一點,如果你想繪製大量的四邊形,這可能會成爲一個巨大的性能問題。頂點着色器在每個頂點執行相當多的工作,甚至可能包括分支,具體取決於編譯器的聰明程度。儘管如此,它肯定會實現問題的「簡單」部分。 –