2016-09-29 2 views
0

Ich versuche Multi-Texturing in OpenGL zu implementieren. Die verwendete Textur basiert auf der Oberflächennormale eines gegebenen Eckpunkts. Je vertikaler sie ist, desto mehr der zweiten Textur ist sichtbar.GLSL multi-texturing- Blending Texturen

Here ist was ich bisher habe.

Ich möchte jetzt die Kanten zusammen mischen, anstatt diese harte Kante zu haben. Ist es möglich, die Texturen auf diese Weise zu mischen? Wenn ja, wie mache ich das?

Das ist mein Fragment Shader-Code:

#version 150 

in vec2 pass_textureCoords; 
in vec3 surfaceNormal; 
in vec3 toLightVector; 
in vec3 toCamera; 
in vec3 playerPosition; 
in vec4 vertexPosition; 

in float blendPosition; 
in float visibility; 

out vec4 out_Color; 

uniform sampler2D texture0; 
uniform sampler2D texture1; 

uniform vec3 skyColour; 
uniform vec3 light_colour; 
uniform float shineDamper; 
uniform float reflectivity; 

void main(void){ 
    vec3 unitNormal = normalize(surfaceNormal); 
    vec3 unitLightVector = normalize(toLightVector); 

    float nDot1 = dot(unitNormal,unitLightVector); 
    float brightness = max(nDot1,0.2); 
    vec3 diffuse = brightness * light_colour; 

    vec3 unitToCamera = normalize(toCamera); 
    vec3 lightDirection = -unitLightVector; 
    vec3 reflectedLightDirection = reflect(lightDirection,unitNormal); 

    float specular = dot(reflectedLightDirection, unitToCamera); 
    specular = max(specular,0.0); 
    float damped = pow(specular,shineDamper); 
    vec3 finalSpecular = damped * reflectivity * light_colour; 

    out_Color = (vec4(diffuse,1.0) * texture(texture0,pass_textureCoords)) + vec4(-20,-20,0.0,0.0); 
    out_Color = (vec4(diffuse,1.0) * texture(texture0,pass_textureCoords)); 
    out_Color = mix(vec4(skyColour,1.0),out_Color,visibility); 

    if(vertexPosition.y < -6.1 || surfaceNormal.y < 0.6){ 
    out_Color = (vec4(diffuse,1.0) * texture(texture1,pass_textureCoords)) + vec4(-20,-20,0.0,0.0); 
    out_Color = (vec4(diffuse,1.0) * texture(texture1,pass_textureCoords)); 
    out_Color = mix(vec4(diffuse,1.0) * texture(texture0,pass_textureCoords),out_Color,1); 
    out_Color = mix(vec4(skyColour,1.0),out_Color,visibility); 
    } 
    if(playerPosition.y < -6.1){ 
    out_Color = mix(vec4(0.0,0.3,0.5,1.0),out_Color,0.1); 
    } 
} 

EDIT:

Dies ist die neue für alle Shader-Code-Fragment interessiert

Aktualisiert Fragment Shader-Code:

#version 150 

in vec2 pass_textureCoords; 
in vec3 surfaceNormal; 
in vec3 toLightVector; 
in vec3 toCamera; 
in vec3 playerPosition; 
in vec4 vertexPosition; 

in float blendPosition; 
in float visibility; 

out vec4 out_Color; 

uniform sampler2D texture0; 
uniform sampler2D texture1; 

uniform vec3 skyColour; 
uniform vec3 light_colour; 
uniform float shineDamper; 
uniform float reflectivity; 

void main(void){ 
vec3 unitNormal = normalize(surfaceNormal); 
vec3 unitLightVector = normalize(toLightVector); 

float nDot1 = dot(unitNormal,unitLightVector); 
float brightness = max(nDot1,0.2); 
vec3 diffuse = brightness * light_colour; 

vec3 unitToCamera = normalize(toCamera); 
vec3 lightDirection = -unitLightVector; 
vec3 reflectedLightDirection = reflect(lightDirection,unitNormal); 

float specular = dot(reflectedLightDirection, unitToCamera); 
specular = max(specular,0.0); 
float damped = pow(specular,shineDamper); 
vec3 finalSpecular = damped * reflectivity * light_colour; 

out_Color.a = 1; 

vec4 fog = vec4(skyColour,1.0); 
vec4 diffusion = vec4(diffuse,1.0); 

float a = clamp((unitNormal.y - .6)*5 + .5, 0, 0.7); 
vec3 texture0_colour = (mix(fog,diffusion * texture(texture0,pass_textureCoords),visibility)).rgb; 
vec3 texture1_colour = (mix(fog,diffusion * texture(texture1,pass_textureCoords),visibility)).rgb; 

out_Colour.rgb = mix(texture1_colour,texture0_colour,a); 

} 
+0

Warum überschreiben Sie 'out_Color' mehrmals? – ybungalobill

+0

Ich bin neu bei GLSL und OpenGL im Allgemeinen. Ich habe gerade mit verschiedenen Sachen experimentiert, um zu sehen, was passiert –

Antwort

0

Um zwei Textur Basis zu mischen d auf einen Wert a Sie tun:

float a = ...; 
vec3 color0 = texture(texture0, pass_textureCoords).rgb; 
vec3 color1 = texture(texture1, pass_textureCoords).rgb; 
out_Color.rgb = mix(color0, color1, a); 

Unter der Annahme, dass Ihr unitNormal = (0,1,0) die Aufwärtsrichtung ist, wie es aus dem Code angezeigt wird, dann wird der Wert von

float a = clamp(unitNormal.y, 0, 1); 

in einem glatten Übergang zwischen dem Ergebnis wird zwei Texturen. Allerdings wollen Sie wahrscheinlich einen schärferen Übergang, in dem Fall, dass Sie verschieben und skalieren, um die unitNormal.y Wert einzustellen, wo der Übergang beginnt und endet:

float a = clamp((unitNormal.y - .6)*5 + .5, 0, 1); 
+0

Vielen Dank. Genau das habe ich gesucht. Es funktioniert perfekt :) –