2014-10-22 91 views
3

我一直在使用Haxe + Away3D编写一个小星球生成器,并部署到HTML5/WebGL。但是在渲染我的云时我遇到了一个奇怪的问题。我拥有行星网状物,然后云层在相同的位置稍微变大。WebGL中透明纹理的奇怪渲染行为

我使用珀林噪声函数来生成行星特征和云层,将它们写入位图并将位图应用为纹理。现在,奇怪的是,当我这个部署到iOS或C++/OSX,它呈现正是我如何想:

The good

现在,当我部署到WebGL的,它会产生一个相同的漫反射贴图,但呈现如:

The bad & the ugly

(以上是在一个非常低的分辨率,由于我是多久重新加载页面的问题依然存在,在更高的分辨率。)

的云那里,边缘看起来很好,纤细和半透明。但内部是不透明的,看起来呈现不同(每个像素是相同的颜色,只有阿尔法通道改变)

我知道这可能与如何最终编译/生成haxe代码有关,但我希望它是简单的,就像我没有设置的渲染设置或混合模式。但是因为我甚至不确定究竟发生了什么,我不知道在哪里看。

这是制作的漫反射地图。我将它覆盖在红色上,这样可以看到云。

Clouds

+0

您是否认为您生成的颜色值超过了255,255,255?也许这在编译后的JS中有不同的表现。你能确保每个像素的颜色值被钳位到0..255吗? – pixelmike 2014-10-23 20:42:12

+0

我检查了这一点,但我将所有值都限制为1.0(255)。我甚至倾倒了每个像素和grep'd。 – Shadda 2014-10-24 23:46:13

回答

0

Bitmapdata.perlinNoise不会对HTML5的工作。 你应该自己实现它,或者你可以使用预渲染的图像。


    public function perlinNoise (baseX:Float, baseY:Float, numOctaves:UInt, randomSeed:Int, stitch:Bool, fractalNoise:Bool, channelOptions:UInt = 7, grayScale:Bool = false, offsets:Array = null):Void { 

     openfl.Lib.notImplemented ("BitmapData.perlinNoise"); 

    } 

https://github.com/openfl/openfl/blob/c072a98a3c6699f4d334dacd783be947db9cf63a/openfl/display/BitmapData.hx

此外,WebGL的督察是调试WebGL的应用程序非常有用的。你用过吗?

http://benvanik.github.io/WebGL-Inspector/

+0

尽管这个链接可能回答这个问题,但最好在这里包含答案的基本部分,并提供参考链接。如果链接页面更改,则仅链接答案可能会失效。 – mybirthname 2014-11-22 00:34:14

+0

好的,我已经添加了解释问题的代码。 – vroad 2014-11-22 01:41:36

+0

不幸的是,这不是我的问题。我的佩林噪音是手工制作的,不使用内建。不过,我注意到我的图像被破坏了,所以让我解决这些问题。如果你有任何其他的想法:)哦,并不知道检查员,谢谢。 – Shadda 2014-11-22 02:57:15

0

好了,那么,你上传的ByteArray的形象? Lime曾经允许使用数组索引操作符访问ByteArray,即使它不应该在js上。这是在最新版本的石灰中修复的,以避免错误。 我用__get和__set方法代替[]来访问一个字节数组。

Away3d本身也可能是这个问题的原因,因为后端代码是根据您使用的目标从不同的源文件生成的。 例如,html5支持Texture.uploadFromByteArray的byteArrayOffset参数,但不支持native。

如果away3d是问题的原因,哪部分代码导致了问题?我现在不确定。

编辑:我也遇到了OpenFL的最新WebGL后端的问题。我认为传统的OpenFL没有这个问题。OpenFL的sprite渲染器在我不知情的情况下改变了colorMask(可能还有其他OpenGL渲染状态)!发生这个问题是因为我的代码和OpenFL的sprite渲染器实际上使用了相同的OpenGL上下文。我通过手动禁用OpenFL的精灵渲染器摆脱了这个问题。