渲染滚动控制台
Render scrolling console
如何呈现滚动控制台?示例:
内存内容(第0帧):
Line 0
Line 1
Line 2
Line 3
Line 4
内存内容(第一帧):
Line 5
Line 1
Line 2
Line 3
Line 4
第一帧对应的屏幕输出:
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
从零开始写入控制台的每一行都会增加。这适用于两个屏幕页面,但在第三个页面的开头中断。
首先我意识到在计算当前行时有一个错误。其次,在facesGet
中做模运算更容易。这样就不需要做减法了。该函数中的正确表达式是
base + n_cols*(k + m_line_current)%n_rows
如何呈现滚动控制台?示例:
内存内容(第0帧):
Line 0
Line 1
Line 2
Line 3
Line 4
内存内容(第一帧):
Line 5
Line 1
Line 2
Line 3
Line 4
第一帧对应的屏幕输出:
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
从零开始写入控制台的每一行都会增加。这适用于两个屏幕页面,但在第三个页面的开头中断。
首先我意识到在计算当前行时有一个错误。其次,在facesGet
中做模运算更容易。这样就不需要做减法了。该函数中的正确表达式是
base + n_cols*(k + m_line_current)%n_rows