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는 방향 빛의 반사가 어디 당신이 실제로 가이 값을 제공 할 카메라
예상했던 것과 비교하면 어떤 일이 발생합니까? – slugonamission
쉐이더에'# version' 지시자가 없습니다. 셰이더를 컴파일하는 데 필요합니다. – pmr
x 방향으로 향하는 두 번째 지오메트리 세트에서 노멀 매핑이 작동하는 것을 기대하고있었습니다. – grep