forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Directx 9 текстурирование объекта несколькими текстурами (http://forum.boolean.name/showthread.php?t=15916)

pozitiffcat 26.11.2011 00:45

Directx 9 текстурирование объекта несколькими текстурами
 
как реализовать сабж.

Device->SetTransform(D3DTS_WORLD, &p);
Device->SetStreamSource(0, VB, 0, sizeof(Vertex));
Device->SetIndices(IB);
Device->SetFVF(Vertex::FVF);
Device->SetTexture(0, _tex0);
Device->DrawIndexedPrimitive .............
Device->SetTexture(0, _tex1);
Device->DrawIndexedPrimitive .............

так??

Mr_F_ 26.11.2011 01:08

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
скорее так

Device->SetTransform(D3DTS_WORLD, &p);
Device->SetStreamSource(0, VB, 0, sizeof(Vertex));
Device->SetIndices(I;
Device->SetFVF(Vertex::FVF);
Device->SetTexture(0, _tex0);
Device->SetTexture(1, _tex1);
Device->DrawIndexedPrimitive .............

а вообще не помню точно, юзаю ID3DXEffect

pozitiffcat 26.11.2011 01:16

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
нет тут не стоит использовать слои текстур, может у меня на один объект состоящий из 100500 граней, нужно наложить 100500 текстур на каждую грань :-D

Mr_F_ 26.11.2011 01:18

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
задача нечётко поставлена, скажи что хочешь сделать %)

pozitiffcat 26.11.2011 01:26

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
Есть объект - 1 меш. В 3d maxe на него назначено много текстур, штук 20. Я загружаю все в один буфер вершин с индексами, и нужно юзать эти текстуры.

Mr_F_ 26.11.2011 01:33

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
т.е. меш в максе состоит из полигонов с разными текстурами? ну да, тогда обычно рендерят кадый кусок отдельным дипом, как вроде ты и написал в первом посте. собственно в blitz3d/xors3d понятие surface и является такой частью меша с одной текстурой, они рендерятся каждый отдельным дипом.

alexprey 26.11.2011 19:13

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
Все правильно делаешь. Сам делаю по такому же принципу, только у меня удобнее все это сделано.

pozitiffcat 27.11.2011 02:38

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
еще вопрос. При написании движка с нуля, изначально построить систему блендинга и освещения на основе шейдеров, и забить на реализацию стандартных DX совских методов, или все же их тоже включить в двиг.
Просто у меня в планах, вообще не реализовывать всякую устаревшую чушь, а сразу делать deferred shading, и колиззии, выбор объектов и т.п. на буллете. Познания в DX пока что ничтожные, и решаю не заострять внимание на неактуальные вещи, а сразу копать в сторону шейдеров

Еще вопросик. Как получить глобальную позицию, поворот, исходя из матрицы?

moka 27.11.2011 03:46

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
Не делай никакой реализации FFP ("всякой старой хрени"), а делай Только шейдеры.
Например сравнительно молодой GLES 2.0 - также не имеет Никакого FFP вообще, и всё на шейдерах, что имхо - очень круто.

alexprey 27.11.2011 04:16

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
>>Как получить глобальную позицию, поворот, исходя из матрицы?
Кури матан =) И поймешь что практически не реально +)

pozitiffcat 27.11.2011 04:30

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
Я пытаюсь изучить DX, что кстати получается, и замутить очень простой двиг для мелких игрушек типа 8bit story на шейдерах полностью, и встроеной физике (буллет, оде, хз еще не выбрал).
охренеть если не реально, тогда как посчитать такую вещь: есть объект на него назначен чилд. чилд смещен на какоето расстояние, объект родитель повернуть, чилд уже имеет другие позиции, как их узнать.

moka 27.11.2011 04:36

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
Цитата:

Сообщение от pozitiffcat (Сообщение 211388)
охренеть если не реально, тогда как посчитать такую вещь: есть объект на него назначен чилд. чилд смещен на какоето расстояние, объект родитель повернуть, чилд уже имеет другие позиции, как их узнать.

Либо ты пересчитываешь матрицы при модификациях оных, либо ты их просчитываешь при каждом рендере.
Позиция чайлда - будет зависеть от его матрицы и матрицы отца.
Перемножаешь матрицу чайлда на матрицу отца - будет результат, который имеет все глобальные данные чайлда.

Я в этом нууб, но про перемножение матриц, верно?

pozitiffcat 27.11.2011 04:39

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
про перемножение да. тоесть при перемножении я получаю новую матрицу, которая означает позицию чилда. Но как же вытащить XYZ
X3025 Global variables are implicitly constant - это сообщение выдает компилятор шейдеров при компиляции шейдера. Что за хрень знает ктонить?
Код:

extern matrix WorldViewMatrix;
extern matrix WorldViewProjMatrix;

extern vector Color;

extern vector LightDirection;

static vector Black = {0.0f, 0.0f, 0.0f, 0.0f};

//
// Структуры
//

struct VS_INPUT
{
    vector position : POSITION;
    vector normal  : NORMAL;
};

struct VS_OUTPUT
{
    vector position : POSITION;
    float2 uvCoords : TEXCOORD;
    vector diffuse  : COLOR;
};

//
// Точка входа
//

VS_OUTPUT Main(VS_INPUT input)
{
    // Обнуляем члены выходной структуры
    VS_OUTPUT output = (VS_OUTPUT)0;

    // Преобразуем местположение вершины в однородное
    // пространство отсечения
    output.position = mul(input.position, WorldViewProjMatrix);

    //
    // Преобразуем вектор света и нормаль в пространство вида.
    // Мы устанавливаем значение компоненты w равным нулю потому что
    // мы преобразуем векторы. Предполагается, что в мировой матрице
    // нет никакого масштабирования.
    //
    LightDirection.w = 0.0f;
    input.normal.w  = 0.0f;
    LightDirection  = mul(LightDirection, WorldViewMatrix);
    input.normal    = mul(input.normal, WorldViewMatrix);

    //
    // Вычисление одномерной координаты текстуры
    // для мультипликационной визуализации
    //
    float u = dot(LightDirection, input.normal);

    //
    // Если u меньше нуля, считаем, что u равно нулю, поскольку
    // отрицательные значения соответствуют углам между вектором света
    // и нормалью большим 90 градусов. А если угол больше 90 градусов,
    // значит поверхность не освещается
    //
    if(u < 0.0f)
          u = 0.0f;

    //
    // Устанавливаем вторую координату текстуры на середину
    //
    float v = 0.5f;
    output.uvCoords.x = u;
    output.uvCoords.y = v;

    // Сохраняем цвет
    output.diffuse = Color;

    return output;
}


Mr_F_ 27.11.2011 05:27

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
Цитата:

построить систему блендинга и освещения на основе шейдеров
блендинг объектов между собой по-прежнему FFPовый обычно везде.

Цитата:

Как получить глобальную позицию, поворот, исходя из матрицы?
ты уверен, что тебе это нужно? скорее всего ты неправильно подошёл к задаче

Цитата:

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

Цитата:

Но как же вытащить XYZ
умножь локальный XYZ на матрицу парента

Цитата:

X3025 Global variables are implicitly constant - это сообщение выдает компилятор шейдеров при компиляции шейдера.
ваще то он строчку показывает, где ошибка

Цитата:

extern matrix WorldViewMatrix;
extern matrix WorldViewProjMatrix;
extern vector Color;
extern vector LightDirection;
static vector Black = {0.0f, 0.0f, 0.0f, 0.0f};
че за вектор и матрикс кстати?
первый раз такое вижу, обычно матрицы объявляют как float4x4, векторы как float3/float4

pozitiffcat 27.11.2011 18:05

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
Охренеть, шейдерами так вообще пол директ икса заменить можно
Цитата:

че за вектор и матрикс кстати?
первый раз такое вижу, обычно матрицы объявляют как float4x4, векторы как float3/float4
в книге так учат, и работает.. я разобрался заюзал d3dxeffect

alexprey 27.11.2011 18:36

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
Кст. Можешь с ними помочь? А то что то уже 3 день голову ломаю и ничего не получается.
http://www.gamedev.ru/code/forum/?id=155120#m3

pozitiffcat 27.11.2011 21:37

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
там при загрузке ты должен указывать errorBuffer, посмотри какую ошибку возвращает.
инфа что ниже работает 100%. Я в своем проекте загружал эффект с релизацией вершинного и пиксельного шейдера и все работало
Код:

HRESULT hr = D3DXCreateEffectFromFileA(
                  globals::device,          // связанное устройство
                  fileName,    // имя исходного файла
                  0,                // нет объявлений препроцессора
                  0,                // нет интерфейса ID3DXInclude
                  D3DXSHADER_DEBUG, // флаги компиляции
                  0,                // параметры не используются совместно
                  &_effect,          // возвращает результат
                  &_errorBuffer);    // возвращает строку с ошибками

        // Выводим любые сообщения об ошибках
        if( _errorBuffer )
        {//если валится тут то ошибка при компиляции
                ::MessageBoxA(0, (char*)_errorBuffer->GetBufferPointer(), 0, 0);
                return false;
        }

        if(FAILED(hr))
        {//если валится тут то файл не нашел
                ::MessageBox(0, L"D3DXCreateEffectFromFile() - FAILED", 0, 0);
                return false;
        }

        return true;

ИМХО но Delphi для DirectX это как для грузчика программирование. Не совместимые вещи. В DX все на указателях, так что юзай C++

alexprey 27.11.2011 22:00

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
Почему все считают что Делфи такой кривой? Это паскаль обрезан. В делфи есть указатели.
В этом вся фишка то что грузится нормально, ошибок не возвращает. Но кол-во проходов почему то все равно возвращает 0

pozitiffcat 27.11.2011 22:15

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
Я считаю что в Делфи сложно работать с указателями в отличие от c++. И твоя проблема как раз в этом и заключается! Тут можно и месяц копаться, а окажется какая нить мелоч связаная с указателем. Там ты передаешь в Begin указатель который не инициализован. Передавай ему ссылку на переменную.
Короче loc: PLongWord; это пустой указатель на неразмеченую память. Ты создай простой integer и в Begin передавай ссылку например
dxFx._Begin(@myint, 0);

pozitiffcat 27.11.2011 22:37

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
Люди, а как в теории организовывается анимация, костная, морфная??? Чето вменяемой инфы понятной мне не нашел.

alexprey 27.11.2011 22:43

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
Код:

dxFx := ((fx as IGetSelf).GetClassObject as TAgeEffect).dxEffect;
    hTech := dxFx.GetTechniqueByName('main');
    if Failed(dxFx.ValidateTechnique(hTech)) then Exit;
    dxFx.SetTechnique(hTech);
    numPasses := 0;
    dxFx._Begin(@numPasses, 0);
    if numPasses > 0 then
      for i := 0 to numPasses-1 do
      begin
        dxFx.BeginPass(i);
        FDevice.DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,FFacesCount*3,indexOffset,FFacesCount);
      end;
    dxFx._End;

Забавный факт, но это возвращает 1. То есть функция ничего не делает с этой переменной.

pozitiffcat 27.11.2011 23:03

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
Цитата:

Сообщение от alexprey (Сообщение 211448)
Код:

dxFx := ((fx as IGetSelf).GetClassObject as TAgeEffect).dxEffect;
    hTech := dxFx.GetTechniqueByName('main');
    if Failed(dxFx.ValidateTechnique(hTech)) then Exit;
    dxFx.SetTechnique(hTech);
    numPasses := 0;
    dxFx._Begin(@numPasses, 0);
    if numPasses > 0 then
      for i := 0 to numPasses-1 do
      begin
        dxFx.BeginPass(i);
        FDevice.DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,FFacesCount*3,indexOffset,FFacesCount);
      end;
    dxFx._End;

Забавный факт, но это возвращает 1. То есть функция ничего не делает с этой переменной.

функция в эту переменную возвращает количество проходов.

alexprey 28.11.2011 00:01

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
Да нет. Если зарание переменной присвоить 1, то будет 1, если 2 то 2

HolyDel 28.11.2011 07:58

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
морфная анимация организуется установкой двух буфферов позиций вершин и лерпом по ним в шейдере.
костаная рендерится так:
есть массив матриц (или два кватерниона, но это сложнее) для каждой кости полученный из скелета. есть набор вершин с дополнительными аттрибутами индекса матрицы и ее веса. результирующая позиция складывается из всех трансформаций помноженных на веса.

9-й directx вышел в 2002 году. у него устаревшая архитектура, плохо отражающая архитектуру современных цпу/гпу. ты в 2011 году начал писать двиг. закончишь, хорошо, если к 2014-му. ты понимаешь, что архитектура выбранного тобой гапи к тому времени будет устаревшей как говно мамонта©? ИМХО, кот, если у тебя были проблемы с парсингом b3d, то с двигом будут подавно. Если чисто экспириенса набраться тока. opengl ее еще хуже отражает, правда :) но там есть расширения.

pozitiffcat 28.11.2011 08:02

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
значит directx враппер под Delphi говно.
ЗЫ. В нынешнем dx_sdk, Не Begin, а BeginPass() и End, это говорит о том, что у тебя не то.

pozitiffcat 28.11.2011 08:04

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
Цитата:

Сообщение от HolyDel (Сообщение 211463)
морфная анимация организуется установкой двух буфферов позиций вершин и лерпом по ним в шейдере.
костаная рендерится так:
есть массив матриц (или два кватерниона, но это сложнее) для каждой кости полученный из скелета. есть набор вершин с дополнительными аттрибутами индекса матрицы и ее веса. результирующая позиция складывается из всех трансформаций помноженных на веса.

9-й directx вышел в 2002 году. у него устаревшая архитектура, плохо отражающая архитектуру современных цпу/гпу. ты в 2011 году начал писать двиг. закончишь, хорошо, если к 2014-му. ты понимаешь, что архитектура выбранного тобой гапи к тому времени будет устаревшей как говно мамонта©? ИМХО, кот, если у тебя были проблемы с парсингом b3d, то с двигом будут подавно. Если чисто экспириенса набраться тока.

не ну вычислил я матрицу, как мне вернуть XYZ
PS. Я не буду писать супер мега двиг, так для реализации простеньких казуалок

HolyDel 28.11.2011 08:05

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
XYZ это 12,13,14 элементы матрицы
или 3,7,11, если у тебя column-major.

тока тебе эти XYZ не нужны, тока если для куллинга или пика какого нибудь. множь позицию вершины на матрицу, будь мужиком!

pozitiffcat 28.11.2011 08:07

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
а как мне тогда нарисовать эти вершины, для каждой вершины двигать мировую матрицу чтоли?

HolyDel 28.11.2011 08:14

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
ну я не знаю как там в hlsl
как то так наверное:

Код:

float4x3 mWorldMatrixArray[63] : WORLDMATRIXARRAY;

struct a2v {
  float4 position : POSITION;
  float3 tangent : TANGENT;
  float3 normal : NORMAL;
  float4 blendWeights : BLENDWEIGHT;  //gets the bone weights
  float4 blendIndices : BLENDINDICES; //gets the bone indices
  float2 texCoord : TEXCOORD0;

};

// Get the indices and weights and cast
 
//from a 4D vector to a size 4 array

float weights[4] = (float[4])In.blendWeights;

int4 indexVector = In.blendIndices;

int  boneIndex[4]        = (int[4])indexVector;


// Calculate blended worldposition

worldPos= mul(In.position, bones[boneIndex[0]]) * weights[0];

worldPos+=mul(In.position, bones[boneIndex[1]]) * weights[1];

worldPos+=mul(In.position, bones[boneIndex[2]]) * weights[2];


// The bones should add up to 1 so the last bone weight is 1

// minus all the other weights

float lastweight = 1.0f - weights[0] - weights[1] - weights[2];

worldPos+=mul(In.position, bones[boneIndex[3]]) * lastweight;

еще раз - зачем тебе знать локальные xyz МАТРИЦЫ? вершины у тебя будет двигать шейдер. тыж отказался от ффп? впрочем даже если ты будешь считать позиции вершин на цпу тебе все равно достаточно будет тупо помножить позицию вершины на матрицу. а исходная позиция у тебя хранится в вершинном буфере. а в буфер она попала из файла. а в файл она попала из пакета 3д моделирования. а в пакет моделирования она попала от моделлера. а моделлер взялся от папы с мамой.

alexprey 28.11.2011 12:28

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
кот. если бы ты лучше читал ман то понял бы что используется begin beginpass endpass и end

pozitiffcat 28.11.2011 12:31

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
у меня begin такого вообще нет

alexprey 28.11.2011 19:09

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
Как так то? Даже в книге про это написано
http://www.netlib.narod.ru/library/book0032/ch19_06.htm

pozitiffcat 28.11.2011 19:46

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
Я читал книгу, там устаревший SDK

alexprey 29.11.2011 01:07

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
Ну а как ты тогда грузишь эффект? И применяешь?

pozitiffcat 29.11.2011 09:37

Ответ: Directx 9 текстурирование объекта несколькими текстурами
 
Код:

HRESULT hr = D3DXCreateEffectFromFileA(
                  globals::device,          // связанное устройство
                  fileName,    // имя исходного файла
                  0,                // нет объявлений препроцессора
                  0,                // нет интерфейса ID3DXInclude
                  D3DXSHADER_DEBUG, // флаги компиляции
                  0,                // параметры не используются совместно
                  &_effect,          // возвращает результат
                  &_errorBuffer);    // возвращает строку с ошибками

        // Выводим любые сообщения об ошибках
        if( _errorBuffer )
        {
                ::MessageBoxA(0, (char*)_errorBuffer->GetBufferPointer(), 0, 0);
                return false;
        }

        if(FAILED(hr))
        {
                ::MessageBox(0, L"D3DXCreateEffectFromFile() - FAILED", 0, 0);
                return false;
        }

        return true;

Код:

UINT numPasses = 0;
                effect->Begin(&numPasses, 0);

                // Для каждого прохода визуализации
                for(int i = 0; i < numPasses; i++)
                {
                        // Устанавливаем текущий проход
                        effect->BeginPass(i);       
                       
                                //рисуем объект
                       
                        effect->EndPass();
                        //return true;
                }
                effect->End();



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

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