[MD]
### [Revelation (Github)](https://github.com/HahnPro/Revelation)

**前排提示**:本 BUG 由 Iris 模组自身导致,并非 Revelation 的 BUG。
> 这个教程本来是为 IterationRP 准备的,后来 Tahnass 修复了这一问题。如果你使用任何着色器,在启用着色器时出现了游戏崩溃,就可以考虑是这个 BUG 导致的,下面的修复方法是通用的。
## Bug 成因
在Iris 1.8版本之前,vaUV2的声明必须出现在所有函数声明之前。否则Iris在处理时,会误以为没有声明vaUV2,进而导致Iris的glsl-transformer重复声明vaUV2。(可以在崩溃后,Iris修补的着色器文件中得以验证)
这个问题只会出现在使用Core Profile的更现代的着色器包中,这也是为什么主流的国外着色器并没有出现这个BUG的一个原因。
### 如何复现这个BUG
#### 会导致崩溃
```glsl
#version 460 core
float pow2(in float a) {
return pow(a, 2);
}
in ivec2 vaUV2;
```
#### 不会导致崩溃
```glsl
#version 460 core
in ivec2 vaUV2;
float pow2(in float a) {
return pow(a, 2);
}
```
## 修复方法
这里推荐使用VSCode进行编辑,你可以在这里下载到它:[VSCode](https://code.visualstudio.com/)
我们将着色器包解压,方便后面的操作,解压时注意文件夹的层级关系,需要是 `shaderpacks/你的文件夹/shaders`,这样解压后的着色器依旧可以在游戏中加载。
使用VSCode打开解压后的文件,搜索 `in ivec2 vaUV2;`,检查所有出现 `in ivec2 vaUV2;` 的文件,对于Revelation,你需要将文件中出现的 `in ivec2 vaUV2;` 移动到 `#include "/lib/Utility.glsl"` 前面。
**注意**:具体来说,是将 `in ivec2 vaUV2;` 移动到所有函数声明之前,但对于教程撰写时的Revelation版本,移动到 `#include "/lib/Utility.glsl"` 前面就可以了。随着后续Revelation更新,上述操作可能会失效。(也可能被修复)
例如,在 `shaders/program/gbuffers/Hand.vert` 中:
原始内容:
```glsl
//======// Utility //=============================================================================//
#include "/lib/Utility.glsl"
//======// Output //==============================================================================//
...Outputs...
//======// Attribute //===========================================================================//
...Other Attributes...
in ivec2 vaUV2;
...Other Attributes...
```
修改后的内容:
```glsl
in ivec2 vaUV2;
//======// Utility //=============================================================================//
#include "/lib/Utility.glsl"
//======// Output //==============================================================================//
...Outputs...
//======// Attribute //===========================================================================//
...Other Attributes...
```
在修改完所有出现 `in ivec2 vaUV2;` 的文件后,你可以选择将文件夹压缩回压缩包,也可以直接使用文件夹去加载着色器。很多人都不清楚文件夹也可以被识别加载 :)
至此,所有的工作就都做完了,祝大家玩的开心!
[/MD]
### [Revelation (Github)](https://github.com/HahnPro/Revelation)

**前排提示**:本 BUG 由 Iris 模组自身导致,并非 Revelation 的 BUG。
> 这个教程本来是为 IterationRP 准备的,后来 Tahnass 修复了这一问题。如果你使用任何着色器,在启用着色器时出现了游戏崩溃,就可以考虑是这个 BUG 导致的,下面的修复方法是通用的。
## Bug 成因
在Iris 1.8版本之前,vaUV2的声明必须出现在所有函数声明之前。否则Iris在处理时,会误以为没有声明vaUV2,进而导致Iris的glsl-transformer重复声明vaUV2。(可以在崩溃后,Iris修补的着色器文件中得以验证)
这个问题只会出现在使用Core Profile的更现代的着色器包中,这也是为什么主流的国外着色器并没有出现这个BUG的一个原因。
### 如何复现这个BUG
#### 会导致崩溃
```glsl
#version 460 core
float pow2(in float a) {
return pow(a, 2);
}
in ivec2 vaUV2;
```
#### 不会导致崩溃
```glsl
#version 460 core
in ivec2 vaUV2;
float pow2(in float a) {
return pow(a, 2);
}
```
## 修复方法
这里推荐使用VSCode进行编辑,你可以在这里下载到它:[VSCode](https://code.visualstudio.com/)
我们将着色器包解压,方便后面的操作,解压时注意文件夹的层级关系,需要是 `shaderpacks/你的文件夹/shaders`,这样解压后的着色器依旧可以在游戏中加载。
使用VSCode打开解压后的文件,搜索 `in ivec2 vaUV2;`,检查所有出现 `in ivec2 vaUV2;` 的文件,对于Revelation,你需要将文件中出现的 `in ivec2 vaUV2;` 移动到 `#include "/lib/Utility.glsl"` 前面。
**注意**:具体来说,是将 `in ivec2 vaUV2;` 移动到所有函数声明之前,但对于教程撰写时的Revelation版本,移动到 `#include "/lib/Utility.glsl"` 前面就可以了。随着后续Revelation更新,上述操作可能会失效。(也可能被修复)
例如,在 `shaders/program/gbuffers/Hand.vert` 中:
原始内容:
```glsl
//======// Utility //=============================================================================//
#include "/lib/Utility.glsl"
//======// Output //==============================================================================//
...Outputs...
//======// Attribute //===========================================================================//
...Other Attributes...
in ivec2 vaUV2;
...Other Attributes...
```
修改后的内容:
```glsl
in ivec2 vaUV2;
//======// Utility //=============================================================================//
#include "/lib/Utility.glsl"
//======// Output //==============================================================================//
...Outputs...
//======// Attribute //===========================================================================//
...Other Attributes...
```
在修改完所有出现 `in ivec2 vaUV2;` 的文件后,你可以选择将文件夹压缩回压缩包,也可以直接使用文件夹去加载着色器。很多人都不清楚文件夹也可以被识别加载 :)
至此,所有的工作就都做完了,祝大家玩的开心!
[/MD]
- 内容版权许可
- CC BY-NC-SA 署名-非商业性使用-相同方式共享