Исправьте пожалуйста код для Загрузки шейдеров
Morglod Дата: Суббота, 02 Апреля 2011, 13:54 | Сообщение # 1
Вечно пилящий двиг
Сейчас нет на сайте
вот вобщем проблема такая, вот код функции загрузки шейдера
//Загрузка vertex шейдера из файла
int LoadVertexShader(IDirect3DDevice9 *pVideocard,//загрузка шейдера и возвращение id
LPCWSTR Filename,
D3DVERTEXELEMENT9 *pElements,
IDirect3DVertexDeclaration9 **ppDecl)
{
//проверка ошибки
if(!Shaders[Shaders_loaded].vertexShader)
{
MessageBox(NULL, L"123", L"ERROR", NULL);
return E_FAIL;
}
if(!pVideocard) { MessageBox(NULL, L"Указанно неверное устройство рендера при загрузке шейдера", L"ERROR", NULL); return E_FAIL; }
if(!Filename) { MessageBox(NULL, L"Указан неверный или неправельный путь к шейдеру", L"ERROR", NULL); return E_FAIL; } //Загрузить и транслировать шейдер ID3DXBuffer *pCode; if(FAILED(D3DXAssembleShaderFromFile(Filename, NULL, NULL, 0, &pCode, NULL))) { MessageBox(NULL, L"Ошибка трансляции шейдера", L"ERROR", NULL); return E_FAIL; } if(FAILED(pVideocard->CreateVertexShader( (DWORD*)pCode->GetBufferPointer(), &Shaders[Shaders_loaded].vertexShader))) { MessageBox(NULL, L"Ошибка создания шейдера", L"ERROR", NULL); return E_FAIL; } pCode->Release(); //Создать интерфейс объявления, если необходимо if(pElements && ppDecl) pVideocard->CreateVertexDeclaration(pElements, ppDecl); //Возвратить успех Shaders_loaded++;
return Shaders_loaded -1; }
вот сам шейдер (который в фале vertexShader.vsh) именно его и загружает прога с помощью функции выше
// Vertex shader input structure
struct VS_INPUT
{
float4 Position : POSITION;
float2 Texture : TEXCOORD0;
};
// Vertex shader output structure struct VS_OUTPUT { float4 Position : POSITION; float2 Texture : TEXCOORD0; };
// Global variables float4x4 WorldViewProj;
// Name: Simple Vertex Shader // Type: Vertex shader // Desc: Vertex transformation and texture coord pass-through // VS_OUTPUT vs_main( in VS_INPUT In ) { VS_OUTPUT Out; //create an output vertex
Out.Position = mul(In.Position, WorldViewProj); //apply vertex transformation Out.Texture = In.Texture; //copy original texcoords
return Out; //return output vertex }
прабл в том что прога выдает ошибку "123" которая написана в функции
хелп
Добавлено (02.04.2011, 13:54) --------------------------------------------- или его надо компилировать? (в проге)
вначале был #include
Pesets Дата: Суббота, 02 Апреля 2011, 15:55 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
хм... а переменная Shaders - это у тебя что такое? Quote
//проверка ошибки if(!Shaders[Shaders_loaded].vertexShader)
Предположительно, здесь надо писать Shaders[Shaders_loaded - 1], если Shaders_loaded - это количество загруженных шейдеров.
Morglod Дата: Суббота, 02 Апреля 2011, 16:46 | Сообщение # 3
Вечно пилящий двиг
Сейчас нет на сайте
int Shaders_loaded = 0; //по умолчанию class Shader { public: IDirect3DVertexShader9 *vertexShader; IDirect3DPixelShader9 *pixelShader; IDirect3DVertexDeclaration9 *decl; };
Добавлено (02.04.2011, 16:46) --------------------------------------------- вот как класс инициализирован
Shader Shaders[50];
вначале был #include
Pesets Дата: Суббота, 02 Апреля 2011, 17:31 | Сообщение # 4
постоянный участник
Сейчас нет на сайте
если я правильно понял, код такой: Code
class Shader{ //ну, далее то, что ты написал }; Shader Shaders[50]; //находится в статической памяти int LoadVertexShader(...) { //проверка ошибки if(!Shaders[Shaders_loaded].vertexShader) { MessageBox(NULL, L"123", L"ERROR", NULL); return E_FAIL; } ....
Тогда при первом вызове функции условие
Code
!Shaders[0].vertexShader
будет выполняться всегда, тк статическая память при старте процесса обнуляется (те массив Shaders будет заполнен нулями).
Morglod Дата: Суббота, 02 Апреля 2011, 18:23 | Сообщение # 5
Вечно пилящий двиг
Сейчас нет на сайте
ааа, тоесть надо убрать эту фигню?Добавлено (02.04.2011, 18:21) --------------------------------------------- если это убрать то вылезает ошибка в трансляции шейдера (которая в функции написана ) ...
Добавлено (02.04.2011, 18:23) --------------------------------------------- ааа, google мне подсказывает что нужно шейдер откомпилировать... http://www.two-kings.de/tutorials/dxgraphics/dxgraphics18.html попробую, отпишусь
вначале был #include
Pesets Дата: Суббота, 02 Апреля 2011, 18:57 | Сообщение # 6
постоянный участник
Сейчас нет на сайте
Так, это уже следующая проблема) Я не очень хорошо знаком с DX API (предпочитаю более высокоуровневые библиотеки), поэтому сказать точно, упустил ты что-то или нет, я не могу. Советую в D3DXAssembleShaderFromFile передать в последний параметр какой-нибудь буффер и посмотреть, что он в него напишет. Да, и Code
VS_OUTPUT vs_main( in VS_INPUT In )
Вот это строчка мне не нравится... Опять же, я не мастак в hlsl, но разве объявление переменных там не "Си-стайл"?
Morglod Дата: Суббота, 02 Апреля 2011, 19:24 | Сообщение # 7
Вечно пилящий двиг
Сейчас нет на сайте
Вобщем вместо AssebleShader переписал как в статье (которую я выше выложил)
Code
//Загрузка vertex шейдера из файла int LoadVertexShader(IDirect3DDevice9 *pVideocard,//загрузка шейдера и возвращение id LPCWSTR Filename, int ShaderID) { //set up Vertex Shader (NEW) D3DVERTEXELEMENT9 decl[] = {{0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0}, {0, 12, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0}, D3DDECL_END()}; pVideocard->CreateVertexDeclaration(decl, &Shaders[ShaderID].decl); HRESULT result; ID3DXBuffer *code = NULL; result = D3DXCompileShaderFromFile(Filename, //filepath NULL, //macro's NULL, //includes "vs_main", //main function "vs_1_1", //shader profile 0, //flags &code, //compiled operations NULL, //errors &Shaders[ShaderID].constantTable); //constants if(FAILED(result)) MessageBox(NULL, L"Invalid vertex shader code", L"Error", MB_OK); pVideocard->CreateVertexShader((DWORD*)code->GetBufferPointer(), &Shaders[ShaderID].vertexShader); code->Release(); //Возвратить успех Shaders_loaded++; return Shaders_loaded -1; } //Загрузка pixel шейдера из файла int LoadPixelShader(IDirect3DDevice9 *pVideocard,//загрузка шейдера и возвращение id LPCWSTR Filename, int ShaderID) { HRESULT result; ID3DXBuffer *code = NULL; //set up Pixel Shader (NEW) result = D3DXCompileShaderFromFile(Filename, //filepath NULL, //macro's NULL, //includes "ps_main", //main function "ps_1_1", //shader profile 0, //flags &code, //compiled operations NULL, //errors NULL); //constants if(FAILED(result)) MessageBox(NULL, L"Invalid pixel shader code", L"Error", MB_OK); pVideocard->CreatePixelShader((DWORD*)code->GetBufferPointer(), &Shaders[ShaderID].pixelShader); code->Release(); //Возвратить успех Shaders_loaded++; return Shaders_loaded -1; }
вот вызов:
Code
LoadVertexShader(pVideocard, L"vertexShader.vsh", 0); LoadPixelShader(pVideocard, L"pixelShader.psh", 0); Materials[1].ShaderID = 0; Materials[1].UseVertexShaders = true; Materials[1].UsePixelShaders = true;
теперь выдает ошибку Invalid pixel shader code, а если pixel shader не использовать то получается черный экран)
Добавлено (02.04.2011, 19:24) --------------------------------------------- а, нет не черный экран, видно только объект без шейдеров
вначале был #include
Pesets Дата: Суббота, 02 Апреля 2011, 19:43 | Сообщение # 8
постоянный участник
Сейчас нет на сайте
Quote (Pesets )
Советую в D3DXAssembleShaderFromFile передать в последний параметр какой-нибудь буффер и посмотреть, что он в него напишет.
Ну, в данном случае в D3DXCompileShaderFromFile, но все равно советую) Quote (Morglod )
Invalid pixel shader code
Код в студию. Quote (Morglod )
видно только объект без шейдеров
Уверен?Добавлено (02.04.2011, 19:43) --------------------------------------------- Кстати да, доверять статьям в интернетах я не советую, ибо пишутся они черти-кем и черти-как. Лучше купи книжку или читай msdn.
Morglod Дата: Суббота, 02 Апреля 2011, 20:06 | Сообщение # 9
Вечно пилящий двиг
Сейчас нет на сайте
Code
struct PS_INPUT { float4 Position : POSITION; float2 Texture : TEXCOORD0; }; // Pixel shader output structure struct PS_OUTPUT { float4 Color : COLOR0; }; // Global variables sampler2D Tex0; // Name: Simple Pixel Shader // Type: Pixel shader // Desc: Fetch texture and blend with constant color // PS_OUTPUT ps_main( in PS_INPUT In ) { PS_OUTPUT Out; //create an output pixel Out.Color = tex2D(Tex0, In.Texture); //do a texture lookup Out.Color *= float4(0.9f, 0.8f, 0.4, 1); //do a simple effect return Out; //return output pixel }
с буффуром морока будет, у меня все через ж*пу сделано ...
вначале был #include
Pesets Дата: Суббота, 02 Апреля 2011, 20:35 | Сообщение # 10
постоянный участник
Сейчас нет на сайте
Проблема в том, что я не писал шейдеров уже года полтора, соответственно, нужного инструментария на машине нет, а навскидку ничего в голову не приходит. С виду, код нормальный... вроде Тем более, я никогда не пользовался низкоуровневыми функциями для загрузки шейдеров, я грузил сразу .fx файл. Там проще. Quote (Morglod )
с буффуром морока будет, у меня все через ж*пу сделано ...
две строчки кода. Вообще, возьми за правило парсить все возможные ошибки. Это во-первых, хороший стиль, а во-вторых, сэкономит кучу времени на отладке. Ну, и отладчиком пользоваться надо уметь. Все же не удаленное приложение тестишь) Хм, да, попробуй еще версию шейдеров 2.0 выставить, мб поможет, мало ли)
Morglod Дата: Суббота, 02 Апреля 2011, 20:57 | Сообщение # 11
Вечно пилящий двиг
Сейчас нет на сайте
Quote (Pesets )
попробуй еще версию шейдеров 2.0 выставить
ха! работает... только я не знаю что шейдер должен делать, но в результате все желтоватого оттенка... Добавлено (02.04.2011, 20:57) --------------------------------------------- еще материалы отключились(или свет) теней нету...
вначале был #include