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:

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