2016-07-22 6 views
1

지연 쉐이딩을 처음 사용 했으므로 매우 빠르고 간단합니다. 기대되는 결과를 얻지 못할 때까지. 빛은 기이 한 방식으로 움직입니다. 위치 텍스처가 옳지 않은 것과 같습니다. Deferred (하단 시계 방향으로 처음부터 : 최종 (1) 일반 (2) 위치, (3) 알베도 (4) 조도/프레 넬 (센터)) 마지막에 빛이 (렌더링 것을OpenGL 지연 쉐이딩 조명이 제대로 작동하지 않습니다.

공지 사항) 이상한 방식으로 행동합니다. GBuffer.vert

#version 330 core 

// I didn't have time to change this into layout (location = ...) ... 
attribute vec3 pos; 
attribute vec3 norm; 
attribute vec3 tangent; 
attribute vec2 uv; 

out DATA { 
    vec3 position; 
    vec3 normal; 
    vec2 texCoord; 
    mat3 tbn; 
} VS_OUT; 

void main() { 
    gl_Position = gl_ModelViewProjectionMatrix * vec4(pos, 1.0); 
    VS_OUT.position = (gl_ModelViewMatrix * vec4(pos, 1.0)).xyz; 
    VS_OUT.normal = gl_NormalMatrix * norm; 

    vec3 n = normalize(VS_OUT.normal); 
    vec3 t = normalize(gl_NormalMatrix * tangent); 
    t = normalize(t - dot(t, n) * n); 
    vec3 b = cross(t, n); 

    VS_OUT.tbn = mat3(t, b, n); 
    VS_OUT.texCoord = uv; 
} 

에게 GBuffer.frag

#version 330 core 
layout (location = 0) out vec3 g_position; 
layout (location = 1) out vec3 g_normal; 
layout (location = 2) out vec4 g_diffuse; 
layout (location = 3) out vec4 g_material; 

struct TSlot { 
    int active; 
    int type; 
    vec2 scale; 
    float intensity; 
    int blendMode; 
}; 

struct TMaterial { 
    vec4 albedo; 
    float roughness; 
    float fresnel; 
}; 

struct TScene { 
    vec3 ambient; 
    vec3 viewPosition; 
}; 

// Textures 
uniform sampler2D textures[8]; 
uniform TSlot textureSlots[8]; 

// Scene 
uniform TScene scene; 

// Material 
uniform TMaterial material; 

// Object 
in DATA { 
    vec3 position; 
    vec3 normal; 
    vec2 texCoord; 
    mat3 tbn; 
} FS_IN; 

[... blending functions ...] 

void main() { 
    vec3 N = FS_IN.normal; 

    vec4 texs = vec4(1.0); 
    vec4 tex0 = vec4(0.0); 

    for (int i = 0; i < 8; i++) { 
     if (textureSlots[i].active == 0) { continue; } 
     vec2 uv = textureSlots[i].scale * FS_IN.texCoord; 
     int type = textureSlots[i].type; 
     if (type == 0) { // Diffuse 
      vec4 diff = texture2D(textures[i], uv); 
      texs = blend(texs, diff, textureSlots[i].intensity * diff.a, textureSlots[i].blendMode); 
     } if (type == 1) { // Normal 
      vec3 encNorm = texture2D(textures[i], uv).xyz; 
      vec3 localCoords = normalize(vec3(2.0, 2.0, 1.0) * encNorm - vec3(1.0, 1.0, 0.0)); 
      N *= normalize(FS_IN.tbn * localCoords); 
     } else if (type == 2) { // Sphere Reflection 
      vec3 E = normalize(scene.viewPosition - FS_IN.position); 
      vec3 R = normalize(reflect(E, N)); 
      float m = 2.0 * sqrt( 
       pow(R.x, 2.0) + 
       pow(R.y, 2.0) + 
       pow(R.z + 1.0, 2.0) 
      ); 
      vec2 tex = R.xy/m + 0.5; 
      vec4 diff = texture2D(textures[i], tex * textureSlots[i].scale); 
      texs = blend(texs, diff, textureSlots[i].intensity * diff.a, textureSlots[i].blendMode); 
     } else if (type == 3) { // Roughness Map 
      tex0.r = blendNormalFloat(tex0.r, texture2D(textures[i], uv).x, textureSlots[i].intensity); 
     } else if (type == 4) { // Fresnel Map 
      tex0.g = blendNormalFloat(tex0.g, texture2D(textures[i], uv).x, textureSlots[i].intensity); 
     } 
    } 

    // Outputs 
    g_position = FS_IN.position; 
    g_normal = N; 
    g_diffuse.rgb = texs.rgb * material.albedo.rgb; 
    g_diffuse.a = 1.0; 
    g_material = vec4(material.roughness + tex0.r, material.fresnel + tex0.g, 0.0, 0.0); 
} 

Lighting.vert

#version 330 core 

void main() { 
    gl_Position = ftransform(); 
    gl_TexCoord[0] = gl_MultiTexCoord0; 
    gl_FrontColor = vec4(1.0, 1.0, 1.0, 1.0); 
} 

Lighting.frag

#version 330 core 
layout (location = 0) out vec4 fragColor; 

struct TLight { 
    vec3 position; 
    float intensity; 
    vec3 color; 
    float radius; 
    float cutoff; 
    float spotCutoff; 
    vec3 direction; 
    int type; 
}; 

struct TScene { 
    vec3 ambient; 
    vec3 viewPosition; 
}; 

// Textures from GBuffer 
uniform sampler2D t_position; 
uniform sampler2D t_normal; 
uniform sampler2D t_diffuse; 
uniform sampler2D t_material; 

uniform TLight light; 
uniform TScene scene; 

void main() { 
    vec2 uv = gl_TexCoord[0].xy; 
    vec3 P = texture2D(t_position, uv).xyz; 
    vec3 N = normalize(texture2D(t_normal, uv).xyz); 
    vec4 D = texture2D(t_diffuse, uv); 
    vec4 M = texture2D(t_material, uv); 

    vec3 lighting = D.rgb * 0.1; 
    vec3 V = normalize(scene.viewPosition - P); 
    vec3 lightDir = normalize(light.position - P); 
    vec3 diffuse = max(dot(N, lightDir), 0.0) * D.rgb * light.color * light.intensity; 
    lighting += diffuse; 

    fragColor = vec4(lighting, 1.0); 
} 
0 : 여기에

내 쉐이더 코드입니다

나는이 자습서에 다음되었습니다 http://www.codinglabs.net/tutorial_simple_def_rendering.aspx http://learnopengl.com/#!Advanced-Lighting/Deferred-Shading

편집 : 그것은 그냥 법선에 대한 부동 소수점 텍스처를 사용하는 데 필요한 밝혀과

+0

한 가지는 내가 해요, 당신이 당신의 쉐이더에서'core' 프로필을 사용하고 있지만, 쉐이더는 여전히 ('gl_ModelViewProjectionMatrix 등) 향후 변경 될 것입니다 – SurvivalMachine

+0

@SurvivalMachine을 오래된 기능을 사용하는 것입니다 현대 OpenGL을 학습하는 과정에서. 설치 및 프로토 타입이 빠르기 때문에 이전 기능을 계속 사용합니다. – dcubix

+0

글쎄, 나는 게시 할 수있다 : "나는 누군가가 내 코드를 분석하기를 원한다"하지만 나는 그렇지 않았다. 그래서 누군가가 실제로 적절한 대답으로 대답한다면 정말 좋을 것이다. – dcubix

답변

1

이 아이디어 포지션 : 당신이 부동 소수점 텍스처를 사용할 필요가

을, 그렇지 않으면 값이 [0; 1] 범위로 고정되거나 법선의 경우 해당 범위로 스케일 및 바이어스 할 수 있습니다 (32F/16F보다 작은 형식 사용)

뷰의 좌표계에있는 빛의 위치를 ​​CPU쪽에 위치 시키면 lighting.frag에서 동시에 뷰 위치 (위치 g 버퍼로부터)와 월드 좌표 (라이트 위치)를 계산합니다. 출력과 함께.

도움이 되길 바랍니다. 이상한 보이는

+0

대단히 감사합니다! 방금 float 텍스처를 사용해야했습니다. – dcubix