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中绘制多个对象的主要内容,如果未能解决你的问题,请参考以下文章