Sprite渲染流程-TrianglesCommand

简介: Sprite渲染流程-TrianglesCommand

Spite中初始化

TrianglesCommand _trianglesCommand;     
_trianglesCommand.init(_globalZOrder,
                           _texture,
                           getGLProgramState(),
                           _blendFunc,
                           _polyInfo.triangles, // 类型为Triangles
                           transform,
                           flags);
复制代码
struct Triangles
{
    /**Vertex data pointer.*/
    V3F_C4B_T2F* verts; // 注意这里是V3F
    /**Index data pointer.*/
    unsigned short* indices;
    /**The number of vertices.*/
    int vertCount;
    /**The number of indices.*/
    int indexCount;
};
复制代码

填充顶点数据的逻辑

void Renderer::fillVerticesAndIndices(const TrianglesCommand* cmd)
{
    memcpy(&_verts[_filledVertex], cmd->getVertices(), sizeof(V3F_C4B_T2F) * cmd->getVertexCount());
    // fill vertex, and convert them to world coordinates
    const Mat4& modelView = cmd->getModelView();
    for(ssize_t i=0; i < cmd->getVertexCount(); ++i)
    {
        modelView.transformPoint(&(_verts[i + _filledVertex].vertices));
    }
    // fill index
    const unsigned short* indices = cmd->getIndices();
    for(ssize_t i=0; i< cmd->getIndexCount(); ++i)
    {
        _indices[_filledIndex + i] = _filledVertex + indices[i];
    }
    _filledVertex += cmd->getVertexCount();
    _filledIndex += cmd->getIndexCount();
}
复制代码

setupVBOAndVAO函数规定了如何解析顶点数据, 数据结构类型就是V3F_C4B_T2F

void Renderer::setupVBOAndVAO()
{
    //generate vbo and vao for trianglesCommand
    glGenVertexArrays(1, &_buffersVAO);
    GL::bindVAO(_buffersVAO);
    glGenBuffers(2, &_buffersVBO[0]);
    glBindBuffer(GL_ARRAY_BUFFER, _buffersVBO[0]);
    // vertices
    glEnableVertexAttribArray(GLProgram::VERTEX_ATTRIB_POSITION);
    glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 3, GL_FLOAT, GL_FALSE, sizeof(V3F_C4B_T2F), (GLvoid*) offsetof( V3F_C4B_T2F, vertices));
    // colors
    glEnableVertexAttribArray(GLProgram::VERTEX_ATTRIB_COLOR);
    glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(V3F_C4B_T2F), (GLvoid*) offsetof( V3F_C4B_T2F, colors));
    // tex coords
    glEnableVertexAttribArray(GLProgram::VERTEX_ATTRIB_TEX_COORD);
    glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORD, 2, GL_FLOAT, GL_FALSE, sizeof(V3F_C4B_T2F), (GLvoid*) offsetof( V3F_C4B_T2F, texCoords));
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _buffersVBO[1]);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(_indices[0]) * INDEX_VBO_SIZE, _indices, GL_STATIC_DRAW);
    // Must unbind the VAO before changing the element buffer.
    GL::bindVAO(0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    CHECK_GL_ERROR_DEBUG();
}
复制代码

顶点数据布局

Position Color TexCoord
Vec3 Color4B Vec2

可以使用Vec3的Z进行纹理单元的设置



目录
相关文章
|
存储 网络协议 Java
计网 - Socket 编程:epoll 为什么用红黑树?
计网 - Socket 编程:epoll 为什么用红黑树?
197 0
|
存储 缓存 人工智能
解码 LangChain | LangChain + GPTCache =兼具低成本与高性能的 LLM
GPTCache 是一个用于存储 LLM 响应的语义缓存层。它可以为 LLM 相关应用构建相似语义缓存,当相似的问题请求多次出现时,可以直接从缓存中获取,在减少请求响应时间的同时也降低了 LLM 的使用成本。
539 0
|
算法 关系型数据库 测试技术
PostgreSQL 相似搜索插件介绍大汇总 (cube,rum,pg_trgm,smlar,imgsmlr,pg_similarity) (rum,gin,gist)
标签 PostgreSQL , cube , rum , pg_trgm , smlar , imgsmlr , pg_similarity , gin , gist , 倒排 , 相似 , 向量 , 特征 , 图像 , 文本 , 字符串 , 全文检索 背景 在搜索业务场景中,相似搜索是一个非常常见的需求。
3850 0
Android 面向切面编程 AspectJ 实战
Android 最常见的有登录判断,控件的防重复点击处理,权限判断,埋点等。本文主要讲登录切面的实现,比如我们跳转到某个页面或者多个页面需要进行判断,如果没有登录则跳转到登录界面,登录了则跳转到对应界面,这样,我们在许多页面的逻辑中都会有这个判断。
Android 面向切面编程 AspectJ 实战
|
存储 弹性计算 容灾
PG中国开发者社区—周正中PG峰会专访
周正中,阿里云数据库产品经理。
4287 0
|
9月前
|
存储 程序员 Python
Python中自定义类实例化数组的艺术
Python中自定义类实例化数组的艺术
75 1
shader中判断浮点型数值相等:round、floor
shader中判断浮点型数值相等:round、floor
374 0
|
前端开发 图形学 索引
[✔️]使用unity profile查看合批细节
[✔️]使用unity profile查看合批细节
358 0
[√]OpenGL绘制图片
[√]OpenGL绘制图片
131 0
|
图形学 索引
Unity 之 三种抽奖示例
Unity做的三种抽奖的示例,根据需求修改动画时间和效果以及获取概率,文末附示例链接。
1050 0

热门文章

最新文章