opengl从一个vao中绘制多个对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opengl从一个vao中绘制多个对象相关的知识,希望对你有一定的参考价值。

我有一个包含字体字符集的vao。每个字符都使用一组属于它的索引绘制。这个想法是写几个字符并且只将vao绑定一次。

一切正常 - 除了字形的定位。循环就像

glGetUniformLocations()
glBindVertexArray( vao )
for( i=0; i< lg; i++ )
{
  glUniforMatrix4fV();      // send translation matrix to shader
  glDrawElements( part of the indexbuffer );
  trans_mx = glm::translate();  // compute the translation matrix
}

Vertexshader是:

#version 450 core

layout( location = 0 ) in vec3 vx;          // the vertex_buffer in modelspace
layout( location = 1 ) in vec4 vx_col;      // color of each vertex

out vec4 fragment_color;                   

uniform mat4  mvp_mx;         
uniform mat4  trans_mx;         

void main()
{
  gl_Position = mvp_mx * vec4( trans_mx * vec4( vx, 1.0f ) );

  fragment_color = vx_col;
}

翻译有效 - 但不在绘制调用之间。所有字符都绘制在相同的位置。这是翻译。对我来说,好像翻译矩阵似乎不会更新。 ??????

这是绘制字符的函数的代码

  lg  = strlen( str );
  vao = sfs->vao;
  _sys.mvp_mx   = _sys.proj_mx * _sys.view_mx * vao->model_mx;   // compute global mvp


  sh_s = &__sh_list[ vao->shd_ind ];       // pointer to our shader_struct
  sh_s->get_uniform_loc();                 // get uniform locations for this shader
  glBindVertexArray( vao->id );            // bind vao

  glUseProgram( sh_s->prg_id );            // use the shader

  for(  c1 = 0; c1 < lg; c1++ )
  {
    sh_s->send_uniform();                    // send uniforms to the shader
    i_seg = &vao->ind_b->seg[ str[ c1 ] ];   // segment for this character
    glDrawElements( i_seg->prim, i_seg->count, i_seg->type, ( void* )i_seg->offset );
    _sys.trans_mx = glm::translate( glm::mat4( 1.0f ), glm::vec3( 10.0f, 0.0f, 0.0f ) );     
  }

  glBindVertexArray( 0 );           // unbind vao
  glUseProgram( 0 );                // unbind shader
答案

表达方式

for(  c1 = 0; c1 < lg; c1++ )
{
    .....
    _sys.trans_mx = glm::translate(glm::mat4(1.0f), glm::vec3(10.0f, 0.0f, 0.0f));
}

将继续计算相同的矩阵。

如果要在循环中计算连续变化的矩阵,则必须根据其当前值不断更改矩阵:

for(  c1 = 0; c1 < lg; c1++ )
{
    .....
    _sys.trans_mx = glm::translate(_sys.trans_mx, glm::vec3(10.0f, 0.0f, 0.0f));
}

或者您根据循环的控制变量计算矩阵

for(  c1 = 0; c1 < lg; c1++ )
{
    .....
    _sys.trans_mx = glm::translate(glm::mat4(1.0f), glm::vec3(10.0f * c1, 0.0f, 0.0f));
}

以上是关于opengl从一个vao中绘制多个对象的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 上使用具有多个 VBO 和 IBO(多个对象)OpenGLES 2 的 VAO 进行绘制

多个网格、多个 VBO、多个 VAO、OpenGL 4.1

使用 VAO 在 OpenGL 中更改绘制的实例化顺序

OpenGL:一个 VBO 的多个 VAO

OpenGL ES之VBOEBO与VAO的说明和使用

如何使用不同的 VAO、VBO 绘制 2 个或更多对象?