forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   DirectX и C++ (http://forum.boolean.name/showthread.php?t=14481)

616}[aKeP 27.03.2011 19:40

Предлагаю, вот сюда кидать все вопросы по использованию DirectX и C++.

И у меня сразу вопросик: создал я вершиный и индексые буферы и нарисовал два куба.
Как мне их вращать независемо друг от друга?
Нужно ли создавать для каждого объекта свои буферы?

Что прям вот ни одного гуру по DirectX нету??

baton4ik 27.03.2011 20:25

Ответ: DirectX и C++
 
А может стоит набраться терпения и, превозмогая себя, подождать гуру больше пятнадцати минут?

616}[aKeP 27.03.2011 20:32

Ответ: DirectX и C++
 
Ну извените:(

HolyDel 27.03.2011 21:13

Ответ: DirectX и C++
 
Цитата:

Нужно ли создавать для каждого объекта свои буферы?
нет
1) биндишь буффер
2) устанавливаешь матрицу трансформации первого куба
3) ДИП
4)у станавливаешь матрицу трансформации второго куба
5) ДИП

616}[aKeP 27.03.2011 21:18

Ответ: DirectX и C++
 
Вот это геморой))))Буду лечить...

mr.DIMAS 27.03.2011 22:52

Ответ: DirectX и C++
 
проще быть надо. если память не жалко, то

создаешь класс для мешей в нем:
-индексный буфер
-вершинный буфер
-текстуры
-матрицы

и т.д и т.п

и определяешь фунцкцию рисования

в ней:
-устанавливаешь верш буфер(device->setStreamSource)
-устанавливаешь матрицу
-рисуешь

кстати где-то на форуме валяется мой двиг на директе( Simple Graphics( Game? ) Engine) , там исходники в комплекте. погляди может полезно будет

добавлено:
http://www.forum.boolean.name/showth...?t=9373&page=3

falcon 28.03.2011 01:36

Ответ: DirectX и C++
 
Цитата:

Нужно ли создавать для каждого объекта свои буферы?
Цитата:

Сообщение от HolyDel (Сообщение 183928)
нет

ну как же нет?
у большинства объектов всё-таки свои буферы))
но в случаем с кубиком, можно просто сменить трансформацию, да.

Цитата:

проще быть надо
О да чёрт подери. Будь ещё проще, пиши свой движок. Что может быть проще?

HolyDel 28.03.2011 17:48

Ответ: DirectX и C++
 
Код:

ну как же нет?
ну я так понял у него одна и та же геометрия рисуется в разных местах с разной ориентацией

Цитата:

проще быть надо. если память не жалко, то
надо еще проще! у тебя же куба два? а если будет три? такчто надо писать шейдер с хардварным инстансингом :-D

616}[aKeP 28.03.2011 18:05

Ответ: DirectX и C++
 
Ух ну вы и юмаристы!! А вот про класс я уже создаю. Думаю даже не класс написать, а целую либу.

FDsagizi 29.03.2011 14:20

Ответ: DirectX и C++
 
исходники огра тебе в помощь!

s16s 08.05.2011 13:49

Ответ: DirectX и C++
 
Есть вопрос по DirectDraw.

Считываю картинку из файла, а она показывает только пол картинки и вместо другой половины какие-то помехи. С чем связано?

HolyDel 08.05.2011 14:14

Ответ: DirectX и C++
 
Цитата:

s16s
код покажи

s16s 08.05.2011 14:18

Ответ: DirectX и C++
 
Я не понял код чего. Всей программы слишком длинной.

Или только функцию загрузки из файла?

HolyDel 08.05.2011 14:20

Ответ: DirectX и C++
 
да и отрисовки

s16s 08.05.2011 14:24

Ответ: DirectX и C++
 
//Очистка заднего буфера
ClearSurface(lpddsback);

//Установка размеров копируемого блока данных
SetRect(&rPic, 0, 0, 742, 128);

lpddsback->BltFast(80, 80,
pHero, &rPic, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);

lpddsprimary->Flip(NULL, DDFLIP_WAIT);


Это отрисовка.

s16s 08.05.2011 14:26

Ответ: DirectX и C++
 
Вот создаю новую поверхность

//__________________________________________hero
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize=sizeof(ddsd);
ddsd.dwFlags=DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH;
ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN;
ddsd.dwHeight = 128;
ddsd.dwWidth = 742;
lpdd->CreateSurface(&ddsd, &pHero, NULL);
//___________________________________________

А функцию загрузки из файла я списал из самоучителя.

HolyDel 08.05.2011 14:27

Ответ: DirectX и C++
 
pHero - здесь точно валидные данные?

s16s 08.05.2011 14:32

Ответ: DirectX и C++
 
Да. Это вот этот тип LPDIRECTDRAWSURFACE7

s16s 09.05.2011 14:46

Ответ: DirectX и C++
 
Проблема как оказалось не в коде. Я сохранил картинку с сжатием, и в результате отображение происходило с глюками.

s16s 09.05.2011 23:26

Ответ: DirectX и C++
 
Вроде разобрался с DirectDraw. Но теперь проблема в DirectInput.

На строчке lpdikey->SetDataFormat(&c_dfDIKeyboard); выдаёт вот такую ошибку на стадии сборки:

dinput.lib(dilib2.obj) : fatal error LNK1103 : debugging information corrupt; recompile module Error executing link.exe.

Кто нибудь помогите.

s16s 10.05.2011 21:26

Ответ: DirectX и C++
 
Ну, сам спрашиваю, сам и ответы ищу.

Проблема была в том, что в папке было две либы: dinput.lib и dinput8.lib.
Компилятор ругался на dinput.lib, и я переместил эту либу из папки. Почему-то это помогло.

616}[aKeP 15.05.2011 21:13

Ответ: DirectX и C++
 
Люди помогите, проблемка. Не могу понять почему, когда задаю значения цвета материала в DirectX, он принемает значения и округляет их, тоесть я не могу задать цвет.

l.Diffuse.r=1.0f;
l.Diffuse.g=1.0f;
l.Diffuse.b=1.0f;

l.Ambient.r=0.4f;
l.Ambient.g=0.5f;
l.Ambient.b=0.0f;

Получаеться та часть объекта, что не освещается, ярко желтого цвета, как будто я задал значения.

l.Ambient.r=1.0f;
l.Ambient.g=1.0f;
l.Ambient.b=0.0f;


Кто знает в чем проблема?

Reizel 18.05.2011 13:36

Ответ: DirectX и C++
 
Вложений: 1
Создаю куб. Делаю вершинный буфер, в котором 8 вершин. ПОтом индексный буфер, в нем все 12 треугольников.
Куб рисуется верно, но при вращении наблюдается фэйл (exe в аттаче)
Автор самоучителя создавал для каждой стороны куба по 4 вершины, а я решил сэкономить.

Кто знает, в чем фэйл?

Nex 18.05.2011 13:41

Ответ: DirectX и C++
 
Цитата:

а я решил сэкономить
Видимо в этом. Наверно где то не разобрался и не учел отсутствие 4 вершин...

falcon 18.05.2011 13:53

Ответ: DirectX и C++
 
если я прально понял "фэйл", то проблема в неправильном обходе вершин.
правь индексный буфер.

p.s. если у тебя 4 вершины, то потом, когда у каждой вершины будет ещё и нормаль, увидишь ещё один занимательный "фэйл".

HolyDel 18.05.2011 17:56

Ответ: DirectX и C++
 
Цитата:

Кто знает, в чем фэйл?
в Z-тесте ясен пень! точнее в его отсутсвии

Цитата:

SetRenderState(D3DRS_ZENABLE ,D3DZB_TRUE);
SetRenderState(D3DRS_ZWRITEENABLE ,true);
и да - на вершинах не экономь
пойдут нормали и текстурные координаты и придет твоей экономии фейлец.

616}[aKeP 18.05.2011 19:00

Ответ: DirectX и C++
 
А про маю проблемку кто-нибудь, что-нибудь знает!

HolyDel 18.05.2011 20:20

Ответ: DirectX и C++
 
616}[aKeP ну ты же ничего не сказал. надо код показать или ексешник хотя-бы
шейдеры там которыми рисуешь
или там настройки материала еще

может ты геометрию с аддиативны блендингом 15 разв одно место рисуешь?

Reizel 19.05.2011 10:29

Ответ: DirectX и C++
 
C кубом разобрался. Дело оказалось в отсутствии Z-буфера, отсечения и согласованности вершин (или сторон?).
Теперь другой вопрос.
У меня 2 куба. Один позади другого. Камера вращается вокруг них. Если вызывать 2 раза DrawPrimitive, они будут рисоваться поверх друг друга, или при определенных обстоятельствах задний будет перекрывать передний?

Mr_F_ 19.05.2011 14:02

Ответ: DirectX и C++
 
ну zbuffer и нужен чтобы осуществлять проверку находится ли глубина рисуемого пикселя за глубиной уже отрисованных, если да, то не рисуется, если нет, то рисуется.
2 куба правильно загородят друг друга как их не рисуй.
правда лучше рисовать сначала передний, т.к. на пиксели, которые загородятся им у заднего, не надо будет считать шейдер/делать выборки.
такая сортировка может давать нехилый прирост, я рендерил лес когда - без сортировки было около 8 фпс (сотни тысяч деревьев), с сортировкой - 40.
а если объекты должны быть полупрозрачными то их по-любому придётся сортировать наоборот от задних к передним.

Reizel 19.05.2011 14:36

Ответ: DirectX и C++
 
Ок, ясно :) Я ранее не понимал что такое Z-буфер, falcon и ты, Mr_F_, объяснили :)

616}[aKeP 24.05.2011 19:46

Ответ: DirectX и C++
 
И опять здрасте, захотел тут узнать, как можно перенести мышь в определеные координаты с помощью DirectInput, ну или
WinApi?

HolyDel 24.05.2011 20:11

Ответ: DirectX и C++
 
SetCursorPos(x,y); (WinAPI)

616}[aKeP 07.06.2011 02:42

Ответ: DirectX и C++
 
HolyDel, пасибо!
))

Еще пара вопросиков:
1) Можно ли выводить через спрайт, не квадратную картинку, так чтобы она не преобразовывалась в квадрат?

2) Есть ли какая-нибудь документация на русском о скелетной анимации?

HolyDel 07.06.2011 13:36

Ответ: DirectX и C++
 
1) да - альфаблендинг (альфатест?)
2) да - http://www.google.com/search?q=%26%2...0directx%20c++

хотя если не C++ а делфи
и не directx а opengl
то вот хорошая статья про анимацию вообще: http://xproger.mentalx.org/archives/58

616}[aKeP 08.06.2011 00:04

Ответ: DirectX и C++
 
Пасибо,а как альфаблендинг использовать, всмысле применительно к спрайтам. Создавать квадратную картинку и делать ненужную часть прозрачной? Но это же не практично, и лишняя инфа в картинке?

HolyDel 08.06.2011 01:07

Ответ: DirectX и C++
 
это очень практично
намного практичнее чем выводить все ето треугольниками
хотя можешь посотреть в сторону тесселятора, да.

616}[aKeP 12.06.2011 00:34

Ответ: DirectX и C++
 
Здравствуйте, есть проблемка, опять))
Как создать динамичный массив текстур в Direct3D?

Ругаеться на то, что IDirect3DTexture9 - абстрактный класс.
pTexturesList=new IDirect3DTexture9*[CountMaterials];

616}[aKeP 20.07.2011 01:50

Ответ: DirectX и C++
 
Вложений: 1
Люди, кто сталкивался с проблемой, спрайты выводяться не по размеру! Окно размером 800 на 600, а картинку такого же размера выводит только четверть(растягивает раза в 2 точно)! (((
Прикладываю файл, вам он не че не скажет там нет ядра на котором писал!))

falcon 20.07.2011 17:00

Ответ: DirectX и C++
 
>>Прикладываю файл, вам он не че не скажет там нет ядра на котором писал!))

очень информативно, да.
отвечу так же информативно - где-то там у тебя косяк.

Mhyhr 20.07.2011 21:42

Ответ: DirectX и C++
 
Цитата:

Сообщение от 616}[aKeP (Сообщение 196240)
Люди, кто сталкивался с проблемой, спрайты выводяться не по размеру! Окно размером 800 на 600, а картинку такого же размера выводит только четверть(растягивает раза в 2 точно)! (((
Прикладываю файл, вам он не че не скажет там нет ядра на котором писал!))

[экстрасенс] Люк! Спрайт изначально квадратный, необходимо скорректировать размер, и да помогут матрицы! Например:
PHP код:

D3DXMATRIX ScaleMatrix;
D3DXMatrixScaling(&ScaleMatrix,размер_картинки_по_х,размер_по_y,1.0f);

// Далее пихаешь это всё в матрицу вида, и задаешь её спрайту. 

Возможно у тебя косяк с проекциями
[/экстрасенс]

616}[aKeP 21.07.2011 20:27

Ответ: DirectX и C++
 
Люди извиняюсь за последнее сообщение, но просто писать отдельно программу на чистом директе без своего ядра мне было лень, а ядро я пока плохо организовал и выкладывать стыдно было, так что еще раз извиняюсь.

Я решил ту проблему. Оказывается текстура для объекта спрайта должна быть с квадратной и с разрешением кратным степени двойки, а у меня размеры 800 600)))

616}[aKeP 27.07.2011 04:20

Ответ: DirectX и C++
 
Вложений: 2
А вот опять и я, и у меня опять проблема! :(

Хочу воспроизвести звук написал программу на DirectSound, но ругается на поключаемый заголовочный файл dsound.h, мол в нем ошибка. В другой программе, которая работает подключил его же и выдает ошибки в файле dsound.h, причем ругается только на одну структуру. Кто знает в чем проблема?


Вот скрины ошибок:

HolyDel 27.07.2011 10:33

Ответ: DirectX и C++
 
Код:

typedef unsigned long DWORD_PTR;
#include "dsound.h"

хотя скорее всего правильнее будет подключать не dsound.h а какой нибудь более общий хидер.

Mhyhr 27.07.2011 11:06

Ответ: DirectX и C++
 
На всякий случай, dsound.lib подключил?

616}[aKeP 27.07.2011 15:18

Ответ: DirectX и C++
 
Переопределил DWORD_PTR все скомпилировалось. Вопрос, а почему в dsound этот тип не переопределен или какой хедер мне поключить, чтоб не надо было самому переопределять?

616}[aKeP 06.08.2011 17:25

Ответ: DirectX и C++
 
Люди, а как сделать, что бы 3д объект был сглаженым, как стандартная сфера? Ведь она не такая гладкая и ровная. Я создал поверхность 20 на 20 точек и мне нужно, что бы поверхность была сглаженой.

616}[aKeP 07.08.2011 19:40

Ответ: DirectX и C++
 
Все, ура!! Разобралься сам. Весь инет облазил. Оказывается, чтобы добиться эффекта сглажености, надо нормали высчитывать, как среднее арефметическое от нормалей смежных поверхностей.

616}[aKeP 13.08.2011 16:01

Ответ: DirectX и C++
 
А вот и я, опять с проблемой, а точнее с вопросом и не с одним, а с несколькими.
1)Я хочу использовать прозрачность, включаю альфа смешивание, а оно происходит без учета z буфера. Тоесть за прозрачной сферой отрисовываютяся только те объекты, которые были уже отрисованы до сферы. Вопрос, как сделать если это возможно, чтобы буффер глубины учитывался при смешивании?

2)Кто-нибудь знает, где можно найти статьи по кубическим отражения и использовании IDirect3DCubeTexture, для реализации зеркала например?

3)И третий вопрось, можно ли сделать bump эффект не используя шэйдеры и если да то как?

Mr_F_ 13.08.2011 16:27

Ответ: DirectX и C++
 
Цитата:

Вопрос, как сделать если это возможно, чтобы буффер глубины учитывался при смешивании?
альфа объекты надо рисовать, когда уже были отрисованы те, что сзади них.
Цитата:

2)Кто-нибудь знает, где можно найти статьи по кубическим отражения и использовании IDirect3DCubeTexture, для реализации зеркала например?
можешь хоть на блице посмотреть примеры использования кубмапов. работа конкретно с IDirect3DCubeTexture тривиальна, можешь глянуть хелп сдк.
Цитата:

3)И третий вопрось, можно ли сделать bump эффект не используя шэйдеры и если да то как?
лучше сказать, что нельзя, т.к. безшейдерные бампы выглядит убого.

HolyDel 13.08.2011 16:50

Ответ: DirectX и C++
 
1)
Цитата:

device->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
device->SetRenderState(D3DRS_ZWRITEENABLE, FALSE);
device->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL);
для сферы. и полупрозрачные объекты надо рисовать после непрозрачных в порядке от дальних к ближним.

2)
Код:


LPDIRECT3DCUBETEXTURE9 CubeMap;

m_d3dDevice->CreateCubeTexture(8192, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R8G8B8,        D3DPOOL_DEFAULT, &CubeMap);

....
...
CubeMap->GetCubeMapSurface(D3DCUBEMAP_FACE_POSITIVE_X, 0, &pRenderSurface);
device->SetRenderTarget(0,pRenderSurface);

  device->Clear(0,
                          NULL,
                          D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                          D3DCOLOR_XRGB(0,0,0),
                          1.0f,
                          0);
  device->BeginScene();

и так 6 раз.
меняешь взгляд камеры и D3DCUBEMAP_FACE_POSITIVE_X

3)да.
Код:

device->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_DOTPRODUCT3 );
device->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
device->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_NORMCUBEMAP );

и можешь третьим слоем еще наложить диффузмапу.

616}[aKeP 13.08.2011 17:23

Ответ: DirectX и C++
 
Спасибо большое!
Я знаю как писать в кубическую текстуру. Но как накладывать, как обычную текстуру или есть различия?

И еще, как сделать несколько проходов для одного уровня тукстур:

device->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_DOTPRODUCT3 );
device->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
device->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_NORMCUBEMAP );


device->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
device->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
device->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TETXURE);


Я правильно понимаю?

FireOwl 13.05.2012 05:46

Ответ: DirectX и C++
 
Что означает вот такое сообщение:
"Указанной команде требуется псевдоним либо имя файла, драйвера или устройства. Задайте его."
(Английский вариант звучит, насколько я понял, так:
"The specified command requires an alias, file, driver, or device name. Please supply one.")

Возникает оно при попытке вызова
mciExecute('play C:\\Windows\\Media\\flourish.mid')
из winmm.dll

Процесс гугления результатов не принес.

Mr_F_ 13.05.2012 12:34

Ответ: DirectX и C++
 
Цитата:

mciExecute('play C:\\Windows\\Media\\flourish.mid')
как это связано с DX? o_0 где ты это вообще обнаружил?
и с чего это тут кавычки не двойные?

FireOwl 13.05.2012 14:20

Ответ: DirectX и C++
 
Да, с DirectX не связано. Прошу скинуть в отдельную тему, если возможно.

Обнаружил при попытке проиграть MIDI не заморачиваясь с дополнительными библиотеками, средствами самого Windows.
Кавычки одиночные потому что Python (можно и двойные, разницы нет). Но темы по Python нет, а вызов системных dll в C++ также примерно происходит.

Полный код был такой:
PHP код:

import ctypestime
ctypes
.windll.winmm.mciExecute('play C:\\Windows\\Media\\flourish.mid')
time.sleep(10)
ctypes.windll.winmm.mciExecute('close C:\\Windows\\Media\\flourish.mid'



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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot