【问题标题】:Render scrolling console渲染滚动控制台
【发布时间】:2016-05-24 11:58:56
【问题描述】:

如何渲染滚动控制台?示例:

内存内容(第 0 帧):

Line 0 
Line 1
Line 2
Line 3
Line 4

内存内容(第 1 帧):

Line 5
Line 1
Line 2
Line 3
Line 4

第 1 帧对应的屏幕输出:

Line 1
Line 2
Line 3
Line 4
Line 5

文本被渲染到帧缓冲区对象(涉及一些包装器):

auto N=r_console->rowsCountGet();
for(size_t k=0;k<N;++k)
    {
    glUniform3f(m_voffset_loc,0.0f,r_console->lineOffsetGet(k),0.0f);
    m_faces.dataSet(r_console->facesGet(k),GL_STATIC_DRAW);
    m_faces.draw();
    }

渲染适用于以内存顺序绘制内存内容的琐碎Console::lineOffsetGet:即

auto n_rows=rowsCountGet();
return -static_cast<float>(2*k)/static_cast<float>(n_rows);

其中k 是内存中的行。我找不到如何使Console::lineOffsetGet 进行所需的转换(将最新行放在底部)。它应该将内存中的一行k 映射到适当的y 坐标。给定内存中的行,需要找到一个公式来计算屏幕上的行。我试过试过了

auto n_rows=rowsCountGet();
auto m_line_current<=n_rows? //If current line fits on the screen it is trivial
    k : (k+ (n_rows-(m_line_current-n_rows)%n_rows))%n_rows;
return -static_cast<float>(2*k)/static_cast<float>(n_rows);

其中m_line_current 会随着从零开始写入控制台的每一行而增加。这适用于两个屏幕页面,但在第三个页面的开头中断。

【问题讨论】:

    标签: c++ modulo vertical-scrolling


    【解决方案1】:

    首先我意识到在计算当前行时存在错误。其次,在facesGet 中做模运算更容易。这样,就不需要减法了。该函数中的正确表达式很简单

    base + n_cols*(k + m_line_current)%n_rows
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-23
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      • 2014-03-31
      • 1970-01-01
      相关资源
      最近更新 更多