Texturfilter selber schreiben - Warum ist Textur nicht perfekt scharf?


  • Mod

    kannst du ein wireframe vom boden zeigen?

    ist das richtig dass du bei tex1 und tex2 von P1 interpolierst? sollte das nicht eher sowas sein wie:

    Vektor tex1 = P1.TextcoordVektor/P1.positionz*(1.f)+P2.TextCoordVector/P2Position.z;
    Vektor tex2 = P3.TextcoordVektor/P1.positionz*(1.f)+P4.TextCoordVector/P2Position.z;
    

    ?



  • Ich habe den Fehler eingrenzen können. Er liegt beim Clipping in der Vertex-Interpolate-Funktion. Wenn ich das Clipping ausschalte, dann ist der Fehler weg.

    Wenn ich ein Dreieck habe, wo P1 im Bildschirm liegt, und P2 draußen. Abstand zwischen P1 und P2 ist 10. Die Bildschirmkante liegt bei 5. Dann rufe ich LinearInterpolate mit f = 0.5 auf.

    Die UV-Koordinaten werden hier ohne perspektivische Division interpoliert.

    //f geht von 0 bis 1
    private static Vertex LinearInterpolate(Vertex v1, Vertex v2, float f)
    {
    
      return new Vertex(v1.pos * (1 - f) + v2.pos * f, v1.normale * (1 - f) + v2.normale * f, v1.tTangent * (1 - f) + v2.tTangent * f, v1.texcoordU * (1 - f) + v2.texcoordU * f, v1.texcoordV * (1 - f) + v2.texcoordV * f);
    }
    

    Das funktioniert also offentsichtlich nicht. Also probiere ich es nun so:

    //f geht von 0 bis 1
    private static Vertex LinearInterpolate(Vertex v1, Vertex v2, float f)
    {
    
       float posZ = 1 / v1.pos.z * (1 - f) + 1 / v2.pos.z * f;
       Vektor tex = v1.TextcoordVektor / v1.pos.z * (1 - f) + v2.TextcoordVektor / v2.pos.z * f;
    
       tex /= posZ;
       return new Vertex(v1.pos * (1 - f) + v2.pos * f, v1.normale * (1 - f) + v2.normale * f, v1.tTangent * (1 - f) + v2.tTangent * f, tex.x, tex.y);     
    }
    

    Das funkioniert aber auch nicht. Die Texturkoordinaten sind immer noch falsch. Woran liegt das? Wie muss ichs machen?


Anmelden zum Antworten