es geht um fogendes: ich lasse meine Objekte mit Hilfe eines Effektes rendern. In diesem wird gleich beleuchtet und einfaches Bump-Mapping(wenn vorhanden) angewendet.
Diese sieht so aus:
Code: Alles auswählen
//--------------------------
//--- Globals --------------
//--------------------------
float4x4 matWorldViewProj;
float3x3 matRotation;
float4x4 matWorldIT;
float4 negLightDir;
float4 LightAmb;
float4 LightDif;
float4 MatAmb;
float4 MatDif;
float4 MatSpec;
float4 CamView;
float power;
bool bump;
bool noTextures;
texture tex0;
texture tex1;
sampler DiffuseTex = sampler_state
{
texture = (tex0);
MIPFILTER = LINEAR;
MINFILTER = LINEAR;
MAGFILTER = LINEAR;
AddressU = Wrap;
AddressV = Wrap;
};
sampler BumpMapTex = sampler_state
{
texture = (tex1);
MIPFILTER = LINEAR;
MINFILTER = LINEAR;
MAGFILTER = LINEAR;
AddressU = Wrap;
AddressV = Wrap;
};
//--------------------------
//--- Vertex Shader -------
//--------------------------
struct VS_OUTPUT
{
float4 vPos : POSITION;
float2 vTex0 : TEXCOORD0;
float3 vNormal : TEXCOORD1;
float3 vReflect: TEXCOORD2;
};
VS_OUTPUT VS(float4 vPosition : POSITION,
float3 vNormal : NORMAL,
float2 vTexCoord : TEXCOORD0)
{
VS_OUTPUT OUT =(VS_OUTPUT)0;
OUT.vPos = mul(vPosition, matWorldViewProj);
OUT.vNormal = mul(vNormal, matRotation);
OUT.vTex0 = vTexCoord;
//gespiegelte lichtrichtung berechnen
float3 N,L,R,P;
P = (float3) OUT.vPos;
N = normalize(OUT.vNormal);
L = -normalize(negLightDir);
R = (-L+P+N)-P;
OUT.vReflect = R;
return OUT;
}
float4 PS(float2 vTex0 : TEXCOORD0, float3 vNormal : TEXCOORD1, float3 vReflect:TEXCOORD2) : COLOR
{
//locals
float3 N;
float tempDot;
//Normalisieren von vNormal
float3 VVerNorm = normalize(vNormal);
//BumpMap ergreifen
if(bump == true)
{
float4 tn = tex2D(BumpMapTex, vTex0);
//alle normalen berechnen
N.x = 2.0f*tn.r -1.0f;
N.y = 2.0f*tn.g -1.0f;
N.z = 2.0f*tn.b -1.0f;
}
//Punktprodukt und vorher den LichtVector normalisieren
float3 L = (float3)negLightDir;
float3 LNorm = normalize(negLightDir);
//einmal fürs selbstschatten
float tempShade = dot(VVerNorm, LNorm);
//und für das bumpMap
if(bump == true) tempDot = abs(dot(N,LNorm));
else tempDot = 1.0f;
//glanzpunkte berechnen
float3 CamViewNorm;
float3 CV = (float3)CamView;
float3 vRefNorm = normalize(vReflect);
CamViewNorm = normalize(CV);
float dotSpec = abs(dot(vRefNorm, CamViewNorm));
float4 spec = MatSpec*pow(dotSpec, power)*tempShade;
//texturfarbe
float4 TexCol = tex2D(DiffuseTex, vTex0);
if( (noTextures == true))
{
TexCol.r = 1.0f;
TexCol.g = 1.0f;
TexCol.b = 1.0f;
TexCol.a = 1.0f;
}
//alle farben zusammensetzen
return (MatAmb*LightAmb*TexCol)/3.0f+TexCol*MatDif*LightDif*tempDot*tempShade+spec;
}
//---------------------------
//--- Techniken -------------
//---------------------------
technique tec0
{
pass p0
{
//Renderstates
Lighting = False;
CullMode = CCW;
//Vertexshader
VertexShader = compile vs_2_0 VS();
//Pixelshader
PixelShader = compile ps_2_0 PS();
}
}
Hier der Code für die Renderroutine:
Code: Alles auswählen
for(DWORD i = 0; i < m_anzahlMats; i++)
{
//....
if(bumpMap[i])
{
CalcAndCommitBumpMapData(sunlight, materialien[i]);
if( (anz_Tex > 0) && (i < anz_Tex) )
{
if(textures[i])
bumpMapping.GetEffect()->SetTexture("tex0", textures[i]);
}
bumpMapping.GetEffect()->SetTexture("tex1", bumpMap[i]);
//zeichenvorgang
bumpMapping.BeginEffect();
for(DWORD j = 0; j < bumpMapping.GetNumPasses(); j++)
{
bumpMapping.BeginPass(j);
HRESULT hr = mesh->DrawSubset(i);
bumpMapping.EndPass();
}
bumpMapping.EndEffect();
}//ende if(bumpMap[i])
}
In CalcAndCommitBumpMapData(sunlight, materialien); werden alle nötigen Daten an den Effekt gegeben.
Auch die Materialien scheinen sich nich zu ändern.
Hat jemand eine Lösung?
MfG Droven