c++ - opengl 从一个 vao 中绘制多个对象

标签 c++ opengl glm-math

我有一个包含字体字符集的单个 vao。 每个字符都用一组属于它的索引绘制。 我的想法是写几个字符并只绑定(bind)一次 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
}

顶点着色器是:

#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/

相关文章:

c++ - 如何在 GLUT 上加载 bmp 以将其用作纹理?

java - 使用四元数旋转模型

c++ - GLM中的矩阵部门

c++ - 级联阴影贴图闪闪发光

c++ - 本地化在静态控制中不起作用

javascript - 在 JavaScript 中打印字节数组的十六进制或十进制值

c++ - 从最低值开始遍历所有可能的浮点值

c++ - 为什么 glm::frustumLH_ZO 的值 [2][0] 和 [2][1] 被求反?

c++ - 如何从多个 IP 数据包重建 TCP 流?

matrix - 使用 glm::perspective 关于 zFar 和 zNear 平面偏移的混淆