heightmap im shader auslesen
-
Hallo!
Ich habe bei meinem terrain eine heightmap erstellt (graustufen-png)
jetzt frag ich mich, wie ich die daten von dem file direkt im shader auswerten kann, und die höhe des vertices anpasse.was ich jetzt gemacht hab war, dass ich das file als textur lade, und meiner device zuordne.. jetzt weiß ich aber nicht, wie ich auf die textur im vertex-shader zugreife..
-
Grundlegend genauso wie im Pixel-Shader.
Wie *genau* kommt darauf an, ob Du HLSL, CG oder GLSL benutzt.
-
ich verwend HLSL..
-
Ich meine irgentwo mal gehört zu haben das du DirectX 9.0c benutzt (was auch gut ist, meiner meinung nach!), wollte ich nur sagen, das Diese Geoshader oder wie auch immer, erst mit DX10 dabei sind, d.h. das game würde dann nur auf Vista laufen, kein XP! Und mit DX9 kannst du das auch nicht machen! Dafür musst du dann auf cg hader zurückgreifen, das musst du dir aber extra von NVIDEA runterladen und installieren und einrichten und das ganze blabla! Bei dem neuen OpenGL kannst du das machen, und es funzt auch überall xD
Und soweit ich weiß würdest du ja gerne LOD mit Shadern machen, was nicht unbedingt nötig ist, die cpu kann das auch ganz gut

EDIT:::::
Und ich sag es nochmals, benutz google! Schau mal was auf der ersten Seite alles war:
http://swt.informatik.uni-freiburg.de/files/shader_BB_2.pdf
http://www.neatware.com/lbstudio/web/hlsl.html (Den hab ich dir schon gegeben!)EDIT::::::::
Viele überschätzen die Shader, man sollte nicht alles über Shader machen, du musst es schon alles gut ausgleichen, ein teil über die Graka und ein teil über die cpu, abr bitte, doch nicht alles über die graka

-
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..
-
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

-
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..)
-
kein d3ddebug output?
wird das textureformat unterstuetzt laut caps?
-
bitte nicht so viele fachbegriffe

wie schau ich nach, obs unterstützt wird?