本帖最后由 晴路卡 于 2021-7-10 23:51 编辑
前言
21w10a关于着色器技术性修改的说明是这么写的。挺振奋人心的,当天下载后在shader目录下的core文件夹里发现了一堆眼花缭乱的新着色器程序。但是经过一段时间的窥屏,交流和实际操作之后,还是感觉到原版着色器因为各种原因被限制地死死的。取代Optifine的说法个人感觉在现在的条件下更是天方夜谭。不过随着时间的推移社区内也确实有了一些着手在实现一些原来属于光影的功能的项目。
不管怎么说,这会儿原版着色器能简单操作的东西确实多了很多(带来的BUG也不少,不过很多都在21w11a修复了)。在技巧版蹲点了两三天也没见着相关的讨论,我就根据这几天做的和看到的内容来讲讲一些在新的原版着色器修改下能实现的原来做不到的一些简单功能(一些翻文档就能知道同时又缺乏惊喜的就免了),看看能不能抛砖引玉吧。欢迎补充和纠错!
ps:以下着色器程序均在21w10a中测试,涉及到纹理坐标内容的代码大概率不能在最新快照中应用。
学习资料
开始之前还是希望读者能对原版着色器有个大致的了解,不管是新的还是旧的。
供参考的一些已有的包的链接(如果有的话)会放在最后。
这边直接偷一些MCC Discord里的人整理的一些资料:
开局放张美图,咱们开始吧(虽然水反是1.16就有的东西)。
前言
21w10a关于着色器技术性修改的说明是这么写的。挺振奋人心的,当天下载后在shader目录下的core文件夹里发现了一堆眼花缭乱的新着色器程序。但是经过一段时间的窥屏,交流和实际操作之后,还是感觉到原版着色器因为各种原因被限制地死死的。取代Optifine的说法个人感觉在现在的条件下更是天方夜谭。不过随着时间的推移社区内也确实有了一些着手在实现一些原来属于光影的功能的项目。
不管怎么说,这会儿原版着色器能简单操作的东西确实多了很多(带来的BUG也不少,不过很多都在21w11a修复了)。在技巧版蹲点了两三天也没见着相关的讨论,我就根据这几天做的和看到的内容来讲讲一些在新的原版着色器修改下能实现的原来做不到的一些简单功能(一些翻文档就能知道同时又缺乏惊喜的就免了),看看能不能抛砖引玉吧。欢迎补充和纠错!
ps:以下着色器程序均在21w10a中测试,涉及到纹理坐标内容的代码大概率不能在最新快照中应用。
学习资料
开始之前还是希望读者能对原版着色器有个大致的了解,不管是新的还是旧的。
供参考的一些已有的包的链接(如果有的话)会放在最后。
这边直接偷一些MCC Discord里的人整理的一些资料:
开局放张美图,咱们开始吧(虽然水反是1.16就有的东西)。

改变顶点渲染位置
还记得原版着色器中对于顶点着色器的描述吗?与之前不一样,core文件夹下的顶点着色器是能对几何体的顶点进行操作的。在头一天我看到了各种被扭得歪七八糟的世界:

下面简单通过assets\minecraft\shaders\core\rendertype_solid.vsh这一顶点着色器来演示一下如何改变顶点的位置。先看一下原版资源包的着色器里是怎么确定顶点的位置的:
ProjMat和ModelViewMat这两个矩阵是算数用的,可以选择性无视。vec4(Position + ChunkOffset, 1.0)这部分敲定了顶点的渲染位置,所以咱们先把这部分挑出来方便操作。
pos.x,pos.y,pos.z分别控制顶点渲染的对应的坐标位置。剩下的就挺简单了,相信几张图就能说明白:



这里是一个rendertype_solid顶点着色器的实例及其效果:

通过纹理坐标检测在渲染什么
先看看原版资源包里rendertype_solid的片段着色器是如何给方块上色的:
如果你迫切地想知道vertexColor是个什么参数的话,你可以直接跳到操作四,但在这里我们先不管这个。而linear_fog这个函数看名字便知道它做的是和迷雾渲染有关的工作(你可以在很多core下的片段着色器里看到这玩意),这会儿也给无视掉。
我们是如何拿到我们要的贴图呢?看代码,着色器是根据texCoord0这个二维坐标从Sampler0这一缓冲(图?)里拿出来的。所以Sampler0到底是个什么东西呢?实际上这是根据资源包内的贴图生成(这意味着texture atlas会随着资源包内贴图数量、尺寸、文件名的变化而变化,我们暂且对资源包内的贴图不做任何修改)的一张texture atlas,你可以通过修改顶点着色器看到这图大概长啥样。

顺便附上看到能让玩家看到这个图的rendertype_solid的顶点着色器: 包含原版方块和物品贴图的texture atlas是一张1024x1024的图,对之后的检测还蛮重要的,在这里给出。
21w14a的原版texture atlas:
进一步说,我们是通过texCoord0这个坐标去texture atlas上找到对应的贴图的。所以,在texture atlas确定的情况下,我们可以根据texCoord0的值来确定我们在渲染什么。
下面是一个rendertype_solid片段着色器的实例,他的作用是将TNT渲染成黑色:

可以看到我们简单地通过两个if语句选定了TNT的贴图在texture atlas的范围并进行了相应的处理。另外,texCoord0这一参数在片段着色器中被使用,本身是相应的顶点着色器的一项输出,在顶点着色器中默认与UV0(顶点着色器的一个输入参数)等值,所以我们在顶点着色器内也能通过相同的方法检测正在渲染的部分,只要将texCoord0替换成UV0,你可以在最后的树叶/水摇晃的实例里看到这项应用。
控制文本的渲染模式
得益于rendertype_text和rendertype_text_see_through俩着色器的加入,我们可以直接对文本的渲染模式进行编辑(虽然加的各种着色器都让玩家有办法去操控之前没法控制的渲染,但所这对于文本渲染模式的控制我认为是最特殊的,因为这效果即便在主界面也看得到,所以专门挑出来谈)。其中rendertype_text操控的是所有位置的字符的渲染(包括木牌、GUI、实体名称、聊天框等等),而rendertype_text_see_through操控的是实体名称的半透明背景的渲染。

对于rendertype_text,我们可以修改它的顶点着色器让字符歪起来。

也可以修改它的片段着色器,实现滤去title的文本阴影这样的效果。

对于rendertype_text_see_through,我们可以修改它的片段着色器让这部分直接不可见。

当然这里只是提一些小应用,实际上能在文本渲染上做的文章肯定会更多,甚至能影响到字体艺术。
控制光照效果
重新看回到rendertype_solid的片段着色器。 如果你好奇这里面的vertexColor到底是干嘛用的,咱们不妨把它拿掉。 进游戏,看到了这样的效果。

于是我们发现,vertexColor决定了渲染对象上的光照(或者说阴影)效果(至少对于方块和实体来说是如此,当然排除一些比较特殊的,比如在草方块上vertexColor同样决定了它的颜色)。不仅仅只有亮度的区别,还有从蓝(如在夜晚的地表)到黄(如在昏暗的室内)的色调变化。回到顶点着色器我们可以看到vertexColor是根据Sampler2和UV2输出的。
而在rendertype_text里vertexColor有些不同,它同时决定了文本渲染的颜色。 你可以在该顶点着色器里把这个颜色与光照的关联给去了,这样就能删去光照对实体名称的影响,不用怕在暗点的地方看不清名字了。

除了去除,你当然能对这些vertexColor进行一定修改来达到想要的视觉效果,这里就不细说了。
调用GameTime制作动画
GameTime是一个单精度全局量,随着时间的推移而增长,每一GameTime约为1,200秒。可以在core着色器里调用这个全局量来制作一些动画(过去只有Time这个每秒循环出值的参数可以用,显然GameTime方便多了)。不过首先和其他全局量一样你得先把他写进着色器程序json的uniforms列表里。这里拿rendertype_text开刀:
同时通过改了下rendertype_text的顶点着色器,搞出了这样的效果:

前言
Shaders are now included for all supported render states. Any shader except for the blit shader can also be replaced in resource packs. For now replacing these shaders is not officially supported and the way it works may change in the future.
The current rendering engine uses a system similar to the post processing shader pipeline. There are some differences between both system that cater to the slightly different requirements.
21w10a关于着色器技术性修改的说明是这么写的。挺振奋人心的,当天下载后在shader目录下的core文件夹里发现了一堆眼花缭乱的新着色器程序。但是经过一段时间的窥屏,交流和实际操作之后,还是感觉到原版着色器因为各种原因被限制地死死的。取代Optifine的说法个人感觉在现在的条件下更是天方夜谭。不过随着时间的推移社区内也确实有了一些着手在实现一些原来属于光影的功能的项目。
不管怎么说,这会儿原版着色器能简单操作的东西确实多了很多(带来的BUG也不少,不过很多都在21w11a修复了)。在技巧版蹲点了两三天也没见着相关的讨论,我就根据这几天做的和看到的内容来讲讲一些在新的原版着色器修改下能实现的原来做不到的一些简单功能(一些翻文档就能知道同时又缺乏惊喜的就免了),看看能不能抛砖引玉吧。欢迎补充和纠错!
ps:以下着色器程序均在21w10a中测试,涉及到纹理坐标内容的代码大概率不能在最新快照中应用。
学习资料
开始之前还是希望读者能对原版着色器有个大致的了解,不管是新的还是旧的。
供参考的一些已有的包的链接(如果有的话)会放在最后。
这边直接偷一些MCC Discord里的人整理的一些资料:
- 原版着色器指导:https://docs.google.com/document/d/15TOAOVLgSNEoHGzpNlkez5cryH3hFF3awXL5Py81EMk/edit
或者也可以看@SPGoding 翻的:https://spgoding.com/translation/2021/03/12/guite-to-vanilla-shader.html - 解释每个core着色器程序是干嘛的:https://docs.google.com/document/d/18AhcnAI55liax72yh70njUomIzezOKshCurfdZPTKwM/edit
- 解释不同的渲染对象是在那个着色器程序里被处理的:https://gist.github.com/boq/4514320b590de1fbe84349d23b542b28
开局放张美图,咱们开始吧(虽然水反是1.16就有的东西)。
2021.12 数据,可能有更多内容
前言
Shaders are now included for all supported render states. Any shader except for the blit shader can also be replaced in resource packs. For now replacing these shaders is not officially supported and the way it works may change in the future.
The current rendering engine uses a system similar to the post processing shader pipeline. There are some differences between both system that cater to the slightly different requirements.
The current rendering engine uses a system similar to the post processing shader pipeline. There are some differences between both system that cater to the slightly different requirements.
21w10a关于着色器技术性修改的说明是这么写的。挺振奋人心的,当天下载后在shader目录下的core文件夹里发现了一堆眼花缭乱的新着色器程序。但是经过一段时间的窥屏,交流和实际操作之后,还是感觉到原版着色器因为各种原因被限制地死死的。取代Optifine的说法个人感觉在现在的条件下更是天方夜谭。不过随着时间的推移社区内也确实有了一些着手在实现一些原来属于光影的功能的项目。
不管怎么说,这会儿原版着色器能简单操作的东西确实多了很多(带来的BUG也不少,不过很多都在21w11a修复了)。在技巧版蹲点了两三天也没见着相关的讨论,我就根据这几天做的和看到的内容来讲讲一些在新的原版着色器修改下能实现的原来做不到的一些简单功能(一些翻文档就能知道同时又缺乏惊喜的就免了),看看能不能抛砖引玉吧。欢迎补充和纠错!
ps:以下着色器程序均在21w10a中测试,涉及到纹理坐标内容的代码大概率不能在最新快照中应用。
学习资料
开始之前还是希望读者能对原版着色器有个大致的了解,不管是新的还是旧的。
供参考的一些已有的包的链接(如果有的话)会放在最后。
这边直接偷一些MCC Discord里的人整理的一些资料:
- 原版着色器指导:https://docs.google.com/document/d/15TOAOVLgSNEoHGzpNlkez5cryH3hFF3awXL5Py81EMk/edit
或者也可以看@SPGoding 翻的:https://spgoding.com/translation/2021/03/12/guite-to-vanilla-shader.html - 解释每个core着色器程序是干嘛的:https://docs.google.com/document/d/18AhcnAI55liax72yh70njUomIzezOKshCurfdZPTKwM/edit
- 解释不同的渲染对象是在那个着色器程序里被处理的:https://gist.github.com/boq/4514320b590de1fbe84349d23b542b28
开局放张美图,咱们开始吧(虽然水反是1.16就有的东西)。
改变顶点渲染位置
顶点着色器会在每个顶点上运行,以对顶点进行变换。通常来讲这指的是世界几何体的每一个顶点 —— 但是在 Minecraft 中,它指的只是缓冲四个角上的顶点。这使得目前的顶点着色器十分受限。不对顶点缓冲器做任何修改是很常见的做法
还记得原版着色器中对于顶点着色器的描述吗?与之前不一样,core文件夹下的顶点着色器是能对几何体的顶点进行操作的。在头一天我看到了各种被扭得歪七八糟的世界:

下面简单通过assets\minecraft\shaders\core\rendertype_solid.vsh这一顶点着色器来演示一下如何改变顶点的位置。先看一下原版资源包的着色器里是怎么确定顶点的位置的:
代码:
- gl_Position = ProjMat * ModelViewMat * vec4(Position + ChunkOffset, 1.0);
ProjMat和ModelViewMat这两个矩阵是算数用的,可以选择性无视。vec4(Position + ChunkOffset, 1.0)这部分敲定了顶点的渲染位置,所以咱们先把这部分挑出来方便操作。
代码:
- vec3 pos = Position + ChunkOffset;
- gl_Position = ProjMat * ModelViewMat * vec4(pos,1.0);
pos.x,pos.y,pos.z分别控制顶点渲染的对应的坐标位置。剩下的就挺简单了,相信几张图就能说明白:
代码:
- pos.x = pos.x + 0.5;

代码:
- pos.y = pos.y + 0.5;

代码:
- pos.z = pos.z + 0.5;

这里是一个rendertype_solid顶点着色器的实例及其效果:

代码:
- #version 150
- in vec3 Position;
- in vec4 Color;
- in vec2 UV0;
- in ivec2 UV2;
- in vec3 Normal;
- uniform sampler2D Sampler2;
- uniform mat4 ModelViewMat;
- uniform mat4 ProjMat;
- uniform vec3 ChunkOffset;
- out float vertexDistance;
- out vec4 vertexColor;
- out vec2 texCoord0;
- out vec4 normal;
- void main() {
- vertexDistance = length((ModelViewMat * vec4(Position + ChunkOffset, 1.0)).xyz);
- vertexColor = Color * texelFetch(Sampler2, UV2 / 16, 0);
- texCoord0 = UV0;
- normal = ProjMat * ModelViewMat * vec4(Normal, 0.0);
- vec3 pos = Position + ChunkOffset;
- pos.y = pos.y + sin(pos.x + pos.z);
- gl_Position = ProjMat * ModelViewMat * vec4(pos,1.0);
- }
通过纹理坐标检测在渲染什么
先看看原版资源包里rendertype_solid的片段着色器是如何给方块上色的:
代码:
- #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;
- in vec4 normal;
- out vec4 fragColor;
- void main() {
- vec4 color = texture(Sampler0, texCoord0) * vertexColor * ColorModulator;
- fragColor = linear_fog(color, vertexDistance, FogStart, FogEnd, FogColor);
- }
如果你迫切地想知道vertexColor是个什么参数的话,你可以直接跳到操作四,但在这里我们先不管这个。而linear_fog这个函数看名字便知道它做的是和迷雾渲染有关的工作(你可以在很多core下的片段着色器里看到这玩意),这会儿也给无视掉。
我们是如何拿到我们要的贴图呢?看代码,着色器是根据texCoord0这个二维坐标从Sampler0这一缓冲(图?)里拿出来的。所以Sampler0到底是个什么东西呢?实际上这是根据资源包内的贴图生成(这意味着texture atlas会随着资源包内贴图数量、尺寸、文件名的变化而变化,我们暂且对资源包内的贴图不做任何修改)的一张texture atlas,你可以通过修改顶点着色器看到这图大概长啥样。

顺便附上看到能让玩家看到这个图的rendertype_solid的顶点着色器:
代码:
- #version 150
- in vec3 Position;
- in vec4 Color;
- in vec2 UV0;
- in ivec2 UV2;
- in vec3 Normal;
- uniform sampler2D Sampler2;
- uniform mat4 ModelViewMat;
- uniform mat4 ProjMat;
- uniform vec3 ChunkOffset;
- out float vertexDistance;
- out vec4 vertexColor;
- out vec2 texCoord0;
- out vec4 normal;
- void main() {
- vertexDistance = length((ModelViewMat * vec4(Position + ChunkOffset, 1.0)).xyz);
- vertexColor = Color * texelFetch(Sampler2, UV2 / 16, 0);
- normal = ProjMat * ModelViewMat * vec4(Normal, 0.0);
- vec3 pos = Position + ChunkOffset;
- texCoord0 = vec2(Position.x,Position.z);
- gl_Position = ProjMat * ModelViewMat * vec4(pos,1.0);
- }
21w14a的原版texture atlas:

进一步说,我们是通过texCoord0这个坐标去texture atlas上找到对应的贴图的。所以,在texture atlas确定的情况下,我们可以根据texCoord0的值来确定我们在渲染什么。
下面是一个rendertype_solid片段着色器的实例,他的作用是将TNT渲染成黑色:
代码:
- #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;
- in vec4 normal;
- out vec4 fragColor;
- void main() {
- vec4 color = texture(Sampler0, texCoord0) * vertexColor * ColorModulator;
- if(texCoord0.y >= 384.0 / 1024 && texCoord0.y <= 400.0 / 1024){
- if(texCoord0.x >= 288.0 / 1024 && texCoord0.x <= 336.0 / 1024) color = vec4(0.0,0.0,0.0,1.0);
- }
- fragColor = linear_fog(color, vertexDistance, FogStart, FogEnd, FogColor);
- }

可以看到我们简单地通过两个if语句选定了TNT的贴图在texture atlas的范围并进行了相应的处理。另外,texCoord0这一参数在片段着色器中被使用,本身是相应的顶点着色器的一项输出,在顶点着色器中默认与UV0(顶点着色器的一个输入参数)等值,所以我们在顶点着色器内也能通过相同的方法检测正在渲染的部分,只要将texCoord0替换成UV0,你可以在最后的树叶/水摇晃的实例里看到这项应用。
控制文本的渲染模式
得益于rendertype_text和rendertype_text_see_through俩着色器的加入,我们可以直接对文本的渲染模式进行编辑(虽然加的各种着色器都让玩家有办法去操控之前没法控制的渲染,但所这对于文本渲染模式的控制我认为是最特殊的,因为这效果即便在主界面也看得到,所以专门挑出来谈)。其中rendertype_text操控的是所有位置的字符的渲染(包括木牌、GUI、实体名称、聊天框等等),而rendertype_text_see_through操控的是实体名称的半透明背景的渲染。

对于rendertype_text,我们可以修改它的顶点着色器让字符歪起来。

代码:
- #version 150
- in vec3 Position;
- in vec4 Color;
- in vec2 UV0;
- in ivec2 UV2;
- uniform sampler2D Sampler2;
- uniform mat4 ModelViewMat;
- uniform mat4 ProjMat;
- out float vertexDistance;
- out vec4 vertexColor;
- out vec2 texCoord0;
- void main() {
- gl_Position = ProjMat * ModelViewMat * vec4(Position.x,Position.y + 6 * sin(Position.x) * 0.25,Position.z, 1.0);
- vertexDistance = length((ModelViewMat * vec4(Position, 1.0)).xyz);
- vertexColor = Color;
- texCoord0 = UV0;
- }

代码:
- #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);
- }

代码:
- #version 150
- uniform sampler2D Sampler0;
- uniform sampler2D Sampler2;
- uniform vec4 ColorModulator;
- in vec4 vertexColor;
- in vec2 texCoord0;
- in vec2 texCoord2;
- out vec4 fragColor;
- void main() {
- vec4 color = texture(Sampler0, texCoord0) * vertexColor;
- if (color.a < 0.1) {
- discard;
- }
- fragColor = vec4(0.0,0.0,0.0,0.0);
- }
控制光照效果
重新看回到rendertype_solid的片段着色器。
代码:
- void main() {
- vec4 color = texture(Sampler0, texCoord0) * vertexColor * ColorModulator;
- fragColor = linear_fog(color, vertexDistance, FogStart, FogEnd, FogColor);
- }
代码:
- void main() {
- vec4 color = texture(Sampler0, texCoord0) * ColorModulator;
- fragColor = linear_fog(color, vertexDistance, FogStart, FogEnd, FogColor);
- }

于是我们发现,vertexColor决定了渲染对象上的光照(或者说阴影)效果(至少对于方块和实体来说是如此,当然排除一些比较特殊的,比如在草方块上vertexColor同样决定了它的颜色)。不仅仅只有亮度的区别,还有从蓝(如在夜晚的地表)到黄(如在昏暗的室内)的色调变化。回到顶点着色器我们可以看到vertexColor是根据Sampler2和UV2输出的。
而在rendertype_text里vertexColor有些不同,它同时决定了文本渲染的颜色。
代码:
- vertexColor = Color * texelFetch(Sampler2, UV2 / 16, 0);
代码:
- vertexColor = Color;

除了去除,你当然能对这些vertexColor进行一定修改来达到想要的视觉效果,这里就不细说了。
调用GameTime制作动画
GameTime是一个单精度全局量,随着时间的推移而增长,每一GameTime约为1,200秒。可以在core着色器里调用这个全局量来制作一些动画(过去只有Time这个每秒循环出值的参数可以用,显然GameTime方便多了)。不过首先和其他全局量一样你得先把他写进着色器程序json的uniforms列表里。这里拿rendertype_text开刀:
代码:
- {
- "blend": {
- "func": "add",
- "srcrgb": "srcalpha",
- "dstrgb": "1-srcalpha"
- },
- "vertex": "rendertype_text",
- "fragment": "rendertype_text",
- "attributes": [
- "Position",
- "Color",
- "UV0",
- "UV2"
- ],
- "samplers": [
- { "name": "Sampler0" },
- { "name": "Sampler2" }
- ],
- "uniforms": [
- { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] },
- { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] },
- { "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] },
- { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] },
- { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] },
- { "name": "FogColor", "type": "float", "count": 4, "values": [ 0.0, 0.0, 0.0, 0.0 ] },
- { "name": "GameTime", "type": "float", "count": 1, "values": [ 0.0 ] }
- ]
- }
同时通过改了下rendertype_text的顶点着色器,搞出了这样的效果:

代码:
- #version 150
- in vec3 Position;
- in vec4 Color;
- in vec2 UV0;
- in ivec2 UV2;
- uniform sampler2D Sampler2;
- uniform float GameTime;
- uniform mat4 ModelViewMat;
- uniform mat4 ProjMat;
- out float vertexDistance;
- out vec4 vertexColor;
- out vec2 texCoord0;
- void main() {
- float animation = GameTime * 2000.0;
- gl_Position = ProjMat * ModelViewMat * vec4(Position.x,Position.y + sin(animation + 2 * Position.x) * 0.25,Position.z, 1.0);
- vertexDistance = length((ModelViewMat * vec4(Position, 1.0)).xyz);
- vertexColor = Color * texelFetch(Sampler2, UV2 / 16, 0);
- texCoord0 = UV0;
- }
- Filex给的样例资源包:https://gist.github.com/felixjones/d5bec1ab0c83ee134fa43a142692a09b
其中BlusteryDay.zip演示的是原版的树叶/水的摇晃,包含了操作一,二,五 - Vilder50搞的猴头模型:https://twitter.com/vilder50/status/1370441756987232269

主要还是运用了操作一和二,在模型里塞入更多的cube搞出更多的顶点然后在顶点着色器通过uv进行判定并把相应的顶点拉到想要的位置上去。 - zSync1整的自定义天空:
https://www.reddit.com/r/Minecraft/comments/m36l6d/21w10a_shaders_let_you_make_completely_custom/

运用操作一改变天空的顶点后进行着色。 - Onnowhere的法线贴图:https://twitter.com/Onnowhere_/status/1372915918964092940?s=20

- BalintCsala的原版pathTracing项目:https://github.com/BalintCsala/PathTracing1.17

- 待补充
- 我自己整的伪发光贴图:https://www.mcbbs.net/thread-1181030-1-1.html

运用了操作二和四。
配合指令看来可以做热变形效果了。震荡波也可以,爽的啊。
找时间学学着色器这东西吧。
SPECIAL EFFECTS EVERYWHERE
找时间学学着色器这东西吧。
SPECIAL EFFECTS EVERYWHERE
完成任务
完成任务
只是本着“看贴(虽然看不懂)回贴,
利人利己的中华民族优秀传统美德”,顺便赚点积分。
利人利己的中华民族优秀传统美德”,顺便赚点积分。
什么是着色器,,,?
汪汪汪汪汪汪汪汪汪汪汪汪
完成任务!!
虽然看不懂 但是作者有心了 赞!
虽然看不到 但是感觉很牛
非常不错的知识 赞
看了下 作者用心了 对我之后的理解十分有帮助 赞!
as 安达市阿萨德爱上的打啥
我能说我不知道什么是着色器嘛
啥玩意看不懂
MCBBS有你更精彩~
完成任务了
MCBBS有你更精彩~
神乎其技!6的飞起!
感谢版主的分享,个人感觉比较实用,对新手很友好!
虽然看不到 但是感觉很牛
神乎其技!6的飞起!
虽然看不懂是什么但是好深奥的样子.jpg
针不戳 这个分享针不戳 多整点
。。。。。。。。。。。
6666666666666666666
作者,能不能发下游戏软件,要不只能看看啊~
@所有看到这条帖子的人,谁能告诉我怎么赚积分
mmmmmmmmmmmmmmmmmmm
看了下 作者用心了 对我之后的理解十分有帮助 赞!
之前遇到过OpenGL错误1282,只能重肝光影,找不到问题
MCBBS有你更精彩
学会了,很实用
爱了爱了
兄啊那个 PathTracing 1.17 可以把我名单去了,我就是个社区代码贡献者,提了一点点性能优化方面的 pull request(
(然后我最近提的一个修复了几个 bug 的 pull request 几天了他还没看,草)
(然后我最近提的一个修复了几个 bug 的 pull request 几天了他还没看,草)
本帖最后由 GeForceLegend 于 2021-5-21 11:01 编辑
顺便说一句那个原版路径追踪的原理:先设定一个存储体素图的分辨率(可以手动在文件内改,默认是1024x705,窗口化的736P分辨率),然后获取顶点的位置,根据gl_VertexID位移之后,判断出这个方块所在的世界空间位置,然后按照一个像素一个方块的对应关系将顶点位置拉至体素图对应像素的角落(所以在老版本内关闭 极佳!图像设置后可以看到屏幕上是白色底色然后一堆红色像素),同时有一小块特殊空间存储 gbuffer 处理时独有的一些信息,例如 gbuffer 内的 ModelView 矩阵和 Projection 矩阵,以及 chunkOffset 等。所有的信息都会在 极佳!图像设置对应的后处理程序中读取,并进行路径追踪。
因为如上原因,这个 shader 要求玩家的游戏窗口分辨率至少有 1024x705 ,不然体素图会读取错误。不过更高的分辨率一般不会导致什么bug,因为每次读取体素图时的位置都被设置在了这个像素的正中间
方块材质的获取来自 assets/minecraft/textures/effect/atlas.png ,左上角是原版生成的 atlas 图,其余三个角则存储了其他的信息(例如发光强度、金属性、粗糙度等)。由于每个方块的信息都存储在一个像素里面,只能存储一组材质UV位置,每个方块都只能使用一张贴图。
上面的内容和 PTGI 的路径追踪实现方案几乎如出一辙,区别在于 PTGI 使用 shadowcolor 存储体素数据,而这个原版 shader 用屏幕 buffer 存储;PTGI使用 Optifine 的功能获取游戏生成的动态 atlas 贴图,而这个 shader 使用存储在 textures/effect 的自己生成的静态atlas贴图
另外从这个shader似乎能看出在 textures/effect 里面存储贴图之后,可以在后处理里面获取到。例如这个 shader 的该目录下存放了 atlas.png 和 steve.png ,然后 shaders/post/transparency.json 里面存在以下数据:
复制代码
没事的话可以来我的Fork看看,虽然说没啥好康的
顺便说一句那个原版路径追踪的原理:先设定一个存储体素图的分辨率(可以手动在文件内改,默认是1024x705,窗口化的736P分辨率),然后获取顶点的位置,根据gl_VertexID位移之后,判断出这个方块所在的世界空间位置,然后按照一个像素一个方块的对应关系将顶点位置拉至体素图对应像素的角落(所以在老版本内关闭 极佳!图像设置后可以看到屏幕上是白色底色然后一堆红色像素),同时有一小块特殊空间存储 gbuffer 处理时独有的一些信息,例如 gbuffer 内的 ModelView 矩阵和 Projection 矩阵,以及 chunkOffset 等。所有的信息都会在 极佳!图像设置对应的后处理程序中读取,并进行路径追踪。
因为如上原因,这个 shader 要求玩家的游戏窗口分辨率至少有 1024x705 ,不然体素图会读取错误。不过更高的分辨率一般不会导致什么bug,因为每次读取体素图时的位置都被设置在了这个像素的正中间
方块材质的获取来自 assets/minecraft/textures/effect/atlas.png ,左上角是原版生成的 atlas 图,其余三个角则存储了其他的信息(例如发光强度、金属性、粗糙度等)。由于每个方块的信息都存储在一个像素里面,只能存储一组材质UV位置,每个方块都只能使用一张贴图。
上面的内容和 PTGI 的路径追踪实现方案几乎如出一辙,区别在于 PTGI 使用 shadowcolor 存储体素数据,而这个原版 shader 用屏幕 buffer 存储;PTGI使用 Optifine 的功能获取游戏生成的动态 atlas 贴图,而这个 shader 使用存储在 textures/effect 的自己生成的静态atlas贴图
另外从这个shader似乎能看出在 textures/effect 里面存储贴图之后,可以在后处理里面获取到。例如这个 shader 的该目录下存放了 atlas.png 和 steve.png ,然后 shaders/post/transparency.json 里面存在以下数据:
- {
- "name": "AtlasSampler",
- "id": "atlas",
- "width": 1,
- "height": 1,
- "bilinear": false
- },
- {
- "name": "SteveSampler",
- "id": "steve",
- "width": 1,
- "height": 1,
- "bilinear": false
- }
我真是能耐了,进这个帖子走了一趟
我乖乖滚出去了
我乖乖滚出去了
顶顶顶!!!
第一次知道
很高兴来到MCBBS论坛
第一次听mc里有着色器
学~学废了
几乎一个小白,看不懂啊啊啊啊啊
6666666666666666666
GeForceLegend 发表于 2021-5-21 10:56
顺便说一句那个原版路径追踪的原理:先设定一个存储体素图的分辨率(可以手动在文件内改,默认是1024x705, ...
asfsdafsdagsdgdfgdfgdfgdfg
followspot 发表于 2021-4-5 22:10
我能说我不知道什么是着色器嘛
sdagadgdfsgdfgfdgfdgfdgdfg
sdgdfgdfgdfdfgfdgfdgfddfgfdg
1901393637 发表于 2021-4-5 17:37
as 安达市阿萨德爱上的打啥
dsagfdgfdgdfgdfgdfgdfgfdgdfgfdg
执光 发表于 2021-4-3 12:28
非常不错的知识 赞
dsagdfgfdfdgdfgdfgfdgfdfrdfdfgfdgfddg
6666666666666666666