Войти
ПрограммированиеФорумГрафика

[Direct3D] Вопросы по Direct3D9, Direct3D10, Direct3D11

Страницы: 1 2 Следующая »
#0
17:29, 26 июня 2012

Добрый день!
В этой теме хочу периодически задавать вопросы по Direct3D 9.

1. [Вопрос снят] Есть RenderState D3DRS_COLORVERTEX (по умолчанию TRUE).
В каких случаях это состояние нужно дергать в FALSE?
Ответ:
Я понимаю этот механизм так:
1. При D3DRS_COLORVERTEX = TRUE
Цвет берется согласно установкам D3DRS_DIFFUSEMATERIALSOURCE, D3DRS_SPECULARMATERIALSOURCE, D3DRS_AMBIENTMATERIALSOURCE, D3DRS_EMISSIVEMATERIALSOURCE
т.е. если в этих стейтах стоит D3DMCS_MATERIAL, цвет берется из материала.
если же стоит D3DMCS_COLOR1, то цвет берется из данных вершин. Если же в данных вершин отсутствует цвет о вершине, то берется из материала.
2. При D3DRS_COLORVERTEX = FALSE - видимо отключает весь этот механизм. А вот откуда данные о цвете берутся? Я подразумеваю что из материала. Поэтому у меня ничего и не менялось.

Я так понимаю, что D3DRS_COLORVERTEX = TRUE нужен только тогда, когда нужно делать интерполяцию цветов между вершинами. Или указывать вершины разными цветами (н-р. выбрили вершину она стала желтой, в то время как все остальные серые). Т.е. в каждой вершине задавать данные о цвете.

Вывод: Т.к. механизм делает работу с цветом более гибким и расширяет функционал, то можно этот стейт держать всегда в TRUE. На производительность это сильно не влияет.
Плюсом также является, что выбор какой цвет будет взят для расчета зависит от: 1. Если данные о цвете в самой вершине 2. И от состояний D3DRS_DIFFUSEMATERIALSOURCE, D3DRS_SPECULARMATERIALSOURCE, D3DRS_AMBIENTMATERIALSOURCE, D3DRS_EMISSIVEMATERIALSOURCE.


2. [Вопрос снят] Есть RenderState D3DRS_NORMALIZENORMALS.
Есть ли смысл всегда держать это состояние в TRUE?
Ответ: Т.к. данный стейт не оказывает большого влияния на производительность визуализации, но помогает улучшит качество (ИМХО) лучше данный стейт держать всегда в TRUE.
Всем спс кто участвовал в ответе на данный вопрос.

PS. Не спрашивайте зачем? И для чего?
Также не интересуют ответы того плана "Переходи на Direct 10 или 11".
Ответ: Нужно. И именно DirectX 9.


#1
18:02, 26 июня 2012

Забудь об этом. Это FFP, надо использовать шейдеры. Там таких вопросов даже не возникнет, потому что будет то, что написал.

#2
18:29, 26 июня 2012

gammaker
> Забудь об этом. Это FFP, надо использовать шейдеры. Там таких вопросов даже не
> возникнет, потому что будет то, что написал.
Про шейдеры тоже понятно. Интересует именно FFP.

#3
22:26, 26 июня 2012

вот это да ... а время оказывается не движется.. :)

#4
22:50, 26 июня 2012

Фолипот
> вот это да ... а время оказывается не движется.. :)
Время движется.
С системой шейдеров как раз всё понятно.
С DX10 или DX11 тоже понятно (но это тока для Вын7 и висты).
Нужна подержа DX9 без системы шейдеров (для старых карт и систем ВынXP).
Отсюда и вопросы такие.

PS. Не мои капризы.

#5
22:55, 26 июня 2012

asvp
При масштабировании и некоторых других трансформациях на FFP меняется длина нормали, в результате, например, меняется яркость Diffuse при расчёте света, D3DRS_NORMALIZENORMALS нормализует нормали после трансформации вертексов, чтобы этого не происходило, отключают в целях повышения быстродействия.

#6
23:02, 26 июня 2012

Mikle
> При масштабировании и некоторых других трансформациях на FFP меняется длина
> нормали, в результате, например, меняется яркость Diffuse при расчёте света,
> D3DRS_NORMALIZENORMALS нормализует нормали после трансформации вертексов, чтобы
> этого не происходило, отключают в целях повышения быстродействия.
Для чего D3DRS_NORMALIZENORMALS я знаю. Доки по SDK читать умею.
Вопрос был в другом.
Т.к. я особо не заметил потерю быстродействия при D3DRS_NORMALIZENORMALS = TRUE, вот и спрашиваю стоит его держать постоянно в TRUE.
ИМХО хрен с этим быстродействием, лишь бы качество не пострадало.

#7
23:10, 26 июня 2012

Если попадётся модель с ненормализованными изначально нормалями, то D3DRS_NORMALIZENORMALS это может испортить. Такое может применяться, например, для выделения тёмный и светлых мест на модели, без добавления лишней текстуры или цвета в вертекс.
А вот нафига выключать  D3DRS_COLORVERTEX - сам не пойму.

#8
23:34, 26 июня 2012

Mikle
> А вот нафига выключать  D3DRS_COLORVERTEX - сам не пойму.
Текстурированный объект, например, куб. Тогда per-vertex color не нужен.

#9
23:47, 26 июня 2012

evirus
> Текстурированный объект, например, куб. Тогда per-vertex color не нужен.
Ок. Спс. проверю. Возможно вы правы.
Т.е. получается так:
1. Когда текстур нет, D3DRS_COLORVERTEX = TRUE. И данные о цвете вершины берется из самих данных или из материала.
2. Когда идет текстурирование, эту шнягу можно отключить, т.к. данные о цвете вершины (а точнее пиксела) будут взяты из текстур(ы).

#10
9:17, 27 июня 2012

asvp
Я так понял, что данные о цвете всё равно идут в пиксельный шейдер (FFP, но смысл тот же), причём не просто идут, а интерполируются, а потом игнорируются, а если отключить D3DRS_COLORVERTEX, то не идут.
asvp
> я особо не заметил потерю быстродействия при D3DRS_NORMALIZENORMALS = TRUE
А попробуй побольше полигонов в сцене, чтобы не филрейт был батлнеком, и включи софтверный вертекспроцессинг.

#11
11:46, 27 июня 2012

Mikle
> Я так понял, что данные о цвете всё равно идут в пиксельный шейдер (FFP, но
> смысл тот же), причём не просто идут, а интерполируются, а потом игнорируются,
> а если отключить D3DRS_COLORVERTEX, то не идут.
Поэкспериментировав сегодня ночью с D3DRS_COLORVERTEX так и не понял для чего это состояние. Правда я не использую Diffuse и Specular в самих данных вершин, а использую материал. Может с этим что-то связано. Как-нить поэкспериментирую еще.
На даный момент всегда D3DRS_COLORVERTEX = TRUE.

> А попробуй побольше полигонов в сцене, чтобы не филрейт был батлнеком.
Пробовал загружать и выводить сетку содержащую 100к трианглов. Результаты одинаковые. При 60 fps за 1 сек. успевает вывести 6394800 трианглов. Так что просадки большой нет.
> и включи софтверный вертекспроцессинг
Фу, фу, фу гадость. Не говори об этом никому больше.

ИМХО всегда D3DRS_NORMALIZENORMALS = TRUE

#12
16:40, 27 июня 2012

asvp
> софтверный вертекспроцессинг
> Фу, фу, фу гадость. Не говори об этом никому больше.
Между прочим, во встроенных Intel до сих пор нет аппаратного вертекспроцессинга, хотя PS_2_0 держит.

#13
16:46, 27 июня 2012

Mikle
> Между прочим, во встроенных Intel до сих пор нет аппаратного
> вертекспроцессинга, хотя PS_2_0 держит.
Да. Знаю об этом. Встроенные только чтобы картинку показывать на мониторе. Они изначально не предназначены для сложно визуализации.

#14
17:20, 27 июня 2012

asvp
Тебе не жалко время тратить на такие "капризы"?

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.