2013-04-02 9 views

Odpowiedz

10

Niezupełnie

Sposób, w jaki zwykle debug GLSL jest kolorów wyjściowych. Tak na przykład, biorąc pod uwagę 2 shadery jak

// vertex shader 
uniform mat4 worldViewProjection; 
uniform vec3 lightWorldPos; 
uniform mat4 world; 
uniform mat4 viewInverse; 
uniform mat4 worldInverseTranspose; 
attribute vec4 position; 
attribute vec3 normal; 
attribute vec2 texCoord; 
varying vec4 v_position; 
varying vec2 v_texCoord; 
varying vec3 v_normal; 
varying vec3 v_surfaceToLight; 
varying vec3 v_surfaceToView; 
void main() { 
    v_texCoord = texCoord; 
    v_position = (worldViewProjection * position); 
    v_normal = (worldInverseTranspose * vec4(normal, 0)).xyz; 
    v_surfaceToLight = lightWorldPos - (world * position).xyz; 
    v_surfaceToView = (viewInverse[3] - (world * position)).xyz; 
    gl_Position = v_position; 
} 

// fragment-shader  
precision highp float; 

uniform vec4 colorMult; 
varying vec4 v_position; 
varying vec2 v_texCoord; 
varying vec3 v_normal; 
varying vec3 v_surfaceToLight; 
varying vec3 v_surfaceToView; 

uniform sampler2D diffuseSampler; 
uniform vec4 specular; 
uniform sampler2D bumpSampler; 
uniform float shininess; 
uniform float specularFactor; 

vec4 lit(float l ,float h, float m) { 
    return vec4(1.0, 
       max(l, 0.0), 
       (l > 0.0) ? pow(max(0.0, h), m) : 0.0, 
       1.0); 
} 
void main() { 
    vec4 diffuse = texture2D(diffuseSampler, v_texCoord) * colorMult; 
    vec3 normal = normalize(v_normal); 
    vec3 surfaceToLight = normalize(v_surfaceToLight); 
    vec3 surfaceToView = normalize(v_surfaceToView); 
    vec3 halfVector = normalize(surfaceToLight + surfaceToView); 
    vec4 litR = lit(dot(normal, surfaceToLight), 
        dot(normal, halfVector), shininess); 
    gl_FragColor = vec4((
    vec4(1,1,1,1) * (diffuse * litR.y 
         + specular * litR.z * specularFactor)).rgb, 
     diffuse.a); 
} 

Gdybym nie widział coś na ekranie bym najpierw zmienić cieniującego fragmentu tylko przez dodanie odpowiedniego wiersza na końcu

gl_FragColor = vec4(1,0,0,1); // draw red 

Jeśli Zacząłem dostrzegać moją geometrię, wtedy wiedziałem, że problem prawdopodobnie znajduje się w cieniującym fragmencie. mogę sprawdzić, czy moje normalne wykonując tę ​​

gl_FragColor = vec4(v_normal * 0.5 + 0.5, 1); 

Jeśli normalne wyglądało w porządku mogę sprawdzić coords UV z

gl_FragColor = vec4(v_texCoord, 0, 1); 

etc ...

+0

Co się stanie, jeśli moduł cieniujący ulegnie uszkodzeniu podczas wykonywania 'gl_FragColor = vec4 (v_normal * 0.5 + 0.5, 1);'? – shinzou

+0

co oznacza pojęcie "shader breaks"? – gman

+0

Otrzymuję ten http://imgur.com/m6XBidM i kształt jest zepsuty. – shinzou

1

Możesz wypróbować w tym celu WebGL-Inspector.

+0

Niestety debugs połączeń z JavaScript, a nie rzeczywisty GLSL. – Lev