Terrain Belichtung D3D9



  • Hallo, bin grad dabei ein billiges BRute-Force-Terrain zu rendern, aber die Belichtung funktioniert gar nicht. Ich hab erstmal die Texturirung rausgenommen, dass man das besser sehen kann. Vielleicht findet ihr ja den Fehler:

    // vertex.struktur
    struct sVerts
    	{
    		meVector3 pos;
    		meVector3 normal;
    		D3DCOLOR diffuse;
    		float u1, v1;
    	};
    
    	static const DWORD FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1 | D3DFVF_NORMAL;
    
    if(FAILED(me_g_D3D->GetDevice()->CreateVertexBuffer(sizeof(sVerts) * m_HMSize.x * m_HMSize.y,
    		0, FVF, D3DPOOL_MANAGED, &m_Verts, NULL)))
    
    // Vertizes erstellen,Normale wird erstmal so berechnet:
    v.normal = meVector3(rand()/float(RAND_MAX), -rand()/float(RAND_MAX), rand()/float(RAND_MAX));
    D3DXVec3Normalize((D3DXVECTOR3*)&v.normal, (D3DXVECTOR3*)&v.normal);
    
    // Licht erstellen, am Anfang des Programms:
    D3DLIGHT9 light;
    ZeroMemory(&light, sizeof(D3DLIGHT9));
    light.Type = D3DLIGHT_DIRECTIONAL;
    light.Direction = D3DXVECTOR3(1, -1, 0);
    D3DXVec3Normalize((D3DXVECTOR3*)&light.Direction, (D3DXVECTOR3*)&light.Direction);
    light.Ambient.r = light.Specular.r = 1.0f;
    light.Ambient.g = light.Specular.g = 1.0f;
    light.Ambient.b = light.Specular.b = 1.0f;
    light.Diffuse.r = 0.0f;
    light.Diffuse.g = 1.0f;
    light.Diffuse.b = 1.0f;
    
    g_D3D->SetRS(D3DRS_LIGHTING, TRUE);
    g_D3D->GetDevice()->SetLight(0, &light);
    g_D3D->GetDevice()->LightEnable(0, TRUE);
    
    g_D3D->SetRS(D3DRS_AMBIENT, 0xFF222222);
    
    // Rendern
    D3DMATERIAL9 mat;
    ZeroMemory(&mat, sizeof(D3DMATERIAL9));
    mat.Ambient.r = mat.Diffuse.r = 1.0f;
    mat.Ambient.g = mat.Diffuse.g = 1.0f;
    mat.Ambient.b = mat.Diffuse.b = 1.0f;
    mat.Ambient.a = mat.Diffuse.a = 1.0f;
    mat.Emissive.r = mat.Specular.r = 1.0f;
    mat.Emissive.g = mat.Specular.g = 1.0f;
    mat.Emissive.b = mat.Specular.b = 1.0f;
    mat.Emissive.a = mat.Specular.a = 1.0f;
    g_D3D->GetDevice()->SetMaterial(&mat);
    
    D3DXMATRIX scale;
    D3DXMatrixScaling(&scale, m_Scaling.x, m_Scaling.y, m_Scaling.z);
    D3DXMATRIX trans;
    D3DXMatrixTranslation(&trans, m_Position.x, m_Position.y, m_Position.z);
    D3DXMATRIX world = scale * trans;
    
    PDIRECT3DDEVICE9 dev = me_g_D3D->GetDevice();
    me_g_D3D->SetFVF(FVF);
    HRESULT hr;
    dev->SetStreamSource(0, m_Verts, 0, sizeof(sVerts));
    
    dev->SetIndices(m_Indizes);
    
    me_g_D3D->SetTexture(0, m_BigTex);
    dev->SetTransform(D3DTS_WORLD, &world);
    me_g_D3D->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
    me_g_D3D->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE);
    me_g_D3D->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
    me_g_D3D->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT);
    me_g_D3D->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_TEXTURE);
    me_g_D3D->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE);
    int NumPrimitives = 2 * m_HMSize.x * m_HMSize.y;
    dev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, m_HMSize.x * m_HMSize.y, 0, NumPrimitives);
    

    Das Problem ist, dass es einfach nicht funktioniert. Also ich sehe keine Farbunterschiede in den einzelnen Dreiecken, wie sie ja eigentlich sein müssten. Außerdem werden alle Dreiecke nicht reinweiß, sondern eher so beige oder hellgrau gemalt. Alle haben die selbe Farbe, keins ist heller als ein anders oder so. woran kann das liegen?

    Grüße, Maxi



  • such dir ein minimaldemo in dem das beleuchten funktioniert und schau was da anders gemacht wurde - z. B.:

    http://pluto.phpwebhosting.com/~akbara/private/site/ppl_D3D.html

    sowas findet man mit googlebildsuche mit stichwort d3d + light ganz schnell



  • ich will doch aber kein perpixellighting sondern per vertex 😞


  • Mod

    wenn du ambient auf 1.f stellt, hast jedes vertex eigentlich schon die volle helligkeit, versuch mal alles auf 0 zu stellen bis auf diffuse. (bei lichtquellen und material)

    ansonsten schaut es für mich erstmal ok aus und beige könnt ich mir nicht wirklich eklären.


Anmelden zum Antworten