[Day 22] 2D批次渲染 (三) - 终於找到问题了

今日目标

  • [Debug] 批次渲染
  • DrawLine

终於找到问题在哪了...

终於找到问题在哪里,有两个地方写错了

顶点颜色的buffer size不正确

RenderCurrentBatch的地方,渲染之前会把要画得顶点座标送给GPU,这里面,我是把三种点点书属性都拆开,然後,在颜色那边vertex_buffer.colors那边的size数量写错了他是Vector4(RGBA),但给的大小是Vector2

// 错误
    glBufferSubData(GL_ARRAY_BUFFER, 0, CONTEXT.RenderState.vertex_buffer.colors_count * sizeof(V2f), CONTEXT.RenderState.vertex_buffer.colors);

// 修正
    glBufferSubData(GL_ARRAY_BUFFER, 0, CONTEXT.RenderState.vertex_buffer.colors_count * sizeof(V4f), CONTEXT.RenderState.vertex_buffer.colors);

绑定贴图(Texture)的参数,呼叫错误

一样是在RenderCurrentBatch那边,绑定「使用哪一张贴图」的地方,原本是长这样

glBindTexture(GL_TEXTURE0, CONTEXT.RenderState.default_texture.id);

要改成这样,才是把绑定当前贴图

glBindTexture(GL_TEXTURE_2D, CONTEXT.RenderState.default_texture.id);

DrawLine

终於,可以还一个欠了一段时间的债(奇怪,明明只过了3天,怎麽感觉过了很久@@),实作这个功能,直接上code

void DrawLine(V2f p0, V2f p1, int thinkness, Color c) {
    V2f delta = V2fSub(p1, p0);
    float len = V2fLen(delta);

    float scale = thinkness / (len * 2);
    V2f p = { -scale * delta.y, scale * delta.x };

    V2f top_right = { p1.x + p.x, p1.y + p.y };
    V2f bottom_right = { p1.x - p.x, p1.y - p.y };
    V2f top_left = { p0.x + p.x, p0.y + p.y };
    V2f bottom_left = { p0.x - p.x, p0.y - p.y };

    PushVertexData(top_right, top_left, bottom_right, bottom_left, c);
}

会这样设计是因为我把线段视为有厚度的矩形这样就可以跟其他的矩形,或是之後的贴图、贴图动画用同一个buffer与初始化好的EBO(储存顶点索引的阵列)。

在实作里面有用到一点小小的数学,当中V2f p是利用点积算出来的,先只看p0,如果要有厚度的,假设要画出一条水平线,那需要对p0.y加减thickness / 2的量,如果是单纯水平或垂直还好,但斜率在(0, 1)区间,的有些麻烦了,所以用了点积算出与该p0到p1的线段,点积为0(也就是垂直)的差值,就可以实际求出四个顶点座标了。

关於之前说过绘制不同的多边形...

批次渲染还有很多没完成的,例如: 使用不同的贴图、纹理(Texture Atlas),或许会先开始执着手文字渲染的部分,这个就会牵扯到图集使用的部分。

关於之前说过绘制不同的多边形,这个是为了Debug与验证SAT碰撞侦测做的,最近想了想或许以要完成2D Platformer来说,单纯的AABB就很够用了,如果不会有实际的物理反馈的化,不应该直接先停在这边,先已完成最小功能为目标才对(在平台上跑跑跳跳)。

今天就先这样,Codeu一样上传到github


<<:  [Day 17] Crypto 小满足

>>:  [Day17] 强制转型

透过 CancelToken 解析 Axios 原始码

本篇会藉由设计「取消重复请求机制」来解析 axios 的原始码,篇幅较长请耐心阅读。 其实要实践取...

利用JavaScript 连接Google Calendar与MySQL,同步编辑删除事件

为了将 Google Calendar 与 MySQL 事件同步需要建立 Google Api 与本...

Day13 用磁碟机播放唱片

上次在研究 CC: Tweaked 电脑磁碟机的时候 在 /rom/apis/disk.lua 发现...

浅谈DevOps & Observability

公司内部分享 公司20年老系统+传统组织, 正面临数位转型中 团队管理与开发定义SLO目标 DevO...

SSL凭证检测工具-SSL Lab

昨天讲完XSS的评估小工具後 接着是测试最最常见SSL凭证的漏洞 我们可以利用线上工具SSL Lab...