заметил что текстура не вызгружается, вот алгоритм:
получаю дескриптор
TextureHandle = Effect->GetAnnotationByName(0,"Textur");
загружаю текстуру из файла
D3DXCreateTextureFromFile(device,"tex1.jpg",&texture1);
устанавливаю текстуру, но почему-то именно здесь ругается
Effect->SetTexture(TextureHandle, texture1);
подскажите пожалуйста что я не так делаю ?
Ребята, кто-нибудь помогите пожалуйста, а то уже неделю не могу с мётвой точки сдвинуться, подскажите хотя бы книгу где побробно описана работа с шейдерами или статью хотя бы??
NEvOl
Чем не устраивает с прошлой страницы?
при запуске объект просто не рисуется,
Вот отрисовка
Effect->SetTechnique(LightingTeh); UINT numPass( 0); Effect->Begin( &numPass, 0); for( int i = 0;i < numPass; i++) { Effect->BeginPass( i); device->SetFVF( D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1); device->SetStreamSource( 0, vBox, 0, sizeof( Vertex)); D3DXMatrixTranslation( &transWall, 0.0f, 0.0f, 0.0f); Effect->SetVector( DiffuseColor, &D3DXVECTOR4( 1,1,1,0.5)); Effect->SetVector( DiffuseIntensity, &D3DXVECTOR4( 1,1,1,0.5)); Effect->SetMatrix( WorldMatrixHandle, &transWall); D3DXMatrixMultiply( &WVJMatrix, &transWall, &matCam); D3DXMatrixMultiply( &WVJMatrix, &WVJMatrix, &matProj); Effect->SetMatrix( WorldViewProjMatrixHandle, &WVJMatrix); Effect->SetTexture( TextureHandle, texture1); if( FAILED( device->DrawPrimitive( D3DPT_TRIANGLELIST,0,10))) return false; Effect->EndPass( ); } Effect->End( );
вот создаю эффект и получаю дискрипторы
D3DXCreateEffectFromFile(device, "effect.txt", NULL, NULL, D3DXSHADER_DEBUG, NULL, &Effect, &errorBuffer); if( errorBuffer) { MessageBox( 0,( char*)errorBuffer->GetBufferPointer( ),0,0); MessageBox( 0,"D3DXCREATEEffectFromFile - failed",0,0); return 0; } WorldMatrixHandle = Effect->GetAnnotationByName( 0,"WorldMatrix"); WorldViewProjMatrixHandle = Effect->GetAnnotationByName( 0,"WorldViewProjMatrix"); DiffuseColor = Effect->GetAnnotationByName( 0,"diffuseColor"); DiffuseIntensity = Effect->GetAnnotationByName( 0,"diffuseIntensity"); LightingTeh = Effect->GetTechniqueByName( "Lighting"); D3DXCreateTextureFromFile( device,"tex1.jpg",&texture1); TextureHandle = Effect->GetParameterByName( 0, "Textur");
сам эффект вот
matrix WorldMatrix; matrix WorldViewProjMatrix; vector Light = {1.0f, 1.0f, 1.0f, 0.0f}; vector diffuseColor; vector diffuseIntensity; texture Textur; sampler Tex = sampler_state { Texture = (Textur); MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = LINEAR; AddressU = Wrap; AddressV = Wrap; }; struct VS_INPUT { vector position : POSITION; float3 normal : NORMAL; float2 uv: TEXCOORD0; }; struct VS_OUTPUT { vector position : POSITION; float3 normal : TEXCOORD0; float2 uv: TEXCOORD1; }; VS_OUTPUT MainVertex( VS_INPUT input) { VS_OUTPUT output; output.position = mul( input.position, WorldViewProjMatrix); output.normal = normalize( mul( input.normal, ( float3x3)WorldMatrix )); output.uv = input.uv; return output; } float4 MainPixel( VS_OUTPUT input) : COLOR { return tex2D( Tex, input.uv ) * diffuseColor * diffuseIntensity * dot( input.normal, normalize( ( float3 ) Light ) ); } technique Lighting { pass p0 { vertexShader = compile vs_2_0 MainVertex( ); pixelshader = compile ps_2_0 MainPixel( ); } }
Мне бы знать где можно прочитать про то как правильно работать с шейдерами, с примерами, желательно от простого к сложному, а то неоткуда информацию брать, самоме уже надоело терроризировать(
NEvOl
Запускаешь DirectX Sample Browser
находишь Tutorial 1 запускаешь...
создаешь свой Tutorial 1 ( пустой ) и начинаешь переписывать только не копи-паста, а ручками! и вникать в эти строки зачем они нужны
если все заработало то переходишь на следующий уровень ищешь Tutorial 2
Удачи!
то что описано в 6-ти tutorial я понимаю, мне с шейдерами надо с нуля..(
NEvOl
Чем не устраивают книги с прошлой страницы?
Я занимаюсь по книге луа и там рассказывается про каркас эффектов. Я оттуда беру примеры, но они не работают в моём коде почему-то или кидаю свои шейдеры в файл эффекта а они не работают, но есл их раскидать отдельно по файлам то тогда работает. Подскажите где можно еще прочитать про каркас эффектов, возможно я что-то упустил но никак не могу понять что?
NEvOl
А оно тебе надо - каркас эффектов? Уродливая достаточно вещь.
-Eugene-
ааа я просто думал что лучше эффектани, ну ладно спасибо)
ребят, подскажите пожалуйста, имеется dds текстура с альфа каналом, и шейдеры освещения, при включении шейдера текстуры выводятся без прозрачности, отключаю шейдер выводятся без освещения, но с прозрачностью(влючается альфасмешивание), это конечно логично, но как мне совместить это дело ? это мне нужно добавить альфа смешивание в шейдер или что ?
NEvOl
В ДХ10+ это все делалось вручную в шейдере, как в ДХ9 - честно, уже не помню.
может кто-нибудь помнит как это делать? пожалуйста подскажите...
NEvOl
код Rendera в студию :)
device->SetVertexShader (DiffuseVertexShader ); device->SetPixelShader ( DiffusePixelShader ); device->SetRenderState( D3DRS_ALPHATESTENABLE, true); device->SetRenderState( D3DRS_ALPHAREF, 128 ); device->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL ); D3DXMatrixTranslation( &bulletWall, 0.0f, 0.0f, 0.0f); device->SetTransform( D3DTS_WORLD, &bulletWall); D3DXMatrixMultiply( &WVJMatrix, &transWall ,&matCam); D3DXMatrixMultiply( &WVJMatrix, &WVJMatrix, &matProj); DiffuseConstTableVertex->SetMatrix( device, WorldViewProjMatrixHandle, &WVJMatrix); DiffuseConstTableVertex->SetMatrix( device, ViewMatrixHandle, &matCam); DiffuseConstTableVertex->SetMatrix( device, WorldMatrixHandle, &transWall); if( FAILED( device->SetTexture( 0,Dira))) return false; for( int j = 0; j < 2993; j += 6) { if( FAILED( device->DrawPrimitive( D3DPT_TRIANGLELIST,72 + j, 2))) return false; } device->SetRenderState( D3DRS_ALPHATESTENABLE, false);
При шейдерах смешивание не работает(
Тема в архиве.