|
|
|||||
Molehill. CubeTexture
При попытке загрузки ресурса кубомапы в контекст в темпе вальса строится псевдосцена, в которой вокруг своей оси крутится камера (да-да, это альтернатива, но в данном случае это не суть важно) и очень старается сфотографировать окружающую обстановку для дальнейшего запекания в текстуру. Для ускорения рендера, фотографируется всего лишь маленький скайбокс, обёрнутый в "псевдокубическую" текстуру, взятую из развёрнутый-в-плоскость-кубик.jpg.
public class CubeResource extends TextureResource { private var displace3DArray:Array = [ { x: 2, y:0 }, { x: 2, y: 2 }, { x: 0, y:1 }, { x:2, y:1 }, { x:1, y:1 }, { x: 3, y:1 } ]; private var _bitmapData:BitmapData; private var _sidesArray:Vector.<BitmapData> = new Vector.<BitmapData>(); public function CubeResource(bitmapDataToCreateCubeTexture:BitmapData) { _bitmapData = bitmapDataToCreateCubeTexture; for (var i:int = 0; i < 6; i++) { _sidesArray.push(sliceBitmapAt(i)); } } private function sliceBitmapAt(i:int):BitmapData { var bData:BitmapData = new BitmapData(2, 2,false,0); var matrix:Matrix = new Matrix(); matrix.tx = - bData.width * displace3DArray[i].x; matrix.ty = - bData.height * displace3DArray[i].y; bData.draw(_bitmapData, matrix); return bData; } override public function upload(context3D:Context3D):void { if (_texture != null) { _texture.dispose(); } calculateCube(context3D); } private function calculateCube(context3D:Context3D):void { var viewSizeX : Number = 640; var viewSizeY : Number = 480; var rootContainer:Object3D = new Object3D(); var camera:Camera3D = new Camera3D(.1, 1000); var skyBox:SkyBox = new SkyBox(100, getMat(0), getMat(1), getMat(2), getMat(3), getMat(4), getMat(5)); rootContainer.addChild(camera); rootContainer.addChild(skyBox); var stage3D:Stage3D = ThreeDimensions.stage3D; camera.fov = Math.atan(Math.sqrt(viewSizeX * viewSizeX + viewSizeY * viewSizeY) / camera.focalLength) * 2; camera.scaleX = camera.focalLength / 640 * 2; camera.scaleY = camera.focalLength / 480 * 2; for each (var res:Resource in rootContainer.getResources(true)){ if (!res.isUploaded) { res.upload(context3D); } } lookAt(camera, camera.x - 1, camera.y, camera.z); var texture:CubeTexture = context3D.createCubeTexture(_sidesArray[0].width, Context3DTextureFormat.BGRA, true); context3D.setRenderToTexture(texture, false, 0, 0); camera.render(stage3D); lookAt(camera, camera.x + 1, camera.y, camera.z); context3D.setRenderToTexture(texture, false, 0, 1); camera.render(stage3D); lookAt(camera, camera.x, camera.y - 1, camera.z); context3D.setRenderToTexture(texture, false, 0, 4); camera.render(stage3D); lookAt(camera, camera.x, camera.y + 1, camera.z); context3D.setRenderToTexture(texture, false, 0, 5); camera.render(stage3D); lookAt(camera, camera.x, camera.y, camera.z + 1); camera.rotationZ = Math.PI; context3D.setRenderToTexture(texture, false, 0, 2); camera.render(stage3D); lookAt(camera, camera.x, camera.y, camera.z - 1); camera.rotationZ = Math.PI; context3D.setRenderToTexture(texture, false, 0, 3); camera.render(stage3D); _texture = texture; context3D.setRenderToBackBuffer(); } private function getMat(pos:Number):TextureMaterial { return new TextureMaterial(new BitmapTextureResource(_sidesArray[pos])); } public function lookAt(camera:Camera3D, x:Number, y:Number, z:Number):void { var dx : Number = x - camera.x; var dy : Number = y - camera.y; var dz : Number = z - camera.z; camera.rotationX = Math.atan2(dz, Math.sqrt(dx * dx + dy * dy)) - Math.PI / 2; camera.rotationY = 0; camera.rotationZ = -Math.atan2(dx, dy); } } Я конечно грешил на шейдер, но невызов setTextureAt выдаёт аналогичное поведение отрисовщика. Тем не менее, если сделать "mov oc, fc0.xyz" и где-нибудь выше выставить фрагментную константу в произвольное значение - поверхность отрисовывается нормально, хоть и не нужным мне цветом. Действительно ли я где-то накосячил с созданием трёхмерной текстуры? Или всё-таки шейдер виноват? Добавлено через 45 часов 20 минут Чтобы обнаружить ошибку, необходимо было установить значение context3d.enableErrorChecking в true. Только так удалось поймать сообщение, говорящее о необходимости сделать upload() над недостающими mip-уровнями трёхмерной текстуры. Как видно из листинга выше - я создавал только нулевой (максимальный) мип-уровень. В коде, любезно предоставленном flastar, побитово проходятся все степени двойки и для каждой создаётся свой уровень. Как отключить необходимость мип-текстур, я так и не разобрался
__________________
Дебаггер не предлагать Последний раз редактировалось BuKT; 15.12.2011 в 11:34. |
Часовой пояс GMT +4, время: 13:47. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|