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