[DX9, HLSL]
Verfasst: 02.04.2009, 16:17
Hi,
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:
Fogendes Problem tritt auf: bei einem Objekt mit einer einzigen Textur und einem BumpMap funktiont alles sehr gut. Wenn das Objekt aber mehrere Texturen hat, wird die aller erste auf alle Elemente des Objektes angewendet, die anderen werden nicht angezeigt.
Hier der Code für die Renderroutine:
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
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