Note that there are some explanatory texts on larger screens.

plurals
  1. POPer vertex lighting problems in opengl 4
    primarykey
    data
    text
    <p>I have a model made of cubes with 8 vertices only, and I am having issues with per vertex directional lighting. Instead of the entire model being lit at once, each cube seems to be lit separately like <a href="http://screencloud.net/v/z5gG" rel="nofollow">this</a>.</p> <p>This is my vertex shader:</p> <pre><code>layout(location = 0)in vec3 vp; layout(location = 1)in vec3 color; layout(location = 2)in vec3 normal; out vec3 fColor; uniform mat4 model; uniform mat3 nm; uniform mat3 partNM; uniform mat4 modelPart; uniform mat4 view; uniform mat4 projection; void main () { gl_Position = modelPart * vec4(vp, 1.0f); gl_Position = model * gl_Position; gl_Position = view * gl_Position; gl_Position = projection * gl_Position; mat3 normalMatrix = partNM*nm; vec3 normalDirection = normalize(normalMatrix*normal); vec3 lightDirection = normalize(vec3(-1.0, 1.0, -1.0)); vec3 diffuseReflection = clamp(dot(normalDirection, lightDirection),0.0,1.0); fColor = color+diffuseReflection; } </code></pre> <p>and my fragment shader:</p> <pre><code>in vec3 fColor; out vec4 frag_colour; void main () { frag_colour = vec4(fColor.xyz,1.0); } </code></pre> <p>This is the function I use to set the normal matrix:</p> <pre><code>void Shader::setNormalMatrix(string name,glm::mat4 matrix) { glm::mat3 nm = glm::transpose(glm::inverse(glm::mat3(matrix))); unsigned int location = glGetUniformLocation(program, name.c_str()); glUniformMatrix3fv(location, 1, false, &amp;nm[0][0]); } </code></pre> <p>and the function which generates the vertices and normals for my cubes:</p> <pre><code>std::vector&lt;float&gt; Cube::createCube(float size,float x,float y,float z,float r, float g, float b) { VertexType points[8]; points[0].x = (x*size)+0.0f; points[0].y = (y*size)+0.0f; points[0].z = (z*size)+size; points[0].nx = 0.577350; points[0].ny = 0.577350; points[0].nz = -0.577350; points[0].r = r; points[0].g = g; points[0].b = b; points[1].x = (x*size)+size; points[1].y = (y*size)+0.0f; points[1].z = (z*size)+size; points[1].nx = -0.577350; points[1].ny = 0.577350; points[1].nz = -0.577350; points[1].r = r; points[1].g = g; points[1].b = b; points[2].x = (x*size)+size; points[2].y = (y*size)+size; points[2].z = (z*size)+size; points[2].nx = -0.577350; points[2].ny = -0.577350; points[2].nz = -0.577350; points[2].r = r; points[2].g = g; points[2].b = b; points[3].x = (x*size)+0.0f; points[3].y = (y*size)+size; points[3].z = (z*size)+size; points[3].nx = 0.577350; points[3].ny = -0.577350; points[3].nz = -0.577350; points[3].r = r; points[3].g = g; points[3].b = b; points[4].x = (x*size)+0.0f; points[4].y = (y*size)+0.0f; points[4].z = (z*size)+0.0f; points[4].nx = 0.577350; points[4].ny = 0.577350; points[4].nz = 0.577350; points[4].r = r; points[4].g = g; points[4].b = b; points[5].x = (x*size)+size; points[5].y = (y*size)+0.0f; points[5].z = (z*size)+0.0f; points[5].nx = -0.577350; points[5].ny = 0.577350; points[5].nz = 0.577350; points[5].r = r; points[5].g = g; points[5].b = b; points[6].x = (x*size)+size; points[6].y = (y*size)+size; points[6].z = (z*size)+0.0f; points[6].nx = -0.577350; points[6].ny = -0.577350; points[6].nz = 0.577350; points[6].r = r; points[6].g = g; points[6].b = b; points[7].x = (x*size)+0.0f; points[7].y = (y*size)+size; points[7].z = (z*size)+0.0f; points[7].nx = 0.577350; points[7].ny = -0.577350; points[7].nz = 0.577350; points[7].r = r; points[7].g = g; points[7].b = b; std::vector&lt;float&gt; rPoint; for(VertexType p:points) { rPoint.push_back(p.x); rPoint.push_back(p.y); rPoint.push_back(p.z); rPoint.push_back(p.r); rPoint.push_back(p.g); rPoint.push_back(p.b); rPoint.push_back(p.nx); rPoint.push_back(p.ny); rPoint.push_back(p.nz); } return rPoint; } </code></pre> <p>The models are divided up into parts, which is why I have two normal and model matrices; one for the model as a whole, and one for an individual piece of the model. Is there a problem with my code, or do I need to use per-fragment lighting to fix this bug?</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload