简体   繁体   English

我的着色器中的照明功能出了什么问题?

[英]What's wrong with my lighting function in the shader?

I'm struggling to find the error in my ultra-simplistic lighting function in my vertex shader: 我正在努力在我的顶点着色器中找到超简化照明功能中的错误:

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);
}

This function is used to illuminate the faces of a rotating icosphere. 此功能用于照亮旋转的icosphere的面。 Since I've manually generated the vertices of the icosphere and I can access them at any time, I've tried to replicate the same operation in CPU code showing the result for one face, eg: 由于我已经手动生成了icosphere的顶点,并且可以随时访问它们,因此我尝试在CPU代码中复制相同的操作,以显示一张脸的结果,例如:

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

Despite the normal vectors being correct or not, the light value does change with the sphere rotation. 尽管法向矢量正确与否,但光照值的确会随着球体旋转而变化。 However, if I run the code (and let the shader compute the value), the resulting triangular faces appear completely dark. 但是,如果我运行代码(并让着色器计算值),则生成的三角形面将显示为完全黑暗。

This is how I copy vertex data to the buffer and how I point the attributes: 这是将顶点数据复制到缓冲区以及如何指向属性的方法:

/* (...) 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.   
 * };
 **/

Silly me, I forgot to enable the normal vertex attribute... This is the line I was missing: 愚蠢的我,我忘了启用普通顶点属性...这是我所缺少的行:

glEnableVertexAttribArray(normal_id);

Where the normal_id had previously been bound with glGetAttribLocation . 其中normal_id之前已与glGetAttribLocation绑定。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM