Aktuelle Zeit: 19.05.2024, 21:16

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 
Autor Nachricht
 Betreff des Beitrags: Texture-Splatting Problem
BeitragVerfasst: 10.01.2010, 19:53 
Offline

Registriert: 01.01.2010, 17:18
Beiträge: 11
Hallo,
ich versuche momentan einen Texture-Splatting-Effekt zu realisieren.
Hierzu übersetzte ich ein Example in BlitzMax (GMan-Wrapper).

Ein bisschen klappt das ganze auch, jedoch ist mein Problem, dass scheinbar die "echten" Texturekoordinaten von den Texturen nichtmehr beachtet werden. Das heißt, dass zwar ein Muster von verschiedenen Farben entsteht, allerdings scheinen die Farben nur aus dem ersten oberem Pixel der Texture zu entstehen:
Bild

Mein Sourcecode:

Code:
SuperStrict
Framework irrlicht.core
Import brl.basic
Import brl.retro
Import brl.timer

Global device:IrrlichtDevice =   IrrlichtDevice.Create(EDT_DIRECT3D9, _DIMENSION2DI(800, 600), 16, False, False, False, Null)

Global driver:IVideoDriver = device.getVideoDriver()
Global smgr:ISceneManager = device.getSceneManager()
Global guienv:IGUIEnvironment = device.getGUIEnvironment()
Global gpu:IGPUProgrammingServices = driver.getGPUProgrammingServices()


Global lig:ILightSceneNode   = smgr.addlightscenenode()
Global cube:ISceneNode       = smgr.addcubescenenode()
Global cam:ICameraSceneNode  = smgr.addcamerascenenode()
Global UseHighLevelShaders:Int = False

cam.setposition(_vector3df(0,0,-13))
lig.setposition(_vector3df(0,0,-100))

Local tex1:itexture = driver.getTexture("Sample.jpg")
Local tex2:itexture = driver.getTexture("sandstone.jpg")
Local tex3:itexture = driver.getTexture("grass_1.jpg")
Local tex4:itexture = driver.getTexture("SANDSHOR.JPG")


Local call:IShaderConstantSetCallBack =  IShaderConstantSetCallBack.Create(ShaderCallback.generate)

'load shader
Local shader:Int = gpu.addHighLevelShaderMaterialFromFiles("Dx_Shader.hlsl","vs_main",EVST_VS_2_0,..
                                                           "Dx_Shader.hlsl","ps_main",EPST_PS_2_0,call,EMT_DETAIL_MAP)

cube.setMaterialTexture(0,tex1)
cube.setMaterialTexture(1,tex2)
cube.setMaterialTexture(2,tex3)
cube.setMaterialTexture(3,tex4)

cube.setMaterialType(shader)


Repeat
   driver.beginScene(True,True,_SCOLOR(255,0,0,0))
   smgr.drawAll()   
   guienv.drawAll()
   driver.endScene()
Until device.run() = 0


'Callback-Class

Type ShaderCallback Extends IShaderConstantSetCallBack
  Method OnSetConstants(services:IMaterialRendererServices,userdata:Int)
     Local drv:IVideoDriver = services.getVideoDriver()
     Local worldViewProj:matrix4
     worldViewProj =                    drv.getTransform(ETS_PROJECTION)
     worldViewProj = worldViewProj.mult(drv.getTransform(ETS_VIEW))
     worldViewProj = worldViewProj.mult(drv.getTransform(ETS_WORLD))

     services.setVertexShaderConstantFromName("matViewProjection",worldViewProj.pointer(),16)
  EndMethod

  Function generate:IShaderConstantSetCallBack()
    Return New ShaderCallBack
  EndFunction
EndType


Shader (HLSL):
Code:
float4x4 matViewProjection : ViewProjection;

sampler AlphaMap = sampler_state
{
   ADDRESSU = WRAP;
   ADDRESSV = WRAP;
   ADDRESSW = WRAP;
};

sampler TextureOne = sampler_state
{
   MipFilter = LINEAR;
   MinFilter = LINEAR;
   MagFilter = LINEAR;
   ADDRESSU = WRAP;
   ADDRESSV = WRAP;
   ADDRESSW = WRAP;
};

sampler TextureTwo = sampler_state
{
   MipFilter = LINEAR;
   MinFilter = LINEAR;
   MagFilter = LINEAR;
   ADDRESSU = WRAP;
   ADDRESSV = WRAP;
   ADDRESSW = WRAP;
};

sampler TextureThree = sampler_state
{
   MipFilter = LINEAR;
   MinFilter = LINEAR;
   MagFilter = LINEAR;
   ADDRESSU = WRAP;
   ADDRESSV = WRAP;
   ADDRESSW = WRAP;
};

struct VS_INPUT
{
   float4 Position : POSITION0;
   float2 alphamap : TEXCOORD0;
   float2 tex : TEXCOORD1;
};

struct VS_OUTPUT
{
   float4 Position : POSITION0;
   float2 alphamap : TEXCOORD0;
   float2 tex : TEXCOORD1;
};

struct PS_OUTPUT
{
   float4 diffuse : COLOR0;
};

VS_OUTPUT vs_main( VS_INPUT Input )
{
   VS_OUTPUT Output;
   Output.Position = mul( Input.Position, matViewProjection );
   Output.alphamap = Input.alphamap;
   Output.tex = Input.tex;

   return( Output );
}

PS_OUTPUT ps_main(in VS_OUTPUT input)
{
   float texScale = 1.0;    
   PS_OUTPUT output = (PS_OUTPUT)0;

   vector a = tex2D(AlphaMap, input.alphamap);
   vector i = tex2D(TextureOne, mul(input.tex, texScale));
   vector j = tex2D(TextureTwo, mul(input.tex, texScale));
   vector k = tex2D(TextureThree, mul(input.tex, texScale));

   float4 oneminusx = 1.0 - a.x;
   float4 oneminusy = 1.0 - a.y;
   float4 oneminusz = 1.0 - a.z;

   vector l = a.x * i + oneminusx * i;
   vector m = a.y * j + oneminusy * l;
   vector n = a.z * k + oneminusz * m;

   output.diffuse = n;

   return output;
}

technique Default_DirectX_Effect
{
   pass Pass_0
   {
      VertexShader = compile vs_2_0 vs_main();
      PixelShader = compile ps_2_0 ps_main();
   }
}



Sample.jpg ist die Colormap, die bestimmt, welche Texture angezeigt werden soll...Wenn ich den Shader nicht aktiviere und die Colormap weglasse werden die Texturen komischerweise richtig draufgelegt :S

Auch das skallieren der Texturen bringt nichts.


Hat irgendjemand eine Idee? :-)

Vielen Dank im Voraus!

Gruß
Bastian


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de