2011-12-04 4 views
0

VC++ 2010, OpenGL을, GLSL, 그래서 두 가지 문제가 있어요GLSL 노멀 매핑 쉐이더

SDL를 발행합니다. 이 첫 번째 문제를 주로 해결하기를 바라고 있습니다. 사용하고있는 노멀 맵 셰이더가 양수 또는 음수 x 방향을 가리키는 법선과 작동하지 않습니다. z와 y는 잘 작동합니다 (큐브의 텍스처와 법선을 테스트).

편집 : x 방향으로 법선으로 보이지 않습니다. 왜냐하면 도형을 회전시킬 때 앞면을 향한 쿼드가 여전히 작동하기 때문입니다. 그래서 원래는 x 작업에 직면 해있는 것처럼 보입니다.

#define MAX_LIGHTS 8 
#define NUM_LIGHTS 1 

varying vec3 lightVec[MAX_LIGHTS]; 
varying vec3 viewVec; 

attribute vec4 glTangent4f; 

void main(void) 
{ 
    gl_Position = ftransform(); 
    gl_TexCoord[0] = gl_MultiTexCoord0; 

    vec3 n = normalize(gl_NormalMatrix * gl_Normal); 
    vec3 t = normalize(gl_NormalMatrix * glTangent4f.xyz); 
    vec3 b = cross(n, t); 

    vec3 v; 
    vec3 vVertex = vec3(gl_ModelViewMatrix * gl_Vertex); 
    int i; 
    for (i=0; i<NUM_LIGHTS; ++i) 
    { 
     vec3 lVec = gl_LightSource[i].position.xyz - vVertex; 
     v.x = dot(lVec, t); 
     v.y = dot(lVec, b); 
     v.z = dot(lVec, n); 
     lightVec[i] = v; 
    } 

    vec3 vVec = -vVertex; 
    v.x = dot(vVec, t); 
    v.y = dot(vVec, b); 
    v.z = dot(vVec, n); 
    viewVec = v; 
} 

조각 쉐이더

#define MAX_LIGHTS 8 
#define NUM_LIGHTS 1 

varying vec3 lightVec[MAX_LIGHTS]; 
varying vec3 viewVec; 

uniform sampler2D colorMap; 
uniform sampler2D normalMap; 

void main (void) 
{ 
    vec2 uv = gl_TexCoord[0].st * 4.0; 
    vec4 base = texture2D(colorMap, uv); 
    vec4 final_color = vec4(0.2, 0.2, 0.2, 1.0) * base; 
    vec3 vVec = normalize(viewVec); 
    vec3 bump = normalize(texture2D(normalMap, uv).xyz * 2.0 - 1.0); 
    vec3 R = reflect(-vVec, bump); 

    int i; 
    for (i=0; i<NUM_LIGHTS; ++i) 
    { 
     vec3 lVec = normalize(lightVec[i]); 
     float diffuse = max(dot(lVec, bump), 0.0); 
     vec4 vDiffuse = gl_FrontLightProduct[i].diffuse * diffuse * base; 
     final_color += vDiffuse; 

     float specular = pow(clamp(dot(R, lVec), 0.0, 1.0), gl_FrontMaterial.shininess); 
     vec4 vSpecular = gl_FrontLightProduct[i].specular * specular * diffuse; 
     final_color += vSpecular; 
    } 

    gl_FragColor = final_color; 
} 

다른 문제 (이 내가 할 필요는 없다 N

glBegin(GL_QUADS); 
    glNormal3f(0.0f, 0.0f, 1.0f); 
    glTexCoord2f(0.0, 0.0); glVertex3f(-1.0f, 0.0f, 1.0f); 
    glTexCoord2f(0.0, 1.0); glVertex3f(-1.0f, 2.0f, 1.0f); 
    glTexCoord2f(1.0, 1.0); glVertex3f(1.0f, 2.0f, 1.0f); 
    glTexCoord2f(1.0, 0.0); glVertex3f(1.0f, 0.0f, 1.0f); 
glEnd(); 
glBegin(GL_QUADS); 
    glNormal3f(-1.0f, 0.0f, 0.0f); 
    glTexCoord2f(0.0, 0.0); glVertex3f(-1.0f, 0.0f, 1.0f); 
    glTexCoord2f(0.0, 1.0); glVertex3f(-1.0f, 2.0f, 1.0f); 
    glTexCoord2f(1.0, 1.0); glVertex3f(-1.0f, 2.0f, -1.0f); 
    glTexCoord2f(1.0, 0.0); glVertex3f(-1.0f, 0.0f, -1.0f); 
glEnd(); 

버텍스 쉐이더 : 여기

몇 가지 간단한 테스트 기하학) 바로이 순간을 해결하기 EED는 방향 빛의 반사가 어디 당신이 실제로 이 값을 제공 할 카메라

+0

예상했던 것과 비교하면 어떤 일이 발생합니까? – slugonamission

+1

쉐이더에'# version' 지시자가 없습니다. 셰이더를 컴파일하는 데 필요합니다. – pmr

+0

x 방향으로 향하는 두 번째 지오메트리 세트에서 노멀 매핑이 작동하는 것을 기대하고있었습니다. – grep

답변

2
attribute vec4 glTangent4f; 

에 따라 것입니까? 버텍스 속성이지만 렌더링 코드가 아무 것도 제공하지 않는 것 같습니다.

+0

이 코드는 시작하기에 좋은 곳이 될 것이므로 코드를 확인해 보겠습니다. – grep

+0

이 서피스 탄젠트를 프로그램에 전달하는 방법은 무엇입니까? – grep

0

"이 곡면을 프로그램에 전달하는 방법은 무엇입니까?"

개체의 접선 기준을 계산 했습니까? 웨이브 프론트 오브젝트에는 일반적으로 정점 접선 데이터가 포함되어 있지 않으며,이 경우 웨이브 프론트 데이터를 파싱 한 후 접선 기초를 계산해야한다는 것을 기억합니다. 코드의 외양에서 접선 데이터가 전혀없는 것 같습니다.

꼭지점 셰이더에서 접선 근사를 할 수 있으며, 법선 만 사용하면됩니다.

VBO를 사용하지 않기 때문에 프로그램에 접하는 데이터를 전달하는 방법을 실제로 알지 못합니다.

편집 :

나는 당신이없는 3 차원 파일 형식에서 데이터를로드하는 바보 전제를 한 것으로 지금은 볼 수 있지만, 당신은 여전히 ​​어딘가에 탄젠트를 계산해야합니다.