以下是 纹理的大小
(落于 [0.0 - 1.0]区间内)
和
顶点的大小([-1..1][-1..1]
)
char character = text[i]; float uv_x = (character%16)/16.0f; float uv_y = (character/16)/16.0f;
OpenGL3.0教程 第十一课:2D文本 摘录
这样做是可行的(基本可行,详见下文),因为A的ASCII值为65。
65%16 = 1,因此A位于第1列(列号从0开始)。
65/16 = 4,因此A位于第4行(这是整数除法,所以结果不是想象中的4.0625)
两者都除以16.0以使之落于[0.0 - 1.0]区间内,这正是OpenGL纹理所需的
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void main() { // Output position of the vertex, in clip space // map [0..800][0..600] to [-1..1][-1..1] vec2 vertexPosition_homoneneousspace = vertexPosition_screenspace - vec2(400,300); // [0..800][0..600] -> [-400..400][-300..300] vertexPosition_homoneneousspace /= vec2(400,300); gl_Position = vec4(vertexPosition_homoneneousspace,0,1); // UV of the vertex. No special space for this one. UV = vertexUV; }注意非常重要的一点:这些坐标位于[0,800][0,600]范围内。也就是说,这里 不需要 矩阵。vertex shader只需简单换算就可以把这些坐标转换到[-1,1][-1,1]范围内(也可以在C++代码中完成这一步)。