Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 13.12.2011, 14:13
BuKT вне форума Посмотреть профиль Отправить личное сообщение для BuKT Найти все сообщения от BuKT
  № 1  
Ответить с цитированием
BuKT
 
Аватар для BuKT

блогер
Регистрация: Dec 2010
Сообщений: 237
Записей в блоге: 5
По умолчанию Molehill. CubeTexture

При попытке загрузки ресурса кубомапы в контекст в темпе вальса строится псевдосцена, в которой вокруг своей оси крутится камера (да-да, это альтернатива, но в данном случае это не суть важно) и очень старается сфотографировать окружающую обстановку для дальнейшего запекания в текстуру. Для ускорения рендера, фотографируется всего лишь маленький скайбокс, обёрнутый в "псевдокубическую" текстуру, взятую из развёрнутый-в-плоскость-кубик.jpg.
Код AS3:
    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);  
            }  
        }
В дальнейшем, CubeTexture extends TextureBase передаётся в текстурный семплер шейдера. Однако шейдер эту текстуру игнорирует, и судя по всему, вываливается в какой-нибудь видеокартный эррор, результатом чего становится прозрачность поверхности (ну и соответственно игнорирование при z-буфферизации).
Я конечно грешил на шейдер, но невызов setTextureAt выдаёт аналогичное поведение отрисовщика. Тем не менее, если сделать "mov oc, fc0.xyz" и где-нибудь выше выставить фрагментную константу в произвольное значение - поверхность отрисовывается нормально, хоть и не нужным мне цветом.
Действительно ли я где-то накосячил с созданием трёхмерной текстуры? Или всё-таки шейдер виноват?

Добавлено через 45 часов 20 минут
Чтобы обнаружить ошибку, необходимо было установить значение context3d.enableErrorChecking в true. Только так удалось поймать сообщение, говорящее о необходимости сделать upload() над недостающими mip-уровнями трёхмерной текстуры. Как видно из листинга выше - я создавал только нулевой (максимальный) мип-уровень. В коде, любезно предоставленном flastar, побитово проходятся все степени двойки и для каждой создаётся свой уровень.

Как отключить необходимость мип-текстур, я так и не разобрался
__________________
Дебаггер не предлагать


Последний раз редактировалось BuKT; 15.12.2011 в 11:34.
Создать новую тему Ответ Часовой пояс GMT +4, время: 13:47.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 13:47.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.