Cat*_*ard 8 shader pixel glsl unity-game-engine fragment-shader
我用我的像素化iOS应用程序编写了一个用于Unity3D的GLSL着色器.它有两个问题:
1)效果并不总是与月亮保持一致,2)灯光看起来并不像素化.
我会解释一下.着色器用于在月亮位于其后面时对前景对象产生照明效果.我有一个精灵,通常显示为全黑(如轮廓),但当月亮物体足够接近它时,它会显示纹理的细节,如下所示:
实际的精灵(没有着色器)看起来像这样:
我这样做效果的原因是我可以有一个只有一个纹理的光照贴图.但是,它有两个问题:
1)当我靠近屏幕边缘时,光效并不完全跟随月亮.我不确定这是否与我对TEXCOORD1变量的错误使用情况有关.我做了一个覆盖整个屏幕的精灵,这样你就可以看到它不跟随月亮.这是我的测试场景中关于效果的问题的图片.有一个带有黑色条纹和alpha的全屏精灵,可以随时显示效果的确切位置.我想摆脱这种不同寻常,因为它使得照明看起来不切实际.
2)引起的照明效果非常明显 - 我想,如果每个像素都单独点亮,就像SpriteLamp一样.我知道它与着色器中的片段坐标的舍入有关,但由于我从未真正知道我的着色器中变量的值是什么,我似乎无法使其正常工作.
我可以绕着地面转动距离,但是我得到了这个,这是服从月球的距离,但不遵守原始精灵中的像素.有像素化,但如果你理解我的意思,我们最终会得到这个奇怪的曲线,只有一个像素.
我正在寻找的更像是这样.看看原始纹理的各个像素是如何点亮的?
这是着色器本身的链接:http://pastebin.com/0zbqrP57.它主要是默认的Unity精灵着色器,但是在SampleSpriteTexture函数的末尾添加了一些代码.
这是一个unitypackage的链接,您可以使用它来查看正在运行的着色器.只需在场景播放时尝试移动月亮.
https://drive.google.com/open?id=0BxCQjUHiAAQWZGpPZ3R2SExTcXc
我的问题:您对如何解决这些问题或解决方案有什么建议吗?
改变
OUT.worldSpacePosition = mul(_Object2World, OUT.vertex);
Run Code Online (Sandbox Code Playgroud)
为了
OUT.worldSpacePosition = mul(_Object2World, IN.vertex);
Run Code Online (Sandbox Code Playgroud)
应该修复月球错位。
对于第二个问题我想出了这个:
aS = floor(aS * 100) / 100;
bS = floor(bS * 100) / 100;
float dist = sqrt((aS * aS) + (bS * bS));
float percentClose = 1 - (dist / _LightStrength);
float rounded = floor(percentClose * 10) / 10;
if (color.r + color.g + color.b > 0) {
color.r = lerp(0, color.r, rounded);
color.g = lerp(0, color.g, rounded);
color.b = lerp(0, color.b, rounded);
}
Run Code Online (Sandbox Code Playgroud)
我认为你可以将 if 语句和 lerps 删除为:
aS = floor(aS * 100) / 100;
bS = floor(bS * 100) / 100;
float dist = sqrt((aS * aS) + (bS * bS));
float percentClose = 1 - (dist / _LightStrength);
float rounded = floor(percentClose * 10) / 10;
color.rgb *= rounded;
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,您应该在终端设备上对其进行测试,并检查它是否可以提高性能。
| 归档时间: |
|
| 查看次数: |
1036 次 |
| 最近记录: |