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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.06.2012, 12:49
Frankie Wilde вне форума Посмотреть профиль Отправить личное сообщение для Frankie Wilde Найти все сообщения от Frankie Wilde
  № 1  
Ответить с цитированием
Frankie Wilde

Регистрация: Jul 2007
Сообщений: 15
Question Использование текстур в шейдерах, где они (текстуры) не нужны

Одновременно пытаюсь отрисовать несколько объектов – цветные и текстурированные.

Есть массив _programs композиционных объектов, в которых храню шейдеры, модели (вершины, индексы) и текстуры. На этапе инициализации для каждого объекта создаю программу, в неё загружаю шейдеры и, если нужно, в контекст под соответствующим индексом текстуры. Эту программу добавляю в объект.
Затем каждый кадр перебираю массив _programs. Включаю нужную программу, создаю буфферы и т.д. Код ниже.

Ругается на тот шейдер, который не использует текстуру, так:
Цитата:
Текстура связана с образцом 0, но не используется программой фрагментов
То есть хочет, чтобы шейдер модели, не использующей шейдеры, заюзала fs0?!

Инициализация:
Код AS3:
...
for each (var item:Program in _programs) {
	for (var name:String in item.wrapper.textures) {
		var bm:Bitmap = item.wrapper.textures[name];
		var texture:Texture = context3D.createTexture(bm.width, bm.height, Context3DTextureFormat.BGRA, true);
		context3D.setTextureAt(parseInt(name), generateMipmaps(texture, bm.bitmapData));
	}
}
...
Каждый кадр:
Код AS3:
...
for (var i:uint = 0; i < _programs.length; i++) {
	context3D.setProgram(_programs[i].program);
 
	var meshVertexData:Vector.<Number> = _programs[i].wrapper.model.vertexes;
	var vertexBuffer:VertexBuffer3D = createVertexBuffer(meshVertexData, context3D);
 
	var meshIndexData:Vector.<uint> = _programs[i].wrapper.model.indexes;
	var indexBuffer:IndexBuffer3D = createIndexBuffer(meshIndexData, context3D);
 
	context3D.setVertexBufferAt(0, vertexBuffer, 0, Context3DVertexBufferFormat.FLOAT_4);
	context3D.setVertexBufferAt(1, vertexBuffer, 4, Context3DVertexBufferFormat.FLOAT_2);
	context3D.setVertexBufferAt(2, vertexBuffer, 6, Context3DVertexBufferFormat.FLOAT_4);
 
	context3D.drawTriangles(indexBuffer, 0, meshIndexData.length / 3);
}
...
Шейдеры тектурированного объекта:

Код:
"m44 op, va0, vc0\n" +
"mov v0, va0\n"+
"mov v1, va1\n"+
"mov v2, va2\n",

"tex oc, v1, fs0 <2d,repeat,miplinear>\n"
Шейдеры объекта без текстуры:

Код:
"m44 op, va0, vc0\n" +
"mov v0, va0\n",

"mov oc, v0\n"
P.S. Кстати, если добавить в бестекстурный шейдер бесполезную строку
Код:
tex ft0, v1, fs0 <2d,repeat,miplinear>\n
, всё работает.

Старый 27.06.2012, 16:50
Волгоградец вне форума Посмотреть профиль Отправить личное сообщение для Волгоградец Найти все сообщения от Волгоградец
  № 2  
Ответить с цитированием
Волгоградец
 
Аватар для Волгоградец

блогер
Регистрация: Sep 2007
Адрес: Гамбург
Сообщений: 1,648
Записей в блоге: 12
Нужно установить текстуру в нулл. Т.е. в одном шейдере заюзал, в другом, если не нужна, удалил. Ну а так да - если объявил, то обязан использовать.

Старый 27.06.2012, 16:59
Frankie Wilde вне форума Посмотреть профиль Отправить личное сообщение для Frankie Wilde Найти все сообщения от Frankie Wilde
  № 3  
Ответить с цитированием
Frankie Wilde

Регистрация: Jul 2007
Сообщений: 15
Привет =)
Установка в нулл имеется в виду:
Код AS3:
context3D.setTextureAt(0, null);
?

Проверил, работает, спасибо.
Только вот вопрос, как же я узнаю, сколько в предыдущем цикле текстур было использовано? Заводить для этого отдельную uint-перемнную?


Последний раз редактировалось Frankie Wilde; 27.06.2012 в 17:03.
Старый 28.06.2012, 02:40
Волгоградец вне форума Посмотреть профиль Отправить личное сообщение для Волгоградец Найти все сообщения от Волгоградец
  № 4  
Ответить с цитированием
Волгоградец
 
Аватар для Волгоградец

блогер
Регистрация: Sep 2007
Адрес: Гамбург
Сообщений: 1,648
Записей в блоге: 12
Вариантов куча. Но лучше объекты сгруппировать так, чтобы сначала отрисовывались объекты с одной текстурой, потом с другой и т.д. Вобщем надо сократить обращение к контексту по максимуму.

Создать новую тему Ответ Часовой пояс GMT +4, время: 05:14.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
текстура , шейдер

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

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


 


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


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