2015-07-10 91 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

这是我的首选渲染全屏四边形的方式。但是我想补充一点,如果你想绘制大量的四边形,这可能会成为一个巨大的性能问题。顶点着色器在每个顶点执行相当多的工作,甚至可能包括分支,具体取决于编译器的聪明程度。尽管如此,它肯定会实现问题的“简单”部分。 –