Ergebnis 1 bis 5 von 5

Thema: cg shader - vertex colour des meshes auslesen

  1. #1

    cg shader - vertex colour des meshes auslesen

    Ich versuche mithilfe eines cg shaders die vertex colours eines meshes zu verarbeiten, um dann später einen texture blend shader zu schreiben aber irgendwie funktioniert schon das auslesen der vertex colours aus dem mesh nicht ganz.

    Das hier ist der Shader:
    Code:
    //------------------------------------
    struct vertexInput {
        float3 position				: POSITION;
        float3 normal				: NORMAL;
        float4 texCoord				: TEXCOORD0;
        float4 vColor				: COLOR0;
    };
    
    struct vertexOutput {
        float4 position			: POSITION;
        float4 texCoord			: TEXCOORD0;
        float4 vColor			: COLOR;
    };
    
    
    //------------------------------------
    vertexOutput VS_TransformAndTexture(vertexInput IN) 
    {
        vertexOutput OUT;
        OUT.position = mul( float4(IN.position••••• , 1.0) , worldViewProj);
        OUT.texCoord = IN.texCoord;
    
        OUT.vColor = IN.vColor +0.4;
        
        return OUT;
    }
    
    
    //-----------------------------------
    float4 PS_Textured( vertexOutput IN): COLOR
    {
      return IN.vColor;
    }
    Mit "float4 vColor : COLOR0;" als parameter des vertex shaders wollte ich die Farbe des Punktes bekommen, der shader erhält aber nur ein Schwarz. Im Endeffekt wird das Mesh komplett grau angezeigt, da noch 0.4 zur Farbe dazuaddiert wird.

    So sollte das Mesh mit dem shader aussehen(allerdings flat shaded):


    Und so sieht es in Nvidias fx composer aus:

    Das Mesh wurde als .x exportiert um es in fx composer importieren zu können. Innerhalb der .x Datei gibt es einen eigenen Abschnitt für Vertex Colours mit genug Einträgen und unterschiedlichen rgb Werten also daran sollts eigentlich nicht scheitern.

    Hoffentlich gibt es hier ein paar shader programmierer. ^^

  2. #2
    Ich bin zwar scho ein wenig eingerostet, aber:
    - Du hast tatsächlich an jedem Knoten die richtigen Farben definiert? Das "bunte" Beispiel schaut verdächtig nach Textur aus...
    - Ich hab nicht viel Erfahrung mit dem fxComposer... aber wenn ich mit OpenGL Shader-Programme auf die Karte geladen habe, hatte ich für Vertex und Fragment Shader getrennte Codes, darüberhinaus hatten die alle einen definierten (main) Einstiegspunkt.
    - Rein vom Verständnis her: Du hast im Vertexshader Texturkoordinaten? Bist du da nicht noch ein klein wenig zu früh dran?

    Tjo, versuchen wir, auf eine gemeinsame Basis zu kommen - Meine Programme haben nämlich immer ganz anders ausgesehen

  3. #3
    Die Farben sind wirklich den Punkten zugeordnet, auf dem Mesh befindet sich keine Textur. Ich hab jetzt das ganze nochmal ohne FX Composer direkt in 3dsmax/ofusion versucht, und es ging. Keine Ahnung, ob etwas beim Import in Composer nicht geklappt hat, oder ob ich beim für 3dsmax/ofusion neu schreiben unbewusst den Fehler beseitigt habe. In der .x Datei scheinen jedenfalls auch alle vertex farben angegeben gewesen zu sein.

    Der jetzt zumindest für Ogre/3dsmax/ofusion funktionierende code (gleich um das texture blending erweitert)
    Code:
    void vp_vcolor(
    	float3 iPosition		: POSITION,
    	float3 iNormal			: NORMAL,
    	float4 iColor			: COLOR,
    	float2 iTexCoord01		: TEXCOORD0,
    	float2 iTexCoord02		: TEXCOORD1,
    	float2 iTexCoord03		: TEXCOORD2,
    	//float2 iTexCoord04		: TEXCOORD3,
    	
    	out float4 oPosition	: POSITION,
    	out float4 oColor		: COLOR,
    	out float2 oTexCoord01	: TEXCOORD0,
    	out float2 oTexCoord02	: TEXCOORD1,
    	out float2 oTexCoord03	: TEXCOORD2,
    	//out float2 oTexCoord04	: TEXCOORD3,
    	
    	uniform float4x4 worldViewProj
    	)
    {
    	oPosition = mul(float4(iPosition•••••, 1.0), worldViewProj);
    	oColor = iColor;
    	
    	//TeCoords
    	oTexCoord01 = iTexCoord01;
    	oTexCoord02 = iTexCoord02;
    	oTexCoord03 = iTexCoord03;
    	//oTexCoord04 = iTexCoord04;
    }
    
    //-----------------------------------
    void fp_vcolor(
    	float4 iPosition		: POSITION,
    	float4 iColor			: COLOR,
    	float2 iTexCoord01		: TEXCOORD0,
    	float2 iTexCoord02		: TEXCOORD1,
    	float2 iTexCoord03		: TEXCOORD2,
    	//float2 iTexCoord04		: TEXCOORD3,
    	
    	out float4 oColor		: COLOR,
    	
    	uniform sampler2D texture01,
    	uniform sampler2D texture02,
    	uniform sampler2D texture03
    	//uniform sampler2D texture04
    	)
    {
    	//oColor = tex2D(texture01, iTexCoord01)*(1-iColor.r)*(1-iColor.g)*(1-iColor.b);
    	oColor = tex2D(texture01, iTexCoord01)*iColor.r;
    	oColor = oColor +  tex2D(texture02, iTexCoord02)*iColor.g;
    	oColor = oColor +  tex2D(texture03, iTexCoord03)*iColor.b;
    	
    }



    Zitat Zitat
    Ich hab nicht viel Erfahrung mit dem fxComposer... aber wenn ich mit OpenGL Shader-Programme auf die Karte geladen habe, hatte ich für Vertex und Fragment Shader getrennte Codes, darüberhinaus hatten die alle einen definierten (main) Einstiegspunkt.
    Nvidias cg erlaubt es auch, vertex und fragment shader in dieselbe Datei zu schreiben. Die Einstiegspunkte waren in fx composer in einem pass und für ofusion in einer .program Datei angegeben.

    Zitat Zitat
    Rein vom Verständnis her: Du hast im Vertexshader Texturkoordinaten? Bist du da nicht noch ein klein wenig zu früh dran?
    So wie ich das mitbekommen habe müssen alle Inputs eines Fragment Shaders als Output eines Vertex Shaders angegeben sein. Desshalb hab ich gleich beim Vertex Shader die Koordinaten angenommen und weitergegeben. Hätt ich das auslassen können und nur beim Fragment Shader die Koordinaten holen können? Njo, gleich mal testen, wär um einiges übersichtlicher.

    Was leider nicht geklappt hat, ist den farblosen stellen ebenfalls eine Textur zuzuweisen.
    "//oColor = tex2D(texture01, iTexCoord01)*(1-iColor.r)*(1-iColor.g)*(1-iColor.b);" sollte eine vierte Textur an die farblosen stellen setzen was auch funktioniert hat aber nur mit einer weiteren Textur. Bei 3 Texturen gabs einen "too much arithmetic operations" fehler.

    Zitat Zitat
    Meine Programme haben nämlich immer ganz anders ausgesehen
    Hast du deine Shader in GLSL geschrieben? Wenn ja, ist die Syntax vergleichbar mit cg? Wollt mich nämlich auch mal an GLSL ranwagen und das würds natürlich vereinfachen.

    Geändert von nudelsalat (19.11.2006 um 19:41 Uhr)

  4. #4
    Ich hab die Dinger auch mit Cg geschrieben, allerdings dann aufs ARB-Profil übersetzt und direkt mit OpenGL auf die Grafikkarten-Einheiten geladen...

    wie dringend ist es? Wenn ich morgen etwas Zeit finde, werd ich mir den Composer installieren und selbst rumprobieren

  5. #5
    Danke für das Angebot. Nachdem das ganze aber jetzt zumindest in 3dsmax funktioniert, ist es nicht mehr dringend. Wäre natürlich für nächstes mal gut zu wissen woran es gelegen hat, dass die Vertex Colours nicht übergeben wurden. Shader schreiben ist ohne Composer nicht sehr komfortabel, besonders da 3dsmax bei fehlerhafter Syntax abstürzt.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •