本帖最后由 小默米 于 2022-8-15 22:05 编辑
于此之前本人已在国外各个网站搜寻关于移除文字或font的阴影方法,但是都没有找到答案
因为原版带有阴影的文字在拼接的时候会产生半透明font深度叠加的问题,所以必须要移除阴影才能达到这种基岩版效果
阴影如图所示
最终需要得到如同下图所示的效果,无阴影font但是只能影响指定的font,不可影响到其他font,不然我早复制别人的shader了
7/28留
已自研偏方解决,最终方案:原文字位移覆盖法核心着色器代码如下,原理就是识别指定颜色文字进行位移使其与阴影重合从而覆盖阴影
if(Color.xyz==vec3(255., 253., 253.)/ 255.){
//重叠
vertexColor=Color*texelFetch(Sampler2, UV2 / 16, 0);
vertex.y+= 1;
vertex.x+= 1;
gl_Position=ProjMat*ModelViewMat*vertex;
}
请不要再拿这个帖子举例,其中的着色器代码仅可做思维启发,尚不成熟,不可应用于实际环境https://www.mcbbs.net/thread-1181123-1-1.html
“新操作之三:控制文本的渲染模式”。
于此之前本人已在国外各个网站搜寻关于移除文字或font的阴影方法,但是都没有找到答案
因为原版带有阴影的文字在拼接的时候会产生半透明font深度叠加的问题,所以必须要移除阴影才能达到这种基岩版效果
阴影如图所示
最终需要得到如同下图所示的效果,无阴影font但是只能影响指定的font,不可影响到其他font,不然我早复制别人的shader了
7/28留
已自研偏方解决,最终方案:原文字位移覆盖法核心着色器代码如下,原理就是识别指定颜色文字进行位移使其与阴影重合从而覆盖阴影
if(Color.xyz==vec3(255., 253., 253.)/ 255.){
//重叠
vertexColor=Color*texelFetch(Sampler2, UV2 / 16, 0);
vertex.y+= 1;
vertex.x+= 1;
gl_Position=ProjMat*ModelViewMat*vertex;
}
7/30留
但是这不是最佳方案,因为本质还是没有移除阴影。请回复的时候确保你对这个领域精通且自行测试过只能影响指定的文字,不可影响到其他文字过后再作答,谢谢。虽然目前已有偏方解决,但这个帖子的问题还没解决,此帖依然有效。或者提供足够的证明无法通过着色器移除指定文字的阴影也可。请不要再拿这个帖子举例,其中的着色器代码仅可做思维启发,尚不成熟,不可应用于实际环境https://www.mcbbs.net/thread-1181123-1-1.html
“新操作之三:控制文本的渲染模式”。
本帖最后由 Muggle2077 于 2022-7-24 19:59 编辑
【21w10a+】核心着色器浅析
https://www.mcbbs.net/thread-1181123-1-1.html
翻到 “新操作之三:控制文本的渲染模式”。
【21w10a+】核心着色器浅析
https://www.mcbbs.net/thread-1181123-1-1.html
翻到 “新操作之三:控制文本的渲染模式”。
Muggle2077 发表于 2022-7-24 19:54
【21w10a+】核心着色器浅析
https://www.mcbbs.net/thread-1181123-1-1.html
翻到 “新操作之三:控制文本 ...
抱歉,我现在没有足够的时间去学习shader,希望能提供模板并解释其中需要修改的部位,要求只影响指定命名空间下font下文字的阴影
小默米 发表于 2022-7-24 20:29
抱歉,我现在没有足够的时间去学习shader,希望能提供模板并解释其中需要修改的部位,要求只影响指定命名 ...
- #version 150
- #moj_import <fog.glsl>
- uniform sampler2D Sampler0;
- uniform vec4 ColorModulator;
- uniform float FogStart;
- uniform float FogEnd;
- uniform vec4 FogColor;
- in float vertexDistance;
- in vec4 vertexColor;
- in vec2 texCoord0;
- out vec4 fragColor;
- void main() {
- vec4 color = texture(Sampler0, texCoord0) * vertexColor * ColorModulator;
- if (color.a == 0.0 || (color.r + color.g + color.b < 0.75 && color.r + color.g + color.b > 0.5)) {
- discard;
- }
- fragColor = linear_fog(color, vertexDistance, FogStart, FogEnd, FogColor);
- }
来自于帖子的代码
你好,我把版主那个核心着色器教学帖的代码直接整合在资源包中了,你可以下载直接使用它
本帖最后由 木草习灵 于 2022-9-22 16:05 编辑
着色器是可以做到的,包括原生的字体和自定义的字体。
着色器是可以做到的,包括原生的字体和自定义的字体。
本帖最后由 ChapterII 于 2022-10-12 20:54 编辑
已审题。
可行方法:传统艺能,检测字体贴图中某特定像素的颜色,若为某特殊值则表明为该字体。
该例子中向图片左上角添加了颜色为 (255, 0, 0, 255) 的像素用以识别。
在 rendertype_text 片段着色器后加入如下代码:
复制代码
(此处为原来的字体图片右下边缘添加了白色边框,以衬托出阴影;图中将阴影改为了自定义颜色,将其设为 vec4(0.0f)即可以去除阴影)
测试时直接在 ⊙v⊙ 的字体艺术资源包基础上实验,贴图等均来自 ⊙v⊙
当 texCoord 为左上角时显示原像素颜色即可。
复制代码
以上即为核心内容。
时间所限仅测试了 256 * 256 的 bitmap 类型。
如要对某种特定的字体去掉阴影,需要注意:
每次渲染时,同种字体中被渲染的字符的 bitmap 会生成一张 256 * 256 的 texture atlas 统一传入着色器。
无法确保生成 atlas 时某个贴图一定位于左上角。因此请确保每张 bitmap 尺寸(原图尺寸)均为 256 * 256,并分别添加标记点。
如果想对大量的同尺寸 bitmap 或某种文字的字体去除阴影,建议将其拼成一张 256 * 256 的贴图,只需要对每张大贴图标记一次即可。
如果是 ttf 字体的话,请利用过去版本将字体转化为贴图的工具生成 bitmap。
另:核心着色器浅析中绝大多数技术都依然有着实用价值。即使某些触发方法和一些实现细节随时代而异,大体的思路仍然没有怎么改变过。简单来说勿骂 qlk。()
已审题。
简要思路:由于对于 rendertype_text,不同 font 间的差别仅在于采样器、顶点与可以由服务端指定的 vertexColor。
vertexColor 在渲染阴影中被强制指定,因此只能寄希望于顶点或采样器以在着色器中识别自定义字体。
由于难以在某个着色器程序中获知全部顶点信息(顶点着色器只能获取当前顶点信息;片段着色器只能获取所有顶点经过插值后的片段信息),通过顶点判断可行性也较低。
可行方法:传统艺能,检测字体贴图中某特定像素的颜色,若为某特殊值则表明为该字体。
该例子中向图片左上角添加了颜色为 (255, 0, 0, 255) 的像素用以识别。
在 rendertype_text 片段着色器后加入如下代码:
- if ( texture(Sampler0, vec2(0.0f)) == vec4(1.0f, 0.0f, 0.0f, 1.0f)
- && (vertexColor.r + vertexColor.g + vertexColor.b) >= 0.5f
- && (vertexColor.r + vertexColor.g + vertexColor.b) <= 0.75f)
- fragColor = vec4(texCoord0.x, texCoord0.y, 0.0f, 1.0f);
(此处为原来的字体图片右下边缘添加了白色边框,以衬托出阴影;图中将阴影改为了自定义颜色,将其设为 vec4(0.0f)即可以去除阴影)
测试时直接在 ⊙v⊙ 的字体艺术资源包基础上实验,贴图等均来自 ⊙v⊙
当 texCoord 为左上角时显示原像素颜色即可。
- if (texCoord0 == vec2(0.0f))
- fragColor = vec4(32.0f, 30.0f, 33.0f, 1.0f) / 255.0f * vertexColor * ColorModulator;
以上即为核心内容。
时间所限仅测试了 256 * 256 的 bitmap 类型。
如要对某种特定的字体去掉阴影,需要注意:
每次渲染时,同种字体中被渲染的字符的 bitmap 会生成一张 256 * 256 的 texture atlas 统一传入着色器。
无法确保生成 atlas 时某个贴图一定位于左上角。因此请确保每张 bitmap 尺寸(原图尺寸)均为 256 * 256,并分别添加标记点。
如果想对大量的同尺寸 bitmap 或某种文字的字体去除阴影,建议将其拼成一张 256 * 256 的贴图,只需要对每张大贴图标记一次即可。
如果是 ttf 字体的话,请利用过去版本将字体转化为贴图的工具生成 bitmap。
另:核心着色器浅析中绝大多数技术都依然有着实用价值。即使某些触发方法和一些实现细节随时代而异,大体的思路仍然没有怎么改变过。简单来说勿骂 qlk。()
检测特定位置确实是可行方案,或许可以再改良到某alpha值,值得深入研究