当前位置: 首页 > news >正文

Godot 4 着色器 - Shader调试

我之前用OpenCV进行图像相关处理,觉得已经很不错,结合GDI可以实现流畅的动画效果

直到近来用Shader后才发现,着色器更上一层楼,原来这是入了GPU的坑

Shader编程限制很多,各种不支持,看在它性能不错功能炫酷的份上,忍了,努力增加一些自己需要的功能

最优先的功能是调试需要,Shader的过程信息也不能输出到文本日志中,也不能输出到调试窗口中。查了一下,一般的做法就是在画面中用一些颜色表示。这应该是比较低效的了。

琢磨了一下,调试信息还是只能在画面上显示,不过信息最好能以图形、文字等形式展现

图形信息展示

一般来说,能在画面上把点、线、矩形、圆展示出来就OK,当然,点可以通过圆画出来。

先来最简单的线。主要的几个参数:

uv: UV坐标系的点,当前像素点坐标,归一化表示

firstPoint、secondPoint:线段的两点

lineWidth:线宽

startColor、endColor:计划实现渐变的颜色填充,这是填充的首尾色

gradientMethod:渐变模式,水平/垂直/中心辐射

// 【图形信息】在指定位置(两点式+线宽)画出线段
vec4 metaLog_Line(vec2 uv, vec2 firstPoint, vec2 secondPoint, float lineWidth, vec4 startColor, vec4 endColor, int gradientMethod, out bool inFlag) {float distance = distancePointToLine(uv, firstPoint, secondPoint) / lineWidth;inFlag = (distance < 0.5 && (length(uv - (firstPoint + secondPoint) / 2.0) <= length(firstPoint - secondPoint) / 2.0));if(inFlag) {float startDistance, endDistance;if((gradientMethod & DIR_VERT) == 0) {startDistance = length(uv - firstPoint);endDistance = length(uv - secondPoint);} else {bool atRightFlag = false; if(firstPoint.x == secondPoint.x)atRightFlag = uv.x >= firstPoint.x;else {float m = (secondPoint.y - firstPoint.y) / (secondPoint.x - firstPoint.x);float v = uv.y - m * (uv.x - firstPoint.x) - firstPoint.y;atRightFlag = (v >= 0.0);}endDistance = atRightFlag ? 0.5 - distance : .5 + distance;startDistance = atRightFlag ? 0.5 + distance : 0.5 - distance;}float startWeight = 1.0 - startDistance / (startDistance + endDistance);if((gradientMethod & GRADIENT_MIDDLE) > 0)startWeight = abs(startDistance - endDistance);return startColor* startWeight + endColor * (1.0 - startWeight);}return vec4(0);
}

核心思路就是判断uv是否在指定线宽的线段上(决定输出的inFlag),如果在其上就根据填充方式与uv位置、两点位置计算出颜色融合权重,并据此算出最终颜色值。如果不在其上就不受影响。

则调试时加入相应调用即可,如在翻页时,展示出鼠标所在位置与相应基准角点连线

loggedColor = metaLog_Line(uv, mousePoint / pageSize, basePoint / pageSize, 0.002, vec4(1.0, 0.0, 0.0, 1.0), vec4(1.0, 0.0, 0.0, 1.0), DIR_HORZ, inFlag, !WHOLE_LINE);
if(inFlag) color = loggedColor;			

 运行效果如下

 确认能达到调试效果。剩下的矩形、圆就轻松了。

// 【图形信息】在指定位置(p1、p2)画出矩形,
vec4 metaLog_Rect(vec2 uv, vec2 p1, vec2 p2, vec4 startColor, vec4 endColor, int gradientMethod, out bool inFlag) {vec2 leftTopPoint = vec2(min(p1.x, p2.x), min(p1.y, p2.y));vec2 rightBottomPoint = vec2(max(p1.x, p2.x), max(p1.y, p2.y));inFlag = isInRange(uv.x, leftTopPoint.x, rightBottomPoint.x) &&isInRange(uv.y, leftTopPoint.y, rightBottomPoint.y);if(inFlag) {float startDistance, endDistance;if((gradientMethod & DIR_VERT) == 0) {startDistance = (uv.x - leftTopPoint.x);endDistance = (rightBottomPoint.x - uv.x);} else {startDistance = (uv.y - leftTopPoint.y);endDistance = (rightBottomPoint.y - uv.y);}float startWeight = 1.0 - startDistance / (startDistance + endDistance);if((gradientMethod & GRADIENT_MIDDLE) > 0)startWeight = abs(startDistance - endDistance);return startColor * startWeight + endColor * (1.0 - startWeight);}return vec4(0); 
}// 【图形信息】在指定位置(圆心+半径)画出圆
vec4 metaLog_Circle(vec2 uv, vec2 centerPoint, float radius, vec4 startColor, vec4 endColor, int gradientMethod, out bool inFlag) {float distance = length(uv - centerPoint);inFlag = distance <= radius;if(inFlag) {float startWeight = 0.0;if( (gradientMethod & DIR_ZOOMIN) > 0 )startWeight = 1.0 - distance / radius;;if( (gradientMethod & DIR_ZOOMOUT) > 0)startWeight = distance / radius;return startColor * startWeight + endColor * (1.0 - startWeight);}return vec4(0);
}

思路差不多,根据当前像素点位置、待显示图形参数与渐变颜色,确定最终的颜色。

比如,折页碰到中间限制后,目标点就不能再为鼠标点了,需要调整,看起来才合理自然。

// 调整后的mousePoint输出显示
loggedColor = metaLog_Circle(uv, mousePoint / pageSize, 0.01, logFontColor, endColor, DIR_ZOOMIN, inFlag);
if(inFlag) color = loggedColor;

在此思路基础上 ,想用任何图形信息调试均可较轻松实现。

 文字输出

文字输出,本质上也是画出来,所以,首先要自己做一个字模。

做字模也简单,先确认目标,32*32的位图即可。其次是范围,中文太多肯定不用,就把可打印的ASCII字符做出来。之后用Word用某种喜欢的字体把这些字符录入,缩放到合适比例大小,确保可以截下来的每个字符图片均为32*32

花了一点时间,生成所需要的ASCII字符图片

 然后针对各图片逐行扫描,生成01码,每行32位,刚好一个int表示,这样一个字模用32个int表示。解析的C++代码:

TStrings * fileNames = new TStringList;
TStrings * results = new TStringList;
THelper::File::BrowseDir(fileNames, path, L"*.bmp", false);
for(int index = 0; index < fileNames->Count; ++index) {UnicodeString fileName = fileNames->Strings[index];cv::Mat mat = CvHelper::MatFromFile(fileName);mat = CvHelper::ToMat_GRAY(mat);threshold(mat, mat, 128, 255, cv::THRESH_BINARY);int v[32];UnicodeString valueInfo = L"";for(int row = 0; row < mat.rows; ++row) {int value = 0;UnicodeString s = L"";for(int col = 0; col < mat.cols; ++col) {value <<= 1;BYTE data = mat.at<BYTE>(row, col);if(data == 0)value += 1;s += data == 0 ? L"*" : L" ";}v[row] = value;THelper::Logi(L"%s > 0x%X", s, value);if(row)valueInfo += L", ";valueInfo += FORMAT(L"0x%X", value);}results->Add(FORMAT(L"if(asciiChar == 0x%02X) model.Model = int[](%s);",TTypeConvert::String2Int(THelper::File::ExtractPureFileName(fileName)), valueInfo));
}
THelper::Logi(L"result:\n%s", TTypeConvert::StringList2String(results, L"\n"));
delete results;
delete fileNames;

从而生成Shader可用字模代码:

int Model[32];if(asciiChar == 0x21) Model = int[](0x0, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x3C000, 0x38000, 0x38000, 0x38000, 0x38000, 0x38000, 0x38000, 0x38000, 0x38000, 0x38000, 0x38000, 0x38000, 0x38000, 0x0, 0x0, 0x0, 0x0, 0x7C000, 0xFE000, 0xFE000, 0xFE000, 0xFE000, 0x7C000, 0x38000, 0x0);
else if(asciiChar == 0x22) Model = int[](0x0, 0x381C00, 0x7C3E00, 0xFE7F00, 0xFE7F00, 0xFE3F00, 0x7E3F00, 0xE0700, 0xE0700, 0x1C0E00, 0x1C0E00, 0x381C00, 0xF07C00, 0xE07000, 0x402000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x23) Model = int[](0x0, 0x0, 0xE0E00, 0xC0E00, 0xC0E00, 0x1C0C00, 0x1C0C00, 0x1C1C00, 0x1C1C00, 0x1C1C00, 0x1FFFF80, 0x1FFFF80, 0x1FFFF80, 0x381800, 0x381800, 0x383800, 0x383800, 0x383800, 0x383800, 0x3FFFF80, 0x3FFFF80, 0x3FFFF00, 0x703000, 0x707000, 0x707000, 0x707000, 0x707000, 0x707000, 0x607000, 0xE07000, 0x606000, 0x0);
else if(asciiChar == 0x24) Model = int[](0x0, 0x18000, 0x18000, 0x18000, 0x18000, 0x1C000, 0xFF000, 0x1FFC00, 0x3FFE00, 0x780C00, 0x780000, 0x780000, 0x780000, 0x3E0000, 0x3F8000, 0x1FF000, 0x7F800, 0xFC00, 0x3E00, 0x1F00, 0xF00, 0xF00, 0x700E00, 0xFC3E00, 0x7FFC00, 0x1FF800, 0x3C000, 0x18000, 0x18000, 0x18000, 0x18000, 0x18000);
else if(asciiChar == 0x25) Model = int[](0x0, 0x0, 0xF80000, 0x1FE0040, 0x3CF00E0, 0x38701E0, 0x70703C0, 0x7038380, 0x7038700, 0x7038E00, 0x7039C00, 0x7871800, 0x38F0000, 0x1FE0000, 0x1FC0000, 0x300000, 0x3F80, 0x7FC0, 0xC71E0, 0x1CE0E0, 0x38E0E0, 0x70E0F0, 0xE0E0F0, 0x1E0E0E0, 0x3C0E0E0, 0x780F0E0, 0x30079E0, 0x3FC0, 0x1F00, 0x0, 0x0, 0x0);
else if(asciiChar == 0x26) Model = int[](0x0, 0x0, 0x1F0000, 0x3FC000, 0x7FE000, 0x70E000, 0xF0E000, 0xE0E000, 0xE0E000, 0xE0E000, 0xF1C000, 0xF3C000, 0x7F8000, 0x7F0000, 0x7C01C0, 0xFC01C0, 0x1FE03C0, 0x3FF03C0, 0x3CF8780, 0x787C780, 0x783EF00, 0x781FF00, 0x780FE00, 0x7807E00, 0x7C07F00, 0x3E0FFC0, 0x1FFFFE0, 0xFFE3C0, 0x7F80C0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x27) Model = int[](0x0, 0x3C000, 0x3E000, 0x7E000, 0x7E000, 0x3F000, 0x1F000, 0x6000, 0xE000, 0xE000, 0x1C000, 0x3C000, 0x78000, 0x20000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x28) Model = int[](0x1000, 0x7800, 0x7000, 0xE000, 0x1C000, 0x1C000, 0x38000, 0x38000, 0x70000, 0x70000, 0x60000, 0xE0000, 0xE0000, 0xE0000, 0xE0000, 0xE0000, 0xE0000, 0xE0000, 0xE0000, 0xE0000, 0x60000, 0x70000, 0x70000, 0x78000, 0x38000, 0x3C000, 0x1C000, 0xE000, 0x7000, 0x7800, 0x1000, 0x0);
else if(asciiChar == 0x29) Model = int[](0x40000, 0xF0000, 0x70000, 0x38000, 0x1C000, 0x1C000, 0xE000, 0xF000, 0x7000, 0x7000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3000, 0x7000, 0x7000, 0xE000, 0xE000, 0x1C000, 0x1C000, 0x38000, 0x70000, 0xF0000, 0x40000, 0x0);
else if(asciiChar == 0x2A) Model = int[](0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x41C100, 0xF9CF80, 0x7FFF00, 0x1FFC00, 0x7E000, 0x3E000, 0x7F000, 0xF7800, 0xE3800, 0x1C1C00, 0x380C00, 0x180C00, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x2B) Model = int[](0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1FFFFC0, 0x1FFFFC0, 0x1FFFFC0, 0x3C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x2C) Model = int[](0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3C000, 0x7E000, 0x7E000, 0x7E000, 0x7F000, 0x3F000, 0xF000, 0xE000, 0xE000, 0x1E000, 0x3C000, 0xF8000, 0xF0000, 0x40000);
else if(asciiChar == 0x2D) Model = int[](0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3FFFFF0, 0x3FFFFF0, 0x3FFFFF0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x2E) Model = int[](0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1C000, 0x7E000, 0x7E000, 0x7F000, 0x7E000, 0x3E000, 0x1C000, 0x0);
else if(asciiChar == 0x2F) Model = int[](0x700, 0xE00, 0xE00, 0x1E00, 0x1C00, 0x1C00, 0x3800, 0x3800, 0x3800, 0x7000, 0x7000, 0xF000, 0xE000, 0xE000, 0x1C000, 0x1C000, 0x1C000, 0x38000, 0x38000, 0x78000, 0x70000, 0x70000, 0xE0000, 0xE0000, 0xE0000, 0x1C0000, 0x1C0000, 0x3C0000, 0x380000, 0x380000, 0x700000, 0x0);
else if(asciiChar == 0x30) Model = int[](0x18000, 0x1FF800, 0x3FFC00, 0x7FFE00, 0xFC3F00, 0x1F80F80, 0x1F00780, 0x3E007C0, 0x3E003C0, 0x3C003C0, 0x3C003E0, 0x7C003E0, 0x7C081E0, 0x7C3C1E0, 0x7C7E1E0, 0x787E1E0, 0x787E1E0, 0x7C7E1E0, 0x7C3C1E0, 0x7C001E0, 0x7C003E0, 0x3C003E0, 0x3C003C0, 0x3E003C0, 0x3E007C0, 0x1F00780, 0x1F80F80, 0xFC3F00, 0x7FFE00, 0x3FFC00, 0x1FF800, 0x1C000);
else if(asciiChar == 0x31) Model = int[](0x0, 0x1F000, 0x7F000, 0xFFF000, 0xFFF000, 0xFFF000, 0x1F000, 0x1F000, 0x1F000, 0x1F000, 0x1F000, 0x1F000, 0x1F000, 0x1F000, 0x1F000, 0x1F000, 0x1F000, 0x1F000, 0x1F000, 0x1F000, 0x1F000, 0x1F000, 0x1F000, 0x1F000, 0x1F000, 0x1F000, 0x1F000, 0x1FFFFE0, 0x3FFFFE0, 0x3FFFFE0, 0x3FFFFE0, 0x0);
else if(asciiChar == 0x32) Model = int[](0x30000, 0x3FF000, 0xFFFC00, 0x1FFFE00, 0x3F87F00, 0x7C01F00, 0x3800F80, 0xF80, 0xF80, 0x780, 0x780, 0xF80, 0xF80, 0xF00, 0x1F00, 0x3E00, 0x7C00, 0x7C00, 0xF800, 0x1F000, 0x3E000, 0x7C000, 0xF8000, 0x1F0000, 0x7E0000, 0xFC0000, 0x1F80000, 0x3FFFFE0, 0x7FFFFE0, 0x7FFFFE0, 0x7FFFFE0, 0x0);
else if(asciiChar == 0x33) Model = int[](0x38000, 0x3FF800, 0xFFFE00, 0x1FFFF00, 0x3F87F00, 0x1E01F80, 0x1800F80, 0x780, 0x7C0, 0x780, 0xF80, 0xF80, 0x3F00, 0x1FE00, 0x1FF800, 0x1FF000, 0x1FFC00, 0x1FF00, 0x1F80, 0xFC0, 0x7C0, 0x3C0, 0x3E0, 0x3E0, 0x7C0, 0x30007C0, 0x7C00FC0, 0x7F87F80, 0x3FFFF00, 0x1FFFE00, 0x7FF800, 0x78000);
else if(asciiChar == 0x34) Model = int[](0x0, 0x3E00, 0x7E00, 0xFE00, 0x1FE00, 0x1FE00, 0x3DE00, 0x7DE00, 0xF9E00, 0xF1E00, 0x1F1E00, 0x3E1E00, 0x7C1E00, 0x781E00, 0xF81E00, 0x1F01E00, 0x3E01E00, 0x3C01E00, 0x7801E00, 0xFFFFFE0, 0xFFFFFF0, 0xFFFFFF0, 0xFFFFFF0, 0x1E00, 0x1E00, 0x1E00, 0x1E00, 0x1E00, 0x1E00, 0x1E00, 0x1E00, 0x0);
else if(asciiChar == 0x35) Model = int[](0x0, 0xFFFF80, 0xFFFF80, 0xFFFF80, 0xFFFF80, 0xF00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1E00000, 0x1E7F000, 0x1FFFE00, 0x1FFFF00, 0x1FCFF80, 0xE01FC0, 0xFC0, 0x7C0, 0x3E0, 0x3E0, 0x3E0, 0x3E0, 0x3C0, 0x7C0, 0x3000FC0, 0x7C01F80, 0x7F07F80, 0x3FFFF00, 0x1FFFC00, 0x7FF800, 0x78000);
else if(asciiChar == 0x36) Model = int[](0x6000, 0x7FE00, 0x1FFF80, 0x3FFFC0, 0x7F8FC0, 0xFC0180, 0xF80000, 0x1F00000, 0x1E00000, 0x3E00000, 0x3E00000, 0x3C00000, 0x3C00000, 0x3C3FE00, 0x7CFFF00, 0x7DFFF80, 0x7FE0FC0, 0x7F007C0, 0x7E003E0, 0x3C003E0, 0x3C001E0, 0x3C001E0, 0x3C001E0, 0x3E001E0, 0x1E003E0, 0x1F003E0, 0xF807C0, 0xFE1FC0, 0x7FFF80, 0x3FFE00, 0xFFC00, 0x1C000);
else if(asciiChar == 0x37) Model = int[](0x0, 0x7FFFFE0, 0x7FFFFE0, 0x7FFFFE0, 0x7FFFFE0, 0x7C0, 0x780, 0xF00, 0x1F00, 0x1E00, 0x3C00, 0x7C00, 0x7800, 0xF800, 0xF000, 0x1F000, 0x1E000, 0x1E000, 0x3E000, 0x3C000, 0x3C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x78000, 0x78000, 0xF8000, 0xF8000, 0xF8000, 0xF8000, 0x0);
else if(asciiChar == 0x38) Model = int[](0x1C000, 0x1FF800, 0x3FFE00, 0x7FFF00, 0xFC1F80, 0x1F00F80, 0x1E007C0, 0x1E003C0, 0x1E003C0, 0x1E003C0, 0x1F00380, 0x1F80780, 0xFC0F00, 0x7F1F00, 0x3FFE00, 0x1FFC00, 0x3FFE00, 0xF8FF00, 0x1F01F80, 0x3E00FC0, 0x3C007E0, 0x78003E0, 0x78001E0, 0x78001E0, 0x7C001E0, 0x7C003E0, 0x3E007C0, 0x3F80FC0, 0x1FFFF80, 0xFFFF00, 0x3FFC00, 0x3C000);
else if(asciiChar == 0x39) Model = int[](0x30000, 0x3FF000, 0x7FFC00, 0xFFFE00, 0x1F83F00, 0x3E01F00, 0x3E00F80, 0x7C007C0, 0x7C007C0, 0x78003C0, 0x78003C0, 0x78003E0, 0x7C003E0, 0x7C007E0, 0x3E00FE0, 0x3F03FE0, 0x1FFFFE0, 0xFFF3E0, 0x7FE3E0, 0x603E0, 0x3C0, 0x3C0, 0x7C0, 0x780, 0xF80, 0x1F80, 0x1C03F00, 0x3F0FE00, 0x3FFFC00, 0x1FFF800, 0x7FE000, 0xF0000);
else if(asciiChar == 0x3A) Model = int[](0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1C000, 0x3E000, 0x7F000, 0x7F000, 0x7F000, 0x3E000, 0x3C000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1C000, 0x3E000, 0x7F000, 0x7F000, 0x7F000, 0x7E000, 0x3E000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x3B) Model = int[](0x0, 0x0, 0x0, 0x3C000, 0x7E000, 0x7E000, 0x7E000, 0x7E000, 0x7C000, 0x18000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3C000, 0x7E000, 0x7E000, 0x7F000, 0x7F000, 0x1F000, 0xE000, 0xE000, 0xE000, 0x1C000, 0x3C000, 0xF8000, 0xE0000, 0x0, 0x0, 0x0);
else if(asciiChar == 0x3C) Model = int[](0x0, 0x0, 0x0, 0x0, 0x200, 0x600, 0x1E00, 0x3E00, 0xFC00, 0x1F000, 0x7E000, 0xF8000, 0x3F0000, 0x7C0000, 0xF80000, 0xF00000, 0xF80000, 0x7C0000, 0x3F0000, 0xF8000, 0x7E000, 0x1F000, 0xFC00, 0x3E00, 0x1E00, 0x600, 0x200, 0x0, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x3D) Model = int[](0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3FFFFF0, 0x3FFFFF0, 0x3FFFFF0, 0x3FFFFF0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3FFFFF0, 0x3FFFFF0, 0x3FFFFF0, 0x3FFFFF0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x3E) Model = int[](0x0, 0x0, 0x0, 0x0, 0x400000, 0x600000, 0x780000, 0x7C0000, 0x3F0000, 0xF8000, 0x7E000, 0x1F000, 0xFC00, 0x3E00, 0x1F00, 0xF00, 0x1F00, 0x3E00, 0xFC00, 0x1F000, 0x7E000, 0xF8000, 0x3F0000, 0x7C0000, 0x780000, 0x600000, 0x400000, 0x0, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x3F) Model = int[](0x0, 0x0, 0x0, 0x7E000, 0x1FF800, 0x3FFC00, 0x7C3E00, 0x301E00, 0xE00, 0xE00, 0x1E00, 0x1E00, 0x3C00, 0x7800, 0xF000, 0x1E000, 0x3C000, 0x3C000, 0x38000, 0x38000, 0x0, 0x0, 0x0, 0x3C000, 0x7C000, 0x7E000, 0x7E000, 0x7E000, 0x3C000, 0x0, 0x0, 0x0);
else if(asciiChar == 0x40) Model = int[](0x0, 0x3F000, 0xFFC00, 0x3F3E00, 0x780700, 0x700700, 0xE00380, 0xE00380, 0x1C00380, 0x1C00180, 0x1800780, 0x3807F80, 0x381FF80, 0x383E380, 0x3878380, 0x3870380, 0x3870380, 0x3870380, 0x3870780, 0x387FF80, 0x383F980, 0x180E000, 0x1C00000, 0x1C00000, 0xE00000, 0xF00000, 0x700000, 0x3C0600, 0x1FFF00, 0xFFC00, 0x1F000, 0x0);
else if(asciiChar == 0x41) Model = int[](0x0, 0x0, 0xFC000, 0xFC000, 0xFC000, 0x1FE000, 0x1DE000, 0x1DE000, 0x3CF000, 0x3CF000, 0x38F000, 0x787800, 0x787800, 0x707800, 0xF07C00, 0xF03C00, 0xF03C00, 0x1E03E00, 0x1FFFE00, 0x1FFFE00, 0x3FFFF00, 0x3FFFF00, 0x3C00F00, 0x7800F80, 0x7800F80, 0x7800780, 0xF8007C0, 0xF0007C0, 0xF0003C0, 0x1F0003E0, 0x0, 0x0);
else if(asciiChar == 0x42) Model = int[](0x0, 0x7FFE000, 0x7FFF800, 0x7FFFE00, 0x7FFFE00, 0x7C03F00, 0x7C01F00, 0x7C00F00, 0x7C00F80, 0x7C00F00, 0x7C00F00, 0x7C01F00, 0x7C03E00, 0x7FFFC00, 0x7FFF800, 0x7FFF800, 0x7FFFE00, 0x7C07F00, 0x7C00F80, 0x7C007C0, 0x7C007C0, 0x7C003C0, 0x7C003C0, 0x7C007C0, 0x7C007C0, 0x7C00FC0, 0x7C01F80, 0x7FFFF80, 0x7FFFF00, 0x7FFFC00, 0x7FFF000, 0x0);
else if(asciiChar == 0x43) Model = int[](0x1FC00, 0xFFF00, 0x1FFFC0, 0x7FFFE0, 0x7F07E0, 0xFC01C0, 0x1F80000, 0x1F00000, 0x3E00000, 0x3E00000, 0x3C00000, 0x7C00000, 0x7C00000, 0x7C00000, 0x7C00000, 0x7C00000, 0x7C00000, 0x7C00000, 0x7C00000, 0x7C00000, 0x7C00000, 0x3E00000, 0x3E00000, 0x3F00000, 0x1F80040, 0xFC00E0, 0xFE03E0, 0x7FFFE0, 0x3FFFC0, 0xFFF80, 0x3FE00, 0x0);
else if(asciiChar == 0x44) Model = int[](0x0, 0x7FF8000, 0x7FFF000, 0x7FFFC00, 0x7FFFE00, 0x7C07F00, 0x7C03F00, 0x7C01F80, 0x7C00FC0, 0x7C007C0, 0x7C007C0, 0x7C003C0, 0x7C003E0, 0x7C003E0, 0x7C003E0, 0x7C003E0, 0x7C003E0, 0x7C003E0, 0x7C003E0, 0x7C003E0, 0x7C007C0, 0x7C007C0, 0x7C007C0, 0x7C00F80, 0x7C01F80, 0x7C03F00, 0x7C07F00, 0x7FFFE00, 0x7FFFC00, 0x7FFF000, 0x7FFC000, 0x0);
else if(asciiChar == 0x45) Model = int[](0x0, 0x3FFFF80, 0x3FFFF80, 0x3FFFF80, 0x3FFFF80, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3FFFC00, 0x3FFFE00, 0x3FFFE00, 0x3FFFE00, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3FFFF80, 0x3FFFF80, 0x3FFFF80, 0x3FFFF80, 0x0);
else if(asciiChar == 0x46) Model = int[](0x0, 0x1FFFFC0, 0x1FFFFC0, 0x1FFFFC0, 0x1FFFFC0, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1FFFF00, 0x1FFFF00, 0x1FFFF00, 0x1FFFF00, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x0);
else if(asciiChar == 0x47) Model = int[](0x1FC00, 0xFFF00, 0x1FFFC0, 0x7FFFE0, 0xFF07C0, 0xFC0180, 0x1F80000, 0x1F00000, 0x3E00000, 0x3E00000, 0x3C00000, 0x7C00000, 0x7C00000, 0x7C00000, 0x7C00000, 0x7C07FE0, 0x7C07FE0, 0x7C07FE0, 0x7C03FE0, 0x7C001E0, 0x7C001E0, 0x3E001E0, 0x3E001E0, 0x3F001E0, 0x1F001E0, 0x1F801E0, 0xFE03E0, 0x7FFFE0, 0x3FFFC0, 0x1FFF80, 0x3FE00, 0x0);
else if(asciiChar == 0x48) Model = int[](0x0, 0x3E003E0, 0x3E003E0, 0x3E003E0, 0x3E003E0, 0x3E003E0, 0x3E003E0, 0x3E003E0, 0x3E003E0, 0x3E003E0, 0x3E003E0, 0x3E003E0, 0x3E003E0, 0x3FFFFE0, 0x3FFFFE0, 0x3FFFFE0, 0x3FFFFE0, 0x3E003E0, 0x3E003E0, 0x3E003E0, 0x3E003E0, 0x3E003E0, 0x3E003E0, 0x3E003E0, 0x3E003E0, 0x3E003E0, 0x3E003E0, 0x3E003E0, 0x3E003E0, 0x3E003E0, 0x3E003E0, 0x0);
else if(asciiChar == 0x49) Model = int[](0x0, 0x3FFFF80, 0x3FFFF80, 0x3FFFF80, 0x3FFFF80, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x3FFFF80, 0x3FFFF80, 0x3FFFF80, 0x3FFFF80, 0x0);
else if(asciiChar == 0x4A) Model = int[](0x0, 0xFFFFC0, 0xFFFFC0, 0xFFFFC0, 0x7FFFC0, 0x7C0, 0x7C0, 0x7C0, 0x7C0, 0x7C0, 0x7C0, 0x7C0, 0x7C0, 0x7C0, 0x7C0, 0x7C0, 0x7C0, 0x7C0, 0x7C0, 0x7C0, 0x7C0, 0x7C0, 0x7C0, 0x780, 0x800F80, 0x1C00F80, 0x3E01F80, 0x1F87F00, 0x1FFFE00, 0xFFFE00, 0x3FF800, 0x7C000);
else if(asciiChar == 0x4B) Model = int[](0x0, 0x7C007C0, 0x7C00FC0, 0x7C01F80, 0x7C01F00, 0x7C03E00, 0x7C07C00, 0x7C0F800, 0x7C1F800, 0x7C3F000, 0x7C3E000, 0x7C7C000, 0x7CF8000, 0x7DFC000, 0x7FFC000, 0x7FFE000, 0x7FFF000, 0x7F9F000, 0x7F0F800, 0x7F0F800, 0x7E07C00, 0x7C07C00, 0x7C03E00, 0x7C03E00, 0x7C01F00, 0x7C01F80, 0x7C00F80, 0x7C007C0, 0x7C007C0, 0x7C003E0, 0x7C003E0, 0x0);
else if(asciiChar == 0x4C) Model = int[](0x0, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x3FFFF80, 0x3FFFF80, 0x3FFFF80, 0x3FFFF80, 0x0);
else if(asciiChar == 0x4D) Model = int[](0x0, 0x7E007C0, 0x7E007C0, 0x7E00FC0, 0x7E00FC0, 0x7F00FC0, 0x7F01FC0, 0x7F01FC0, 0x7F81DC0, 0x7B83DC0, 0x7B83BC0, 0x7BC3BC0, 0x7BC7BC0, 0x79C73C0, 0x79E73C0, 0x79EF3C0, 0x78EE3C0, 0x78FE3C0, 0x78FE3C0, 0x787C3C0, 0x787C3C0, 0x783C3C0, 0x78383C0, 0x78003C0, 0x78003C0, 0x78003C0, 0x78003C0, 0x78003C0, 0x78003C0, 0x78003C0, 0x78003C0, 0x0);
else if(asciiChar == 0x4E) Model = int[](0x0, 0x3E003C0, 0x3F003C0, 0x3F003C0, 0x3F803C0, 0x3F803C0, 0x3FC03C0, 0x3FC03C0, 0x3DE03C0, 0x3DE03C0, 0x3DF03C0, 0x3CF03C0, 0x3CF83C0, 0x3C783C0, 0x3C7C3C0, 0x3C3C3C0, 0x3C3E3C0, 0x3C1E3C0, 0x3C1F3C0, 0x3C0F3C0, 0x3C0F3C0, 0x3C07BC0, 0x3C07BC0, 0x3C03FC0, 0x3C03FC0, 0x3C01FC0, 0x3C01FC0, 0x3C00FC0, 0x3C00FC0, 0x3C007C0, 0x3C007C0, 0x0);
else if(asciiChar == 0x4F) Model = int[](0xFE000, 0x3FF800, 0x7FFE00, 0xFFFF00, 0x1FC3F00, 0x3F01F80, 0x3E00FC0, 0x7C007C0, 0x7C007C0, 0x7C003E0, 0xF8003E0, 0xF8003E0, 0xF8001E0, 0xF8001E0, 0xF8001E0, 0xF8001F0, 0xF8001F0, 0xF8001E0, 0xF8001E0, 0xF8003E0, 0xF8003E0, 0x7C003E0, 0x7C003C0, 0x7C007C0, 0x3E00FC0, 0x3F00F80, 0x1F83F80, 0xFFFF00, 0xFFFE00, 0x3FFC00, 0xFF000, 0x0);
else if(asciiChar == 0x51) Model = int[](0xF0000, 0x3FE000, 0xFFF000, 0x1FFF800, 0x1E07C00, 0x3C03C00, 0x3C03C00, 0x7801E00, 0x7801E00, 0x7801E00, 0x7800E00, 0x7800E00, 0x7800F00, 0x7800F00, 0x7800E00, 0x7801E00, 0x7801E00, 0x7801E00, 0x7801E00, 0x3C03C00, 0x3C03C00, 0x1E07800, 0xFFF800, 0x7FF000, 0x3FC000, 0xF0000, 0x78000, 0x3C000, 0x3FE00, 0x1FF00, 0x7F00, 0x0);
else if(asciiChar == 0x52) Model = int[](0x0, 0x7FFF000, 0x7FFFC00, 0x7FFFF00, 0x7FFFF00, 0x7C01F80, 0x7C00F80, 0x7C007C0, 0x7C007C0, 0x7C007C0, 0x7C007C0, 0x7C007C0, 0x7C007C0, 0x7C00F80, 0x7C01F80, 0x7FFFF00, 0x7FFFE00, 0x7FFFC00, 0x7FFF000, 0x7C1F000, 0x7C1F800, 0x7C0F800, 0x7C0FC00, 0x7C07C00, 0x7C03E00, 0x7C03E00, 0x7C01F00, 0x7C01F80, 0x7C00F80, 0x7C00FC0, 0x7C007C0, 0x7C003E0);
else if(asciiChar == 0x53) Model = int[](0x7F000, 0x3FFE00, 0x7FFF80, 0xFFFFC0, 0x1FC0F80, 0x1F00380, 0x1E00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x1F00000, 0x1FC0000, 0xFF0000, 0xFFC000, 0x3FF800, 0x1FFE00, 0x3FF00, 0xFF80, 0x3FC0, 0xFE0, 0x7E0, 0x3E0, 0x3E0, 0x3E0, 0x18003E0, 0x3C007C0, 0x7F00FC0, 0x3FFFF80, 0x1FFFF00, 0x7FFE00, 0x1FF800, 0x0);
else if(asciiChar == 0x54) Model = int[](0x0, 0xFFFFFF8, 0xFFFFFF8, 0xFFFFFF8, 0xFFFFFF8, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3C000);
else if(asciiChar == 0x55) Model = int[](0x7C003C0, 0x7C003C0, 0x7C003C0, 0x7C003C0, 0x7C003C0, 0x7C003C0, 0x7C003C0, 0x7C003C0, 0x7C003C0, 0x7C003C0, 0x7C003C0, 0x7C003C0, 0x7C003C0, 0x7C003C0, 0x7C003C0, 0x7C003C0, 0x7C003C0, 0x7C003C0, 0x7C003C0, 0x7C003C0, 0x7C003C0, 0x7C007C0, 0x7C007C0, 0x7C007C0, 0x3E00780, 0x3F00F80, 0x3F83F80, 0x1FFFF00, 0xFFFE00, 0x7FFC00, 0x1FF000, 0x0);
else if(asciiChar == 0x56) Model = int[](0x0, 0xF8000F8, 0xF8000F0, 0x7C001F0, 0x7C001F0, 0x7C001E0, 0x3E001E0, 0x3E003E0, 0x3E003E0, 0x1E003C0, 0x1F007C0, 0x1F007C0, 0xF00780, 0xF80780, 0xF80F80, 0x780F00, 0x7C0F00, 0x7C1F00, 0x7C1E00, 0x3C1E00, 0x3E1E00, 0x3E3C00, 0x1E3C00, 0x1E3C00, 0x1F7C00, 0xF7800, 0xF7800, 0xFF800, 0x7F000, 0x7F000, 0x7F000, 0x3E000);
else if(asciiChar == 0x57) Model = int[](0x0, 0x3E0000F8, 0x3E0000F8, 0x3E0000F8, 0x3F0000F8, 0x1F0000F8, 0x1F0000F8, 0x1F0000F8, 0x1F0000F0, 0x1F03C0F0, 0x1F03C0F0, 0xF07E1F0, 0xF07E1F0, 0xF07E1F0, 0xF8FE1F0, 0xF8FF1E0, 0xF8EF1E0, 0xF8EF1E0, 0x79EF1E0, 0x79E79E0, 0x79E79E0, 0x79C7BE0, 0x7BC7BC0, 0x7BC3BC0, 0x7BC3FC0, 0x3F83FC0, 0x3F83FC0, 0x3F81FC0, 0x3F81FC0, 0x3F01F80, 0x3F01F80, 0x3F01F80);
else if(asciiChar == 0x58) Model = int[](0x0, 0x7C003E0, 0x7E007C0, 0x3E007C0, 0x1F00F80, 0x1F00F00, 0xF81F00, 0xF81E00, 0x7C3E00, 0x7C3C00, 0x3E7C00, 0x1E7800, 0x1FF000, 0xFF000, 0xFE000, 0x7E000, 0xFE000, 0xFF000, 0x1FF000, 0x1EF800, 0x3EF800, 0x7C7C00, 0x7C3C00, 0xF83E00, 0xF01F00, 0x1F01F00, 0x1E00F80, 0x3E00F80, 0x7C007C0, 0x7C007E0, 0xF8003E0, 0x0);
else if(asciiChar == 0x59) Model = int[](0x0, 0xF8000F0, 0x7C001F0, 0x7C001E0, 0x3E003E0, 0x3E003C0, 0x1F007C0, 0x1F00780, 0xF80F80, 0xF80F00, 0x7C1F00, 0x7C1E00, 0x3C3E00, 0x3E3C00, 0x1E7C00, 0x1F7800, 0xFF800, 0xFF000, 0x7F000, 0x7E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x3E000, 0x0);
else if(asciiChar == 0x5A) Model = int[](0x0, 0x3FFFFE0, 0x3FFFFE0, 0x3FFFFE0, 0x3FFFFC0, 0x7C0, 0xF80, 0x1F00, 0x1F00, 0x3E00, 0x7C00, 0xFC00, 0xF800, 0x1F000, 0x3E000, 0x3E000, 0x7C000, 0xF8000, 0xF8000, 0x1F0000, 0x3E0000, 0x3E0000, 0x7C0000, 0xF80000, 0xF80000, 0x1F00000, 0x3E00000, 0x3FFFFE0, 0x7FFFFE0, 0x7FFFFE0, 0x7FFFFE0, 0x0);
else if(asciiChar == 0x5B) Model = int[](0x0, 0x1FF800, 0x1FF800, 0x1C0000, 0x1C0000, 0x1C0000, 0x1C0000, 0x1C0000, 0x1C0000, 0x1C0000, 0x1C0000, 0x1C0000, 0x1C0000, 0x1C0000, 0x1C0000, 0x1C0000, 0x1C0000, 0x1C0000, 0x1C0000, 0x1C0000, 0x1C0000, 0x1C0000, 0x1C0000, 0x1C0000, 0x1C0000, 0x1C0000, 0x1C0000, 0x1C0000, 0x1C0000, 0x1C0000, 0x1FF800, 0x1FF800);
else if(asciiChar == 0x5C) Model = int[](0x0, 0x700000, 0x380000, 0x380000, 0x3C0000, 0x1C0000, 0x1C0000, 0xE0000, 0xE0000, 0xF0000, 0x70000, 0x70000, 0x78000, 0x38000, 0x3C000, 0x1C000, 0x1C000, 0x1E000, 0xE000, 0xF000, 0x7000, 0x7000, 0x7800, 0x3800, 0x3800, 0x1C00, 0x1C00, 0x1E00, 0xE00, 0xE00, 0x700, 0x0);
else if(asciiChar == 0x5D) Model = int[](0x0, 0x1FF800, 0x1FF800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x1FF800, 0x1FF800);
else if(asciiChar == 0x5E) Model = int[](0x0, 0x1C000, 0x3E000, 0x3E000, 0x7E000, 0x77000, 0x77000, 0xE3800, 0xE3800, 0x1E3800, 0x1C1C00, 0x1C1C00, 0x381E00, 0x380E00, 0x780E00, 0x700700, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x5F) Model = int[](0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7FFFFC0, 0x7FFFFC0, 0x7FFFFC0, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x60) Model = int[](0x0, 0x60000, 0xF0000, 0x1F8000, 0xFC000, 0x7C000, 0x3E000, 0x1F000, 0xF000, 0x6000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x61) Model = int[](0x0, 0x0, 0x0, 0x0, 0x0, 0xFF000, 0x3FFC00, 0xFFFE00, 0x1FFFF00, 0xE01F00, 0x800F80, 0xF80, 0x780, 0x7F80, 0xFFF80, 0x3FFF80, 0xFF0780, 0x1F80780, 0x1E00780, 0x3C00780, 0x3C00780, 0x3C00F80, 0x3E03F80, 0x3F8FF80, 0x1FFF780, 0xFFE780, 0x3F8380, 0x0, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x62) Model = int[](0x1E00000, 0x1E00000, 0x1E00000, 0x1E00000, 0x1E00000, 0x1E00000, 0x1E00000, 0x1E00000, 0x1E00000, 0x1E1F800, 0x1E7FE00, 0x1FFFF00, 0x1FFFF80, 0x1FC0F80, 0x1F007C0, 0x1E007C0, 0x1E003C0, 0x1E003E0, 0x1E003E0, 0x1E003E0, 0x1E003E0, 0x1E003E0, 0x1E003C0, 0x1E003C0, 0x1E007C0, 0x1F00F80, 0x1F81F80, 0x1FFFF00, 0x1FFFE00, 0x1EFFC00, 0x1C1F000, 0x0);
else if(asciiChar == 0x63) Model = int[](0x0, 0x0, 0x0, 0x0, 0x0, 0x3F800, 0x1FFF00, 0x3FFF80, 0x7FFF80, 0xFC0380, 0x1F80000, 0x1F00000, 0x1E00000, 0x3E00000, 0x3E00000, 0x3C00000, 0x3C00000, 0x3E00000, 0x3E00000, 0x3E00000, 0x1F00000, 0x1F80000, 0xFC0380, 0x7F9FC0, 0x3FFF80, 0x1FFF00, 0x7F800, 0x0, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x64) Model = int[](0x7C0, 0x7C0, 0x7C0, 0x7C0, 0x7C0, 0x7C0, 0x7C0, 0x7C0, 0x7C0, 0xFC7C0, 0x1FF7C0, 0x7FFFC0, 0xFFFFC0, 0xF80FC0, 0x1F007C0, 0x1F007C0, 0x3E007C0, 0x3E007C0, 0x3E007C0, 0x3C007C0, 0x3C007C0, 0x3C007C0, 0x3E007C0, 0x3E007C0, 0x1E007C0, 0x1F00FC0, 0x1F81FC0, 0xFFFFC0, 0x7FFBC0, 0x3FF3C0, 0xFC180, 0x0);
else if(asciiChar == 0x65) Model = int[](0x0, 0x0, 0x0, 0x0, 0x0, 0x3F800, 0x1FFE00, 0x3FFF00, 0x7FBF80, 0xF807C0, 0x1F003C0, 0x1F003C0, 0x1E001E0, 0x3E001E0, 0x3FFFFE0, 0x3FFFFE0, 0x3FFFFE0, 0x3FFFFC0, 0x3E00000, 0x3E00000, 0x1E00000, 0x1F00000, 0xF80000, 0xFE0380, 0x7FFFC0, 0x3FFF80, 0xFFE00, 0xE000, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x66) Model = int[](0x7F80, 0x1FFE0, 0x3FFC0, 0x7F3C0, 0x7C000, 0xF8000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0x3FFFF80, 0x3FFFF80, 0x3FFFF80, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0x0);
else if(asciiChar == 0x67) Model = int[](0x1FFFC0, 0x7FFFC0, 0xFFFFC0, 0x1F87FC0, 0x1E03C00, 0x3E03C00, 0x3C01E00, 0x3C01E00, 0x3C01E00, 0x3E01E00, 0x1E03C00, 0x1F07C00, 0xFFF800, 0xFFF000, 0x1EFC000, 0x1C00000, 0x3C00000, 0x3C00000, 0x3F80000, 0x1FFFF00, 0xFFFFC0, 0x1FFFFC0, 0x3C007C0, 0x78003E0, 0x78003C0, 0x78003C0, 0x78007C0, 0x7E01F80, 0x3FFFF00, 0x1FFFC00, 0x3FE000, 0x0);
else if(asciiChar == 0x68) Model = int[](0x0, 0x1E00000, 0x1E00000, 0x1E00000, 0x1E00000, 0x1E00000, 0x1E00000, 0x1E00000, 0x1E00000, 0x1E00000, 0x1E1FC00, 0x1E3FF00, 0x1EFFF00, 0x1FFFF80, 0x1FC0F80, 0x1F807C0, 0x1F007C0, 0x1E003C0, 0x1E003C0, 0x1E003C0, 0x1E003C0, 0x1E003C0, 0x1E003C0, 0x1E003C0, 0x1E003C0, 0x1E003C0, 0x1E003C0, 0x1E003C0, 0x1E003C0, 0x1E003C0, 0x1E003C0, 0x1E00380);
else if(asciiChar == 0x69) Model = int[](0x0, 0x3C00, 0x7E00, 0x7E00, 0x7E00, 0x7E00, 0x3C00, 0x0, 0x0, 0x0, 0x0, 0x7FFC00, 0x7FFC00, 0x7FFC00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x1C00);
else if(asciiChar == 0x6A) Model = int[](0x3800, 0x7C00, 0x7C00, 0x7C00, 0x3800, 0x0, 0x0, 0x0, 0x1FF800, 0x1FFC00, 0x1FFC00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x3C00, 0x3800, 0x3800, 0x7800, 0x1FF000, 0x3FF000, 0xFC000);
else if(asciiChar == 0x6B) Model = int[](0x0, 0x1E00000, 0x1E00000, 0x1E00000, 0x1E00000, 0x1E00000, 0x1E00000, 0x1E00000, 0x1E00000, 0x1E00000, 0x1E007C0, 0x1E00F80, 0x1E01F00, 0x1E03E00, 0x1E07C00, 0x1E0F800, 0x1E1F000, 0x1E3E000, 0x1E7C000, 0x1EFE000, 0x1FFF000, 0x1FEF000, 0x1FC7800, 0x1F87C00, 0x1F03E00, 0x1E01E00, 0x1E01F00, 0x1E00F80, 0x1E00780, 0x1E003C0, 0x1E003E0, 0x0);
else if(asciiChar == 0x6C) Model = int[](0x3FFC000, 0x3FFC000, 0x3FFC000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x7C000, 0x3E000, 0x3FFC0, 0x1FFC0, 0xFFC0, 0x7F00, 0x0);
else if(asciiChar == 0x6D) Model = int[](0x0, 0x0, 0x0, 0x0, 0x0, 0x71F0F00, 0x73F1FC0, 0x7FFBFC0, 0x7FFFFE0, 0x7E3E3E0, 0x7C3C1E0, 0x783C1E0, 0x783C1E0, 0x783C1E0, 0x783C1E0, 0x783C1E0, 0x783C1E0, 0x783C1E0, 0x783C1E0, 0x783C1E0, 0x783C1E0, 0x783C1E0, 0x783C1E0, 0x783C1E0, 0x783C1E0, 0x783C1E0, 0x78181C0, 0x0, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x6E) Model = int[](0x0, 0x0, 0x0, 0x0, 0x0, 0x1C0FC00, 0x1E3FF00, 0x1EFFF00, 0x1FFFF80, 0x1FC0F80, 0x1F807C0, 0x1F007C0, 0x1E007C0, 0x1E003C0, 0x1E003C0, 0x1E003C0, 0x1E003C0, 0x1E003C0, 0x1E003C0, 0x1E003C0, 0x1E003C0, 0x1E003C0, 0x1E003C0, 0x1E003C0, 0x1E003C0, 0x1E003C0, 0x1E00380, 0x0, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x6F) Model = int[](0x0, 0x0, 0x0, 0x0, 0x0, 0x7F000, 0x1FFC00, 0x3FFF00, 0x7FFF00, 0xF80F80, 0x1F007C0, 0x1E007C0, 0x3E003E0, 0x3E003E0, 0x3E003E0, 0x3C001E0, 0x3C001E0, 0x3C003E0, 0x3E003E0, 0x3E003E0, 0x1E003C0, 0x1F007C0, 0xF80F80, 0x7F7F80, 0x7FFF00, 0x1FFC00, 0x7F000, 0x0, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x70) Model = int[](0x0, 0x383F000, 0x3CFFC00, 0x3DFFE00, 0x3FFFF00, 0x3F81F00, 0x3E00F80, 0x3C00F80, 0x3C00780, 0x3C00780, 0x3C007C0, 0x3C007C0, 0x3C007C0, 0x3C007C0, 0x3C00780, 0x3C00780, 0x3C00F80, 0x3E01F00, 0x3F03F00, 0x3FFFE00, 0x3FFFC00, 0x3DFF800, 0x3C7E000, 0x3C00000, 0x3C00000, 0x3C00000, 0x3C00000, 0x3C00000, 0x3C00000, 0x3C00000, 0x3C00000, 0x0);
else if(asciiChar == 0x71) Model = int[](0x0, 0xFC180, 0x1FF3C0, 0x7FFFC0, 0xFFFFC0, 0xF80FC0, 0x1F007C0, 0x1F007C0, 0x3E007C0, 0x3E007C0, 0x3E007C0, 0x3C007C0, 0x3C007C0, 0x3C007C0, 0x3E007C0, 0x3E007C0, 0x1E007C0, 0x1F00FC0, 0x1F81FC0, 0xFFFFC0, 0x7FFFC0, 0x3FF7C0, 0xFC7C0, 0x7C0, 0x7C0, 0x7C0, 0x7C0, 0x7C0, 0x7C0, 0x7C0, 0x7C0, 0x0);
else if(asciiChar == 0x72) Model = int[](0x0, 0x0, 0x0, 0x0, 0x0, 0x1C07F00, 0x1E1FF80, 0x1E3FF80, 0x1E7FF00, 0x1EF8100, 0x1FE0000, 0x1FC0000, 0x1F80000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1F00000, 0x1E00000, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x73) Model = int[](0x0, 0x0, 0x0, 0x0, 0x0, 0xFF000, 0x3FFE00, 0x7FFF00, 0xFC3F00, 0xF00700, 0x1F00000, 0x1F00000, 0x1F00000, 0xFE0000, 0x7FE000, 0x3FFC00, 0xFFF00, 0xFF80, 0x1FC0, 0x7C0, 0x3C0, 0x8003C0, 0x1E007C0, 0x3FC1F80, 0x1FFFF00, 0x7FFE00, 0xFF800, 0x0, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x74) Model = int[](0x0, 0x0, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0x3FFFFC0, 0x3FFFFC0, 0x3FFFFC0, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF0000, 0xF8000, 0xF8000, 0x7E0C0, 0x7FFC0, 0x3FFE0, 0xFF80, 0x0, 0x0);
else if(asciiChar == 0x75) Model = int[](0x0, 0x0, 0x0, 0x0, 0x0, 0x1E007C0, 0x1E007C0, 0x1E007C0, 0x1E007C0, 0x1E007C0, 0x1E007C0, 0x1E007C0, 0x1E007C0, 0x1E007C0, 0x1E007C0, 0x1E007C0, 0x1E007C0, 0x1E007C0, 0x1E007C0, 0x1E007C0, 0x1F00FC0, 0x1F01FC0, 0xF83FC0, 0xFFFBC0, 0x7FF3C0, 0x3FC3C0, 0x60000, 0x0, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x76) Model = int[](0x0, 0x0, 0x0, 0x0, 0x0, 0x7C001E0, 0x3C003C0, 0x3C003C0, 0x3E00780, 0x1E00780, 0x1E00780, 0xF00F00, 0xF00F00, 0xF81E00, 0x781E00, 0x781E00, 0x3C3C00, 0x3C3C00, 0x3E3800, 0x1E7800, 0x1E7800, 0xF7000, 0xFF000, 0x7E000, 0x7E000, 0x7E000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x77) Model = int[](0x0, 0x0, 0x0, 0x0, 0x0, 0x1E0000F0, 0x1E0000F0, 0xF03C0F0, 0xF07C0F0, 0xF07C1E0, 0xF07C1E0, 0xF07E1E0, 0x78EE1E0, 0x78EE1E0, 0x78EE3C0, 0x78EF3C0, 0x78E73C0, 0x3DC73C0, 0x3DC73C0, 0x3DC7B80, 0x3DC7F80, 0x3FC3F80, 0x1F83F80, 0x1F83F80, 0x1F83F00, 0x1F81F00, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x78) Model = int[](0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x700E00, 0x381E00, 0x3C3C00, 0x1C3800, 0xE7800, 0xF7000, 0x7E000, 0x3C000, 0x7C000, 0x7E000, 0xEF000, 0x1E7800, 0x3C3800, 0x381C00, 0x781E00, 0xF00F00, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x79) Model = int[](0x0, 0x0, 0x0, 0x0, 0x1E00700, 0xE00E00, 0xE00E00, 0x700E00, 0x701C00, 0x781C00, 0x383800, 0x3C3800, 0x1C3800, 0x1C7000, 0xE7000, 0xE6000, 0x7E000, 0x7E000, 0x3C000, 0x3C000, 0x38000, 0x38000, 0x78000, 0xF0000, 0xFE0000, 0xFC0000, 0xF80000, 0x0, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x7A) Model = int[](0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7FFF00, 0x7FFF00, 0x3FFE00, 0x3C00, 0x7800, 0xF000, 0x1E000, 0x3C000, 0x78000, 0xF8000, 0x1F0000, 0x3E0000, 0x3C0000, 0x7FFF00, 0xFFFF00, 0xFFFF00, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0);
else if(asciiChar == 0x7B) Model = int[](0x0, 0xFE00, 0x1FE00, 0x3C000, 0x38000, 0x38000, 0x38000, 0x38000, 0x38000, 0x38000, 0x38000, 0x38000, 0x38000, 0x38000, 0x78000, 0x7F0000, 0x7E0000, 0x7F0000, 0x78000, 0x38000, 0x38000, 0x38000, 0x38000, 0x38000, 0x38000, 0x38000, 0x38000, 0x38000, 0x38000, 0x3C000, 0x1FE00, 0x7E00);
else if(asciiChar == 0x7C) Model = int[](0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000);
else if(asciiChar == 0x7D) Model = int[](0x0, 0x7E0000, 0x7F8000, 0x3C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1E000, 0xFE00, 0x7E00, 0xFE00, 0x1E000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x3C000, 0x7F8000, 0x7E0000);
else if(asciiChar == 0x7E) Model = int[](0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3C0180, 0x7F01C0, 0xFF83C0, 0x1E7E780, 0x1C1FF80, 0x380FF00, 0x1803C00, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0);

为方便 后续使用,增加一些常量定义

// 各字符的ASCII值
#define CHAR_NOT 				0x21			// !
#define CHAR_QUOTE2 			0x22			// "
#define CHAR_SHARP 				0x23			// #
#define CHAR_DOLLAR 			0x24			// $
#define CHAR_PERCENT 			0x25			// %
#define CHAR_AND 				0x26			// &
#define CHAR_QUOTE1 			0x27			// '
#define CHAR_PARENTHESES_LEFT 	0x28			// (
#define CHAR_PARENTHESES_RIGHT 	0x29			// )
#define CHAR_STAR 				0x2A			// *
#define CHAR_PLUS 				0x2B			// +
#define CHAR_COMMA 				0x2C			// ,
#define CHAR_MINUS 				0x2D			// -
#define CHAR_DOT 				0x2E			// .
#define CHAR_SLASH 				0x2F			// /
#define CHAR_0 					0x30			// 0
#define CHAR_1 					0x31			// 1
#define CHAR_2 					0x32			// 2
#define CHAR_3 					0x33			// 3
#define CHAR_4 					0x34			// 4
#define CHAR_5 					0x35			// 5
#define CHAR_6 					0x36			// 6
#define CHAR_7 					0x37			// 7
#define CHAR_8 					0x38			// 8
#define CHAR_9 					0x39			// 9
#define CHAR_COLON 				0x3A			// :
#define CHAR_SEMICOLON 			0x3B			// ;
#define CHAR_LT 				0x3C			// <
#define CHAR_EQ 				0x3D			// =
#define CHAR_GT 				0x3E			// >
#define CHAR_QUESTION 			0x3F			// ?
#define CHAR_AT 				0x40			// @
#define CHAR_A 					0x41			// A
#define CHAR_B 					0x42			// B
#define CHAR_C 					0x43			// C
#define CHAR_D 					0x44			// D
#define CHAR_E 					0x45			// E
#define CHAR_F 					0x46			// F
#define CHAR_G 					0x47			// G
#define CHAR_H 					0x48			// H
#define CHAR_I 					0x49			// I
#define CHAR_J 					0x4A			// J
#define CHAR_K 					0x4B			// K
#define CHAR_L 					0x4C			// L
#define CHAR_M 					0x4D			// M
#define CHAR_N 					0x4E			// N
#define CHAR_O 					0x4F			// O
#define CHAR_P 					0x50			// P
#define CHAR_Q 					0x51			// Q
#define CHAR_R 					0x52			// R
#define CHAR_S 					0x53			// S
#define CHAR_T 					0x54			// T
#define CHAR_U 					0x55			// U
#define CHAR_V 					0x56			// V
#define CHAR_W 					0x57			// W
#define CHAR_X 					0x58			// X
#define CHAR_Y 					0x59			// Y
#define CHAR_Z 					0x5A			// Z
#define CHAR_BRACKET_LEFT 		0x5B			// [
#define CHAR_SLASH_BACK			0x5C			// \反斜杠
#define CHAR_BRACKET_RIGHT 		0x5D			// ]
#define CHAR_XOR 				0x5E			// ^
#define CHAR_UNDERLINE 			0x5F			// _
#define CHAR_QUOTE_JS 			0x60			// `
#define CHAR_a 					0x61 			// a
#define CHAR_b 					0x62  			// b
#define CHAR_c 					0x63  			// c
#define CHAR_d 					0x64  			// d
#define CHAR_e 					0x65  			// e
#define CHAR_f 					0x66  			// f
#define CHAR_g 					0x67  			// g
#define CHAR_h 					0x68  			// h
#define CHAR_i 					0x69  			// i
#define CHAR_j 					0x6A  			// j
#define CHAR_k 					0x6B  			// k
#define CHAR_l 					0x6C  			// l
#define CHAR_m 					0x6D  			// m
#define CHAR_n 					0x6E  			// n
#define CHAR_o 					0x6F  			// o
#define CHAR_p 					0x70  			// p
#define CHAR_q 					0x71  			// q
#define CHAR_r 					0x72 			// r
#define CHAR_s 					0x73  			// s
#define CHAR_t 					0x74  			// t
#define CHAR_u 					0x75  			// u
#define CHAR_v 					0x76  			// v
#define CHAR_w 					0x77  			// w
#define CHAR_x 					0x78  			// x
#define CHAR_y 					0x79  			// y
#define CHAR_z 					0x7A  			// z
#define CHAR_BRACE_LEFT 		0x7B  			// {
#define CHAR_OR 				0x7C  			// |
#define CHAR_BRACE_RIGHT 		0x7D  			// }
#define CHAR_WAVE 				0x7E  			// ~

现在,就可以画出字符

// 【文本信息】在指定位置(leftTopPoint)输出字符asciiChar,字体大小fontSizeRatio * 32,颜色fontColor
vec4 textLog_Char(vec2 uv, vec2 leftTopPoint, int asciiChar, int fontSizeRatio, vec4 fontColor, out bool inFlag) {float characterWidth = float(fontSizeRatio) * 32.0;inFlag = isInRange(uv.x, leftTopPoint.x, leftTopPoint.x + characterWidth / pageSize.x) &&isInRange(uv.y, leftTopPoint.y, leftTopPoint.y + characterWidth / pageSize.y);if(inFlag) {int Model[32];if(...) // 字模代码else {inFlag = false;return vec4(0);}vec2 offset = uv - leftTopPoint;int col = int(offset.x * pageSize.x / float(fontSizeRatio) + 0.5);int row = int(offset.y * pageSize.y / float(fontSizeRatio) + 0.5);if(col > 31) col = 31;if(row > 31) row = 31;col = 31 - col;int value = Model[row];if(col > 0)value >>= col;if((value & 1) > 0) return fontColor;elseinFlag = false;}return vec4(0, 0, 0, 1);
}

比如,要输出翻页拆线与哪几边相交,就可以用L、T、R、B等字符指示

if(isInRange(solutionTop.x, pageLeft, pageRight)) {solutionPoints[pointIndex++] = solutionTop;loggedColor = textLog_Char(uv, vec2(0.55, 0.1 * float(pointIndex)), CHAR_T, 1, logFontColor, inFlag);if(inFlag) color = loggedColor;upDownNumber++;								
}
if(isInRange(solutionBottom.x, pageLeft, pageRight)) {solutionPoints[pointIndex++] = solutionBottom;loggedColor = textLog_Char(uv, vec2(0.55, 0.1 * float(pointIndex)), CHAR_B, 1, logFontColor, inFlag);if(inFlag) color = loggedColor;upDownNumber++;
}
if(isInRange(solutionLeft.y, pageTop, pageBottom)) {solutionPoints[pointIndex++] = solutionLeft;loggedColor = textLog_Char(uv, vec2(0.55, 0.1 * float(pointIndex)), CHAR_L, 1, logFontColor, inFlag);if(inFlag) color = loggedColor;
}
if(isInRange(solutionRight.y, pageTop, pageBottom)) {solutionPoints[pointIndex++] = solutionRight;loggedColor = textLog_Char(uv, vec2(0.55, 0.1 * float(pointIndex)), CHAR_R, 1, logFontColor, inFlag);if(inFlag) color = loggedColor;
}

则在翻页过程中,实时指示出计算结果,以查看运算过程与结果是否有误。 

 相应扩展一下,可以直接输出整数、浮点数、向量、矩阵等信息,不再赘述。

 

 

相关文章:

Godot 4 着色器 - Shader调试

我之前用OpenCV进行图像相关处理&#xff0c;觉得已经很不错&#xff0c;结合GDI可以实现流畅的动画效果 直到近来用Shader后才发现&#xff0c;着色器更上一层楼&#xff0c;原来这是入了GPU的坑 Shader编程限制很多&#xff0c;各种不支持&#xff0c;看在它性能不错功能炫…...

liunx时间慢几分钟,定时更新系统时间

#&#xff01;/bin/sh hwclock --hctosys echo "执行成功" 定时5分钟执行一次...

C# 委托详解

一.委托的概念 C#中委托也叫代理&#xff0c;委托提供了后期绑定机制(官方解释)&#xff0c;功能类似于C中的函数指针&#xff0c;它存储的就是一系列具有相同签名和返回类型的方法的地址&#xff0c;调用委托的时候&#xff0c;它所包含的所有方法都会被执行。 二.委托的用法…...

chatGPT 学习分享:内含PPT分享下载

InstructGPT论文地址&#xff1a; Training language models to follow instructions with human feedbackchatGPT地址&#xff1a;openAI个人整理的PPT&#xff08;可编辑&#xff09;&#xff0c;下载地址&#xff1a;chatGPT学习分享PPT...

使用CRM进行数据分析的四大好处

使用CRM数据分析系统够帮助企业更好地了解客户需求和行为习惯&#xff0c;提供个性化的服务&#xff0c;从而提高客户满意度和忠诚度。使用CRM数据分析系统可以为企业带来一些好处&#xff0c;包括提高客户洞察力、加强营销策略、提高运营效率等。 1.提高客户洞察力&#xff1a…...

Excel“牛人”变现方案参考

有几种方式可以通过Excel技能实现变现&#xff1a; 1. 提供Excel咨询和培训服务&#xff1a;如果你对Excel非常熟悉&#xff0c;你可以提供咨询和培训服务&#xff0c;帮助他人解决Excel使用中的问题或提高他们的Excel技能。 2. 制作和销售Excel模板&#xff1a;你可以根据市…...

vscode和jetbrains IDEA添加免费的gpt代码生成插件

vscode和jetbrains IDEA添加免费的gpt代码生成插件 VSCODE添加代码智能生成插件 一、打开vscode添加扩展 打开vscode&#xff0c;点击扩展&#xff0c;搜索 aws toolkit ​​ 二、连接到AWS 如图&#xff0c;选择添加connectiong to aws 选择 Sign up or Sign in ​​ …...

【C#】医学实验室云LIS检验信息系统源码 采用B/S架构

基于B/S架构的医学实验室云LIS检验信息系统&#xff0c;整个系统的运行基于WEB层面&#xff0c;只需要在对应的工作台安装一个浏览器软件有外网即可访问&#xff0c;技术架构&#xff1a;Asp.NET CORE 3.1 MVC SQLserver Redis等。 一、系统概况 本系统是将各种生化、免疫、…...

linux:AWS LightSail 设置虚拟内存

参考&#xff1a; https://www.cnblogs.com/fallin/p/13186236.html 总结&#xff1a; #2G的swap文件 sudo dd if/dev/zero of/swapfile bs1M count2048 sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile sudo echo /swapfile none swap defaults 0 0 &g…...

“华为杯”研究生数学建模竞赛2016年-【华为杯】E题:粮食最低收购价问题研究

目录 摘 要: 第 1 章 前 言 1.1 研究的目的与意义 1.2 文献综述...

idea项目依赖全部找不到

目录 1&#xff0c;出错现象2&#xff0c;解决3&#xff0c;其他尝试 1&#xff0c;出错现象 很久没打开的Java项目&#xff0c;打开之后大部分依赖都找不到&#xff0c;出现了所有的含有import语句的文件都会报错和一些注解报红报错&#xff0c;但pom文件中改依赖是确实被引入…...

自动驾驶数据标注有哪些?

自动驾驶汽车&#xff1a;人工智能(AI)的焦点 人工智能驱动汽车解决方案的市场规模预计到 2025年将增长十倍以上&#xff0c;提升车内体验的商机领域以及 AI 模型的无偏见训练数据的重要性。在本篇中&#xff0c;我们将介绍车外体验的关键组成部分&#xff0c;以及自动驾驶数据…...

ChatGPT:人工智能语言模型的巅峰之作

一、 ChatGPT 的前世今生 ChatGPT 是 GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列模型的最新成员&#xff0c;其前身 GPT-3 在推出后引起了广泛关注。OpenAI 团队不断优化和训练&#xff0c;终于推出了 ChatGPT&#xff0c;这一最先进的语言模型&#…...

【unity之IMGUI实践】敌方逻辑封装实现【六】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…...

llvm向用户抛出warning、error信息

1、抛出error信息并终止程序 使用DiagnosticInfoUnsupported可以向用户抛出error信息并且终止程序&#xff0c;效果如同report_fatal_error、Error。后端用法如下&#xff1a; void xxxx::reportErrorMsg(const MachineFunction &MF)const {const Function &F MF.ge…...

微服务学习笔记-----Nacos安装教程(Windows和Linux版本)

Nacos安装教程 Nacos安装指南1.Windows安装1.1.下载安装包1.2.解压1.3.端口配置1.4.启动1.5.访问 2.Linux安装2.1.安装JDK2.2.上传安装包2.3.解压2.4.端口配置2.5.启动 3.Nacos的依赖 Nacos安装指南 1.Windows安装 开发阶段采用单机安装即可。 1.1.下载安装包 在Nacos的Git…...

程序员面试系列,docker常见面试题

原文链接 什么是Docker&#xff1f;它的主要作用是什么&#xff1f;Docker和虚拟机之间有什么区别&#xff1f;Docker的主要组件有哪些&#xff1f;Docker镜像和容器的区别是什么&#xff1f;如何构建Docker镜像&#xff1f;请简要描述构建过程。如何创建和启动一个Docker容器…...

Linux centos7.x系统将/home磁盘分配给/

1.解除挂载并删除/home卷 umount /home如果出现以下报错 &#xff1a; 可以使用以下命令查看哪些进程在占用 fuser -mv /home杀死这些进程就行 kill -9 进程号然后再执行umount /home就可以成功了 &#xff0c; 同时执行以下命令把逻辑卷删除了 lvremove /dev/centos/home…...

根据数组元素为对象,对元素对象的某一属性进行排序

前言&#xff1a; 开发过程中&#xff0c;前端难免需要对数据进行操作&#xff0c;比如比较常见的操作就是对数组元素进行排序 对数组元素对基本类型的进行排序 const arr [2,4,1,3,9,5]arr.sort((a,b)>a-b) //[1, 2, 3, 4, 5, 9] arr.sort((a,b)>b-a) //[9, 5, 4, 3,…...

mysql(三)用户权限管理

目录 前言 一、概述 二、用户权限类型 三、用户赋权 四、权限删除 五、删除用户 前言 为什么要设置用户权限&#xff1f; MySQL设置用户管理权限的主要目的是为了确保数据库的安全性和数据的机密性。以下是一些原因&#xff1a; 1. 安全性&#xff1a;MySQL是一个开源的关系型…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...