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)

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


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

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