WebGL中透明纹理的奇怪渲染行为

WebGL中透明纹理的奇怪渲染行为,webgl,haxe,away3d,openfl,Webgl,Haxe,Away3d,Openfl,我一直在使用Haxe+Away3D编写一个小型行星生成器,并将其部署到HTML5/WebGL。但是我在渲染云时遇到了一个奇怪的问题。我有行星网格,然后云网格在同一位置稍微大一点 我正在使用柏林噪声函数来生成行星特征和云结构,将它们写入位图,并将位图作为纹理应用。现在,奇怪的是,当我将其部署到iOS或C++/OSX时,它呈现的正是我所希望的: 现在,当我部署到WebGL时,它会生成相同的漫反射贴图,但渲染为: (由于我重新加载页面的频率太高,上面的分辨率要低得多。在更高的分辨率下,问题仍然存在

我一直在使用Haxe+Away3D编写一个小型行星生成器,并将其部署到HTML5/WebGL。但是我在渲染云时遇到了一个奇怪的问题。我有行星网格,然后云网格在同一位置稍微大一点

我正在使用柏林噪声函数来生成行星特征和云结构,将它们写入位图,并将位图作为纹理应用。现在,奇怪的是,当我将其部署到iOS或C++/OSX时,它呈现的正是我所希望的:

现在,当我部署到WebGL时,它会生成相同的漫反射贴图,但渲染为:

(由于我重新加载页面的频率太高,上面的分辨率要低得多。在更高的分辨率下,问题仍然存在。)

云在那里,边缘看起来很好,纤细而半透明。但是内部是不透明的,看起来渲染方式不同(每个像素都是相同的颜色,只是alpha通道发生了变化)

我意识到这可能与最终如何在haxe中编译/生成代码有关,但我希望它是一些简单的东西,比如渲染设置或混合模式,我没有设置。但由于我甚至不确定到底发生了什么,我不知道该去哪里找

这是正在生成的漫反射贴图。我把它覆盖在红色上,这样就可以看到云彩了

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");

    }

此外,WebGL Inspector对于调试WebGL应用程序非常有用。你用过吗


那么,你是不是从ByteArray上传了那张照片? 莱姆曾经允许使用数组索引操作符访问ByteArray,即使它不应该在js上。这在Lame的最新版本中已修复,以避免出现错误。 我使用了uuu get和uuu set方法而不是[]来访问字节数组

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

如果away3d是问题的原因,代码的哪一部分是问题的原因?我现在还不确定


编辑:我还遇到了OpenFL最新WebGL后端的问题。我认为遗留OpenFL没有这个问题。OpenFL的sprite渲染器在我不知情的情况下更改了colorMask(可能还有其他OpenGL渲染状态)!出现此问题是因为我的代码和OpenFL的sprite渲染器实际上使用的是相同的OpenGL上下文。我通过手动禁用OpenFL的sprite渲染器解决了这个问题。

您认为生成的颜色值是否超过了255255?也许这在编译的JS中表现不同。你能确保每个像素颜色值都被钳制为0..255吗?我检查过了,但我将所有值钳制为1.0(255)。我甚至丢弃了每个像素和grep'd。不幸的是,这不是我的问题。我的柏林木噪音是手工制造的,不是用内置的。我注意到我的图像被破坏了,所以让我来修复它们。如果你有其他想法:)哦,我不知道检查员的事,谢谢。