我有一个包含文字字符集的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));
}

关于c++ - opengl从一个vao绘制多个对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47856006/

10-13 08:31