2016-12-23 1 views
0

내 버텍스 쉐이더 내 매우 단순한 조명 기능에서 오류를 찾기 위해 사투를 벌인거야 :이 기능은 회전 icosphere의 얼굴을 조명하는 데 사용됩니다쉐이더에서 조명 기능에 문제가 있습니까?

in vec4 position;   /* Homogenized input vertex position.   */ 
in vec4 color;    /* Input color information.      */ 
in vec3 normal;    /* Normal vector to the surface.    */ 

uniform mat4 ortho;   /* Orthographic matrix.   */ 
uniform mat4 model;   /* Modelling matrix.   */ 
uniform mat4 view;   /* View transformation.   */ 
uniform mat4 project;  /* Projection matrix.   */ 

out vec4 color_out;   /* Color passed to the fragment shader. */ 

float light() 
{ 
    mat3 normat = transpose(inverse(mat3(view * model))); 
    vec3 norm = normalize(normat * normalize(normal)); 
    vec3 light = normalize(vec3(1.0f, 1.0f, 1.0f)); 
    return max(dot(norm, light), 0.0f); 
} 
void main() 
{ 
    gl_Position = ortho * project * view * model * position; 
    color_out = vec4(color.rgb * light(), color.a); 
} 

. 에도 불구하고

Normal Matrix:     Normal vectors for face 10: 
[ 0.08  0.59 -0.81]  { 3936}[-0.58  0.61 -0.54] --> light: 0.694 
[-0.00  0.81  0.59]  { 3937}[-0.58  0.61 -0.54] --> light: 0.694 
[ 1.00 -0.04  0.06]  { 3938}[-0.58  0.61 -0.54] --> light: 0.694 

: 내가 수동으로 icosphere의 정점을 생성 한 나는 언제든지 액세스 할 수 있기 때문에, 나는 예를 들어, 한면에 대한 결과를 보여주는 CPU 코드에서 동일한 작업을 복제하려고했습니다 법선 벡터가 정확하거나 옳지 않다면, 빛 값은 구형 회전에 따라 변합니다. 그러나 코드를 실행하여 셰이더가 값을 계산하게하면 결과 삼각형면이 완전히 어둡게 보입니다. ... 바보 나

/* (...) Bind shader, and get attribute locations. */ 
/* (...) Create VBO. */ 
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vertex), vertices.data(), GL_DYNAMIC_DRAW); 
/* (...) */ 

glVertexAttribPointer(position_id, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0); 
glVertexAttribPointer(color_id, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void *)sizeof(glm::vec3)); 
glVertexAttribPointer(normal_id, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void *)(sizeof(glm::vec3) + sizeof(glm::vec4))); 

/* For reference: vertices is a std::vector<Vertex>, where Vertex 
* is defined as: 
* 
* struct Vertex { 
*  glm::vec3 p; ---> Position. 
*  glm::vec4 c; ---> Color.  
*  glm::vec3 n; ---> Normal. 
* }; 
**/ 

답변

0

, 내가 정상 정점 속성을 사용하는 것을 잊었다이 내가 있던 라인 : 나는 버퍼에 정점 데이터를 복사하고 어떻게 속성을 가리 킵니다 방법

이입니다 실종 :

normal_id 이전 glGetAttribLocation로 구속했다
glEnableVertexAttribArray(normal_id); 

.

관련 문제