Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

1

30.01.2011, 13:37

[Shader Hlsl und Irrlicht] Shader funktioniert nicht

Hey all,
ich hab mal wieder ein Problem und zwar, arbeite ich mich gerade in Shader ein und habe auch gleich ein gutes Planet Shader Tutorial gefunden und habe mir auch den Shader kopiert und geschaut ob er erstmal funktioniert. Aber er will einfach nicht funktionieren.

Code von Shader:

HLSL-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
//-----------------------------------------------------------------------------// Global variables//-----------------------------------------------------------------------------
float4x4 wvp : WorldViewProjection;
float4x4 world : World;
float AmbientIntensity = 1;
float4 AmbientColor : AMBIENT = float4(0,0,0,1);
float3 LightDirection : Direction = float3(0,1,1);
float3 CameraPosition : CameraPosition;
texture clMap;
texture glMap;
texture bpMap;
sampler ColorMap = sampler_state
{    Texture = ;  MipFilter = LINEAR;  MinFilter = LINEAR;  MagFilter = LINEAR;};
sampler GlowMap = sampler_state
{    Texture = ;  MipFilter = LINEAR;  MinFilter = LINEAR;  MagFilter = LINEAR;};
sampler BumpMap = sampler_state
{  Texture = ;  MipFilter = LINEAR;  MinFilter = LINEAR;  MagFilter = LINEAR;};

struct VS_IN
{
float4 Position : POSITION;
float2 TexCoord : TEXCOORD0;
float3 Normal : NORMAL;
float3 Tangent : TANGENT;
};
struct VS_OUT
{
float4 Position : POSITION;
float2 TexCoord : TEXCOORD0;
float3 Light : TEXCOORD1;
float3 CamView : TEXCOORD2;
float4 posS : TEXCOORD3;
float3 Normal : TEXCOORD4;
};
struct PS_OUT
{
float4 Color : COLOR;
};

VS_OUT vertexMain(VS_IN input)
{
VS_OUT output = (VS_OUT)0;
output.Position = mul(input.Position,wvp);
float3x3 worldToTangentSpace;
worldToTangentSpace[0] = mul(input.Tangent,world);
worldToTangentSpace[1] = mul(cross(input.Tangent,input.Normal),world);
worldToTangentSpace[2] = mul(input.Normal,world);float4 PosWorld = mul(input.Position,world);
output.Light = mul(worldToTangentSpace,LightDirection);
output.CamView = CameraPosition - mul(input.Position,world);
output.posS = input.Position;output.TexCoord = input.TexCoord;
output.Normal = mul(input.Normal,world);


return output;
}

PS_OUT pixelMain(VS_OUT input)
{
PS_OUT output = (PS_OUT)0;
float3 Normal = (2 * (tex2D(BumpMap,input.TexCoord))) - 1.0;
float3 LightDir = normalize(input.Light);float Diffuse = saturate(dot(LightDir,Normal));
float4 texCol = tex2D(ColorMap,input.TexCoord);
float4 glowCol = tex2D(GlowMap,input.TexCoord);
float4 Ambient = AmbientIntensity * AmbientColor;
float4 glow = glowCol * saturate(1-Diffuse);
texCol *= Diffuse;output.Color =  Ambient + texCol + glow;
return output;
}



das Ergebnis sollte so aussehen ( aber ohne Reflection Map):
http://xna-uk.net/blogs/randomchaos/arch…xture-maps.aspx


Shader Callback:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
virtual void OnSetConstants(video::IMaterialRendererServices* services,s32 userData)
{
video::IVideoDriver* driver = services->getVideoDriver();
core::matrix4 World = driver->getTransform(video::ETS_WORLD);

services->setVertexShaderConstant("world", World.pointer(), 16);
core::matrix4 worldViewProj;worldViewProj = driver->getTransform(video::ETS_PROJECTION);
worldViewProj *= driver->getTransform(video::ETS_VIEW);
worldViewProj *= driver->getTransform(video::ETS_WORLD);
services->setVertexShaderConstant("wvp", worldViewProj.pointer(), 16);
// set camera position
core::vector3df pos = device->getSceneManager()->getActiveCamera()->getPosition();
services->setVertexShaderConstant("CameraPosition", (f32*)(&pos), 3);

}



und so lade ich meine Texturen:

C-/C++-Quelltext

1
2
3
node->setMaterialTexture(0, driver->getTexture("../media/Earth_Diffuse.jpg"));
node->setMaterialTexture(1, driver->getTexture("../media/Earth_Night.jpg"));
node->setMaterialTexture(2, driver->getTexture("../media/Earth_NormalMap.jpg"));



weis einer wo das Problem liegen könnte?

und ich hätte da noch eine Frage nebenbei und zwar, setzt der Shader die Texturen (GlowMap,ColorMap,...) mit dem Sampler automatisch?
wenn ich das in der OnSetConstant funktion mache kommt immer von Irrlicht ein Fehler: "Error setting Float Array for Hlsl Variable" hab schon Themen dazu im Irrlicht Forum gefunden aber da wurde nie eine Lösung gefunden...

Danke schonmal im Voraus.

EDIT: Na toll, beim abschicken seh ich das es Scheiße formatiert ist, bearbeite es, mache überall Return rein und jetzt wurde es wieder so scheiße formatiert....
EDIT2: Na toll, jetzt muss ich bei jeder neuen Zeile 2 Returns reinhauen
EDIT3: sieht schon um einiges besser aus....
EDIT4:

Oben im Shader bei den Sampler "texture = " fehlt bei jedem noch dieses , , , aber das verschwindet immer wenn ich das eintrage...keine ahnung wieso</bpmap>
New Project: Operation CityRacer

Dieser Beitrag wurde bereits 10 mal editiert, zuletzt von »Nexxtron« (30.01.2011, 14:01)


Beiträge: 721

Wohnort: /dev/null

Beruf: Software-Entwickler/Nerd

  • Private Nachricht senden

2

30.01.2011, 14:15

Kannst du mal den Rendering-Code zeigen?

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

3

30.01.2011, 14:28

Main Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
video::IGPUProgrammingServices* gpu = driver->getGPUProgrammingServices();
s32 newMaterialType1 = 0;
if (gpu)
{
MyShaderCallBack* mc = new MyShaderCallBack();
newMaterialType1 = gpu->addHighLevelShaderMaterialFromFiles(vsFileName, "vertexMain", video::EVST_VS_2_0,psFileName, "pixelMain", video::EPST_PS_2_0,mc, video::EMT_SOLID);
mc->drop();
}

scene::ISceneNode* node = smgr->addMeshSceneNode(smgr->getMesh("Sphere.x"));
node->setScale(irr::core::vector3df(8,8,8));
node->setPosition(core::vector3df(0,0,0));
node->setMaterialTexture(0, driver->getTexture("../media/Earth_Diffuse.jpg"));
node->setMaterialTexture(1, driver->getTexture("../media/Earth_Night.jpg"));
node->setMaterialTexture(2, driver->getTexture("../media/Earth_NormalMap.jpg"));
node->setMaterialType((video::E_MATERIAL_TYPE)newMaterialType1);
smgr->addTextSceneNode(gui->getBuiltInFont(),L"PS & VS & EMT_SOLID",video::SColor(255,255,255,255),node);
scene::ISceneNodeAnimator* anim = smgr->createRotationAnimator(core::vector3df(0,0.3f,0));
node->addAnimator(anim);
node->setPosition(irr::core::vector3df(0,100,100));
anim->drop();

driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false);
smgr->addSkyBoxSceneNode(driver->getTexture("../media/irrlicht2_up.jpg"),   
                     driver->getTexture("../media/irrlicht2_dn.jpg"),   
                     driver->getTexture("../media/irrlicht2_lf.jpg"),   
                     driver->getTexture("../media/irrlicht2_rt.jpg"),   
                     driver->getTexture("../media/irrlicht2_ft.jpg"),   
                     driver->getTexture("../media/irrlicht2_bk.jpg"));

driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, true);
scene::ICameraSceneNode* cam = smgr->addCameraSceneNodeFPS();
cam->setPosition(core::vector3df(0,100,100));
cam->setTarget(core::vector3df(0,0,0));
device->getCursorControl()->setVisible(false);

int lastFPS = -1;
while(device->run())
if (device->isWindowActive())
{

driver->beginScene(true, true, video::SColor(255,0,0,0));
smgr->drawAll();driver->endScene();
int fps = driver->getFPS();

}
device->drop();
New Project: Operation CityRacer

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Nexxtron« (30.01.2011, 14:34)


4

30.01.2011, 14:33

Ich würde mir ne eigene Shaderklasse schreiben weil mit irrlicht und Shader ist immer so eine Sache :/
Metal ist keine Musik sondern eine Religion.

Werbeanzeige