Cubemap Shader



  • Hallo Leute ich würde gerne für ein Rennspiel einen Pixelshader schreiben,der einen Reflektionseffekt hat.Und zwar soll das für ein Auto sein.

    Ich hab mir gedacht,dass man das evtl. mit einer environment-map macht und diese mit der normalen Diffusemap multipliziert(bzw. es sollte nicht zu sehr reflektieren z.b bei Glass).

    Leider bin ich erst Einsteiger in GLSL und wollte mal hier nachfragen wiem an das machen könnte.

    Mein Vorschlag:

    uniform samplerCube CUBEMAP;
    uniform sampler2D DIFFUSE;
    uniform vec3 cameraposition;
    varying vec4 modelvertex;
    
    ....
    
    vec3 cubecoord = reflect( normalize( modelvertex.xyz - cameraposition ),gl_NormalMatrix );
    gl_FragColor = vec4( textureCube(CUBEMAP,cubecoord).xyz, diffuse.w);
    

    könnt ihr mir helfen?
    Danke



  • Du willst um die Normale reflektieren, nicht um die NormalMatrix und das normalisieren kannst du dir sparen, wenn du eine CubeMap indizierst. modelvertex und cameraposition sind beide im Worldspace?



  • Ok ehm cameraposition wird über uniform übertragen und vertexposition kommt vom vertexshader.Ehrlich gesgt hab ich mir das ein bisschen zusammengefrikelt aus anderen Shadern



  • Bis auf die gl_NormalMatrix sieht es ja so falsch nicht aus. Was genau funktioniert denn nicht?



  • hmm also ich habs noch nicht wirklich ausprobiert.Aber wie muss man das den ohne das gl_Normal machen?



  • Du sollst es nicht ohne gl_Normal (<- richtig) machen sondern ohne gl_NormalMatrix (<- falsch)..



  • Ah ok danke jetzt hab ichs umgeschrieben und es klappt ganz gut.
    Wie gesagt soll das für ein Autoglaz sein und dazu müsste ich noch die Diffuse zumischen.Wenn ich es Multipliziere sieht es nicht gerade schön aus.

    Wie macht man das richtig?





  • So hab das jetzt hinbekommen ,jedoch funktioniert das nicht überall auf dem Modell.Desto näher ich am Model bin ,desto mehr umschließt die Cubemap das Modell mit.

    Vertex Shader(ein paar sachen sind für die Engine mit der ich arbeite)

    Include "MeshMatrix.vert"
    
    varying vec2 texcoord0;
    varying vec4 modelvertex;
    varying vec3 vReflection;
    uniform vec3 cameraposition;
    
    void main(void)
    {
     Include "GetMatrix.vert"
    
     modelvertex = gl_Vertex;
     modelvertex = mat * modelvertex;
     gl_Position  = gl_ModelViewProjectionMatrix * modelvertex;
    
     vec3 vView = gl_Vertex.xyz - cameraposition.xyz;
     vReflection = reflect(vView, gl_Normal);
    
     texcoord0 = gl_MultiTexCoord0.xy;
    
    }
    

    Fragment Shader

    #extension GL_ARB_draw_buffers : enable
    
    uniform sampler2D texture0;
    uniform samplerCube texture1;
    
    varying vec2 texcoord0;
    varying vec3 vReflection;
    
    const float ref = 0.5;
    
    void main(void)
    {
        vec4 diffuse;
    	vec3 base = texture2D(texture0,texcoord0).rgb;
    	vec3 cube = textureCube(texture1, vReflection).rgb;
    	gl_FragColor = vec4(mix(base,cube,ref),1.0);
    }
    

    Hier ist das ,was ich haben will ,doch da haben die noch eine World4x4 Matrix,wobei ich nicht weiß was genau das sein soll.... 🙂
    http://www.ozone3d.net/tutorials/glsl_texturing_p04.php#part_4

    Danke



  • Ok ich hab das jetzt mit sphere mapping gemacht.
    Aber eine Frage hätte ich noch.Ich würde mir jetzt als zweiten Schritt realtime cubemap reflection machen,wo ich einfach 6 Bilder von 6 Cameras an den Shader schicke und der daraus eine Cubemap backt.Dpch wie macht man das,am besten in ein samplerCube interface??



  • Ich versteh nicht ganz, was genau ist dein Problem?



  • Ich würde gerne einen realtime cubemap shader schreiben.Bei der DirectX SDK gibt es so ein beispiel nur in HLSL.Dort werden irgendwie 6 Bilder zum shader geschickt,der die dan in eine Cubemap umwandelt und dan mit den ganzen Positionsberechnungen die Textur daraus macht.

    Eigendlich will ich nur irgendwie 6 Texturen zu einer Cubemap backen,aber halt immer wieder. 😃



  • Mir scheint da liegt ein grundlegendes Missverständnis vor. Ein Shader baut nicht irgendwie aus einzelnen Texturen eine Cubemap. Du musst deine 6 Ansichten schon direkt in die entsprechenden Teile der Cubemap rendern. Das Sample im DX SDK hast du offenbar eh schon gefunden...


Log in to reply