heightmap im shader auslesen



  • also ich hab ein tutorial für dx9 gelesen, wo das drinsteht ^^
    aber leider nicht ausführlich genug..

    funktioniert so: eine vertex-textur wird verwendet, d.h. meine heightmap (bzw normal-map) wird im vertex-shader gelesen, und der z-wert(die normalen) des vertex geändert..

    ich hab jetzt die textur geladen und auch zugewiesen, aber ich weiß nicht, wie ich jetzt im shader den z-wert bekomm (die textur is ein graustufen-png)



  • Also, du willst nicht die positionen der vertices ändern, sondern die normalen für die lichtberechnung? Die Normalen kannst du ändern, bzw direkt im shader setzen, wobei dies auch widerum nicht über die graka gemacht werden muss, denn deine graka muss das dann jeeedes mal berechnen ... über die cpu machste das einmal am anfang und gut ist ...

    Aber das zeichnen des lichtes, da würde ich dann wiederum über einen shader machen! Aber du machst es dir wirklich viel zu schwer ... Shader sind mächtig und schnell, aber alles aus Shadern, ne ich weiß nicht ^^, aber mir glaubst du ja nicht, vieleicht will es dir ja jemand anders es sagen 😃



  • nicht nur die normalen.. auchdie y-position des vertices (bzw z-position).
    die normalen werd ich öfter berechnen müssen, weil sich das terrain ändert...



  • ok, hat sich gelöst.. hat bei mir nicht funktioniert, weil ich nicht shader v 3 sondern v 2 verwendet hab...



  • doch nicht gelöst...

    Vertex-shader

    struct VS_INPUT
    {
        float4 Position   : POSITION;
    };
    
    // Vertex shader output structure
    struct VS_OUTPUT
    {
        float4 Position   : POSITION;
        float2 uv		  : TEXCOORD0;
    };
    
    // Global variables
    vector ScaleFactor, ScaleHeightmap;
    sampler2D Heightmap;
    matrix WorldViewProj;
    
    VS_OUTPUT vs_main( in VS_INPUT In )
    {
        VS_OUTPUT Out;
    	float x = In.Position.x*ScaleFactor.x+ScaleFactor.z;
    	float y = In.Position.y*ScaleFactor.y+ScaleFactor.w;
    	float2 uv = float2(x,y) * ScaleHeightmap.xy;
    	float z = tex2Dlod(Heightmap,float4(uv,0,1))*100;
        Out.Position = mul(float4(x,y,z,1),
                           WorldViewProj);
        Out.uv=uv;
        return Out;
    }
    

    Pixel-shader:

    // Pixel shader input structure
    struct PS_INPUT
    {
        float4 Position   : POSITION;
        float2 uv		  : TEXCOORD0;
    };
    
    // Pixel shader output structure
    struct PS_OUTPUT
    {
        float4 Color   : COLOR0;
    };
    
    // Global variables
    sampler2D Tex0;
    
    PS_OUTPUT ps_main( in PS_INPUT In )
    {
        PS_OUTPUT Out;                             //create an output pixel
        Out.Color = tex2D(Tex0, In.uv);       //do a texture lookup
        return Out;                                //return output pixel
    }
    

    wenn ich es so haben dann wird die textur schön über meine vertices gelegt, und ich hab die heightmap auf meine plane gezeichnet... die plane bleibt aber leider gerade...
    wenn ich jetzt den z-wert händisch setze, dann wird die plane schwarz... (auch wenn ich ihn auf 0 setze)

    ich rätsel schon stunden, aber ich komm nicht drauf, was da falsch sein könnte..


  • Mod

    hast du dran gedacht pointfiltering einzuschalten?
    versuch mal verschiedene miplevel.
    vielleicht hilft dir ftp://download.nvidia.com/developer/Papers/2004/Vertex_Textures/Vertex_Textures.pdf



  • D3DXCreateTextureFromFileEx(
    				renderer->Device, 
    				Dateiname, 
    				D3DX_DEFAULT, 
    				D3DX_DEFAULT, 
    				D3DX_DEFAULT, 
    				0, 
    				D3DFMT_UNKNOWN, 
    				Pool, 
    				D3DX_FILTER_POINT, 
    				D3DX_FILTER_POINT, 
    				0, 
    				NULL, 
    				NULL, 
    				&t)
    

    so erzeug ich jetzt meine textur (Pool = D3DPOOL_SCRATCH)

    seit ich das so erzeug is die textur einfach nurnoch schwarz..
    (habs schon mit miplvl 0 probiert)



  • http://www.toymaker.info/Games/html/d3d_resources.html schrieb:

    4. D3DPOOL_SCRATCH

    Places resources in system RAM. These resources can be locked and do not need recreating on a lost device. The great advantage of this resource type is that it is not restricted by the video card e.g. many video cards require texture dimensions to be power of 2 only so if you wish to load a non power of 2 texture this is the only pool into which you can load it. The disadvantage of course is that resources in this pool cannot be accessed by the device and so cannot be used during rendering. This pool is generally used for pre-processing of data e.g. you could load a large texture into a scratch memory surface and then slice it into smaller pieces and create normal device textures with it.



  • ok, da hab ich mich vll verlesen ^^ aber mit managed funktionierts auch nicht..



  • Ich hab dir doch in ICQ gesagt das das mit dx9 nicht geht, warum glaubst du mir nicht, ich weiß schon was ich rede xD

    Wegen den Texturen habe ich dir ein wunderschönes tut geschickt, wo alles ausführlih erklrt wird 🙂



  • Was soll mit dx9 nicht gehen?
    Ich bin kein D3D Experte, aber in einem Vertex-Shader Vertices zu verschieben ... ich meine wenn DAS nicht geht, wozu sollen Vertex-Shader dann überhaupt gut sein?

    Oder meinst du den Zugriff auf die Textur?



  • es geht.. hab ja schon einiges gelesen 😃

    aber bei mir gehts gerade nicht... drum post ich ja im forum 😃


  • Mod

    welche graka hast du
    kein output von d3ddebug?



  • also ich hab eine radeon HD 2600XT

    der shader hat auch keine fehler oder so, er stellt aber die hoehe von dem vertex nicht um (außer ich machs manuell) also er liest die daten nicht richtig aus der textur (bzw eben garnicht..)


  • Mod

    kein d3ddebug output?
    wird das textureformat unterstuetzt laut caps?



  • bitte nicht so viele fachbegriffe 😃

    wie schau ich nach, obs unterstützt wird?


  • Mod

    systemsteuerung -> directx ->direct3d -> debug mode (nicht retail)

    und

    http://www.google.com/search?q=d3d+caps+viewer



  • so.. hab jetzt berge... hab die textur falsch hinzugefügt...

    device->SetTexture(D3DVERTEXTEXTURESAMPLER0, heightmapTextur);

    so gehts jetzt..



  • Code-Walker schrieb:

    Ich hab dir doch in ICQ gesagt das das mit dx9 nicht geht, warum glaubst du mir nicht, ich weiß schon was ich rede xD

    damit wäre das dann ja auch geklärt.


Anmelden zum Antworten