My vertex shader
<code>#version 330 core
layout (location = 0) in vec3 aPosition;
layout (location = 1) in vec3 aColor;
layout (location = 2) in vec2 aTexCoord;
layout (location = 3) in vec3 aNormal;
out vec3 vertexColor;
out vec2 texCoord;
out vec3 Normal;
out vec3 FragPos;
uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;
uniform vec3 lightPos;
uniform vec3 lightColor;
void main() {
vertexColor = aColor;
texCoord = aTexCoord;
vec3 FragPos = vec3(model * vec4(aPosition, 1.0));
Normal = mat3(transpose(inverse(model))) * aNormal;
//Normal = aNormal;
gl_Position = projection * view* model * vec4(aPosition, 1.0);
}
</code>
<code>#version 330 core
layout (location = 0) in vec3 aPosition;
layout (location = 1) in vec3 aColor;
layout (location = 2) in vec2 aTexCoord;
layout (location = 3) in vec3 aNormal;
out vec3 vertexColor;
out vec2 texCoord;
out vec3 Normal;
out vec3 FragPos;
uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;
uniform vec3 lightPos;
uniform vec3 lightColor;
void main() {
vertexColor = aColor;
texCoord = aTexCoord;
vec3 FragPos = vec3(model * vec4(aPosition, 1.0));
Normal = mat3(transpose(inverse(model))) * aNormal;
//Normal = aNormal;
gl_Position = projection * view* model * vec4(aPosition, 1.0);
}
</code>
#version 330 core
layout (location = 0) in vec3 aPosition;
layout (location = 1) in vec3 aColor;
layout (location = 2) in vec2 aTexCoord;
layout (location = 3) in vec3 aNormal;
out vec3 vertexColor;
out vec2 texCoord;
out vec3 Normal;
out vec3 FragPos;
uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;
uniform vec3 lightPos;
uniform vec3 lightColor;
void main() {
vertexColor = aColor;
texCoord = aTexCoord;
vec3 FragPos = vec3(model * vec4(aPosition, 1.0));
Normal = mat3(transpose(inverse(model))) * aNormal;
//Normal = aNormal;
gl_Position = projection * view* model * vec4(aPosition, 1.0);
}
My fragment shader:
<code>#version 330 core
in vec3 vertexColor;
in vec3 Normal;
in vec2 texCoord;
in vec3 FragPos;
uniform vec4 emat;
uniform vec4 amat;
uniform vec4 dmat;
uniform vec4 smat;
uniform float shininess;
out vec4 FragColor;
uniform vec3 lightPos;
uniform vec3 lightColor;
uniform vec3 objColor;
uniform vec3 viewPos;
uniform sampler2D texture1;
void main() {
float ambientStrength = 0.1f;
vec3 ambient = ambientStrength * lightColor;
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(lightPos - FragPos);
float diff = max(dot(norm, lightDir), 0.0f);
//float diff = max(dot(lightDir, normalize(vec3(1.0, 1.0, 1.0))), 0.0);
vec3 diffuse = diff * lightColor;
//vec3 color = diff * lightColor;
vec3 viewDir = normalize(viewPos - FragPos);
vec3 reflectDir = reflect(-lightDir, norm);
float specularStrentgh = 0.5f;
float spec = pow(max(dot(viewDir, reflectDir), 0.0f), shininess);
vec3 specular = specularStrentgh * spec * lightColor;
vec3 result = (ambient + diffuse + specular) * vertexColor;
//vec3 result = (ambient + diffuse)* vertexColor; //* objColor. Needs that.
FragColor = vec4(result, 1.0f);
//FragColor = texture(texture1, texCoord) * vec4(result, 1.0);
//vec3 result = ambient;
//gl_FragColor = vec4(result, 1.0);
}
</code>
<code>#version 330 core
in vec3 vertexColor;
in vec3 Normal;
in vec2 texCoord;
in vec3 FragPos;
uniform vec4 emat;
uniform vec4 amat;
uniform vec4 dmat;
uniform vec4 smat;
uniform float shininess;
out vec4 FragColor;
uniform vec3 lightPos;
uniform vec3 lightColor;
uniform vec3 objColor;
uniform vec3 viewPos;
uniform sampler2D texture1;
void main() {
float ambientStrength = 0.1f;
vec3 ambient = ambientStrength * lightColor;
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(lightPos - FragPos);
float diff = max(dot(norm, lightDir), 0.0f);
//float diff = max(dot(lightDir, normalize(vec3(1.0, 1.0, 1.0))), 0.0);
vec3 diffuse = diff * lightColor;
//vec3 color = diff * lightColor;
vec3 viewDir = normalize(viewPos - FragPos);
vec3 reflectDir = reflect(-lightDir, norm);
float specularStrentgh = 0.5f;
float spec = pow(max(dot(viewDir, reflectDir), 0.0f), shininess);
vec3 specular = specularStrentgh * spec * lightColor;
vec3 result = (ambient + diffuse + specular) * vertexColor;
//vec3 result = (ambient + diffuse)* vertexColor; //* objColor. Needs that.
FragColor = vec4(result, 1.0f);
//FragColor = texture(texture1, texCoord) * vec4(result, 1.0);
//vec3 result = ambient;
//gl_FragColor = vec4(result, 1.0);
}
</code>
#version 330 core
in vec3 vertexColor;
in vec3 Normal;
in vec2 texCoord;
in vec3 FragPos;
uniform vec4 emat;
uniform vec4 amat;
uniform vec4 dmat;
uniform vec4 smat;
uniform float shininess;
out vec4 FragColor;
uniform vec3 lightPos;
uniform vec3 lightColor;
uniform vec3 objColor;
uniform vec3 viewPos;
uniform sampler2D texture1;
void main() {
float ambientStrength = 0.1f;
vec3 ambient = ambientStrength * lightColor;
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(lightPos - FragPos);
float diff = max(dot(norm, lightDir), 0.0f);
//float diff = max(dot(lightDir, normalize(vec3(1.0, 1.0, 1.0))), 0.0);
vec3 diffuse = diff * lightColor;
//vec3 color = diff * lightColor;
vec3 viewDir = normalize(viewPos - FragPos);
vec3 reflectDir = reflect(-lightDir, norm);
float specularStrentgh = 0.5f;
float spec = pow(max(dot(viewDir, reflectDir), 0.0f), shininess);
vec3 specular = specularStrentgh * spec * lightColor;
vec3 result = (ambient + diffuse + specular) * vertexColor;
//vec3 result = (ambient + diffuse)* vertexColor; //* objColor. Needs that.
FragColor = vec4(result, 1.0f);
//FragColor = texture(texture1, texCoord) * vec4(result, 1.0);
//vec3 result = ambient;
//gl_FragColor = vec4(result, 1.0);
}
my draw scenegraph function:
<code>void drawSceneGraph(entity *node, GLuint program) {
if(node == NULL){
printf("drawSceneGraph skipped!n");
return;
}
//only draw visible objects
if(node->VBO != 0) {
GLint transformUniform = glGetUniformLocation(program, "model");
GLfloat *modelMatrix = malloc(sizeof(GLfloat)*16);
for (int i = 0; i < 16; i++) modelMatrix[i] = 0.0f;
getGlobalModelMatrix(node, modelMatrix);
glUniformMatrix4fv(transformUniform, 1, GL_FALSE, modelMatrix);
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindBuffer(GL_ARRAY_BUFFER, node->VBO);
glVertexAttribPointer(
0,
4,
GL_FLOAT,
GL_FALSE,
sizeof(GLfloat)*10,
0
);
glEnableVertexAttribArray(0);
glVertexAttribPointer(
1,
3,
GL_FLOAT,
GL_FALSE,
sizeof(GLfloat)*10,
(GLvoid*)(7 * sizeof(GLfloat))
);
glEnableVertexAttribArray(1);
glVertexAttribPointer(
2,
3,
GL_FLOAT,
GL_FALSE,
sizeof(GLfloat)*10,
(GLvoid*)(4 * sizeof(GLfloat))
);
glEnableVertexAttribArray(2);
glVertexAttribPointer(
3,
3,
GL_FLOAT,
GL_FALSE,
sizeof(GLfloat) * 11,
(GLvoid*)(3 * sizeof(GLfloat))
);
glEnableVertexAttribArray(3);
glEnableVertexAttribArray(2);
glDrawArrays(GL_TRIANGLES, 0, 2000000);
glBindBuffer(GL_ARRAY_BUFFER,0);
free(modelMatrix);
}
for (int i = 0; i < node->numberOfChildren; i++) {
drawSceneGraph(node->children+i, program);
}
}
</code>
<code>void drawSceneGraph(entity *node, GLuint program) {
if(node == NULL){
printf("drawSceneGraph skipped!n");
return;
}
//only draw visible objects
if(node->VBO != 0) {
GLint transformUniform = glGetUniformLocation(program, "model");
GLfloat *modelMatrix = malloc(sizeof(GLfloat)*16);
for (int i = 0; i < 16; i++) modelMatrix[i] = 0.0f;
getGlobalModelMatrix(node, modelMatrix);
glUniformMatrix4fv(transformUniform, 1, GL_FALSE, modelMatrix);
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindBuffer(GL_ARRAY_BUFFER, node->VBO);
glVertexAttribPointer(
0,
4,
GL_FLOAT,
GL_FALSE,
sizeof(GLfloat)*10,
0
);
glEnableVertexAttribArray(0);
glVertexAttribPointer(
1,
3,
GL_FLOAT,
GL_FALSE,
sizeof(GLfloat)*10,
(GLvoid*)(7 * sizeof(GLfloat))
);
glEnableVertexAttribArray(1);
glVertexAttribPointer(
2,
3,
GL_FLOAT,
GL_FALSE,
sizeof(GLfloat)*10,
(GLvoid*)(4 * sizeof(GLfloat))
);
glEnableVertexAttribArray(2);
glVertexAttribPointer(
3,
3,
GL_FLOAT,
GL_FALSE,
sizeof(GLfloat) * 11,
(GLvoid*)(3 * sizeof(GLfloat))
);
glEnableVertexAttribArray(3);
glEnableVertexAttribArray(2);
glDrawArrays(GL_TRIANGLES, 0, 2000000);
glBindBuffer(GL_ARRAY_BUFFER,0);
free(modelMatrix);
}
for (int i = 0; i < node->numberOfChildren; i++) {
drawSceneGraph(node->children+i, program);
}
}
</code>
void drawSceneGraph(entity *node, GLuint program) {
if(node == NULL){
printf("drawSceneGraph skipped!n");
return;
}
//only draw visible objects
if(node->VBO != 0) {
GLint transformUniform = glGetUniformLocation(program, "model");
GLfloat *modelMatrix = malloc(sizeof(GLfloat)*16);
for (int i = 0; i < 16; i++) modelMatrix[i] = 0.0f;
getGlobalModelMatrix(node, modelMatrix);
glUniformMatrix4fv(transformUniform, 1, GL_FALSE, modelMatrix);
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindBuffer(GL_ARRAY_BUFFER, node->VBO);
glVertexAttribPointer(
0,
4,
GL_FLOAT,
GL_FALSE,
sizeof(GLfloat)*10,
0
);
glEnableVertexAttribArray(0);
glVertexAttribPointer(
1,
3,
GL_FLOAT,
GL_FALSE,
sizeof(GLfloat)*10,
(GLvoid*)(7 * sizeof(GLfloat))
);
glEnableVertexAttribArray(1);
glVertexAttribPointer(
2,
3,
GL_FLOAT,
GL_FALSE,
sizeof(GLfloat)*10,
(GLvoid*)(4 * sizeof(GLfloat))
);
glEnableVertexAttribArray(2);
glVertexAttribPointer(
3,
3,
GL_FLOAT,
GL_FALSE,
sizeof(GLfloat) * 11,
(GLvoid*)(3 * sizeof(GLfloat))
);
glEnableVertexAttribArray(3);
glEnableVertexAttribArray(2);
glDrawArrays(GL_TRIANGLES, 0, 2000000);
glBindBuffer(GL_ARRAY_BUFFER,0);
free(modelMatrix);
}
for (int i = 0; i < node->numberOfChildren; i++) {
drawSceneGraph(node->children+i, program);
}
}
And my draw():
<code>void draw(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(program);
//TODO: Eventuell ein struct in camera.c erstellen zum speichern dieser Werte, ebenso wie fovy near und far weiter unten
//camera perspektive bestimmen.
//updateCamera(&c);
//neueCamera();
camerarotation();
Vec3 cameraPosition = {cameraKreis_X, 1.0f, cameraKreis_Y,};
Vec3 cameraTarget = {0.0f, 0.0f, 0.0f};
Vec3 cameraUp = {0.0f, 1.0f, 0.0f};
Mat4 matrix;
lookAt(matrix, cameraPosition, cameraTarget, cameraUp);
GLint viewLocation = glGetUniformLocation(program, "view");
glUniformMatrix4fv(viewLocation, 1, GL_FALSE, matrix);
Mat4 pMatrix;
GLfloat fovy = 90.0f;
GLfloat aspect = (float)windowSize[0] / windowSize[1];
GLfloat near = 0.3f;
GLfloat far = 10.0f;
perspective(pMatrix, fovy, aspect, near, far);
GLint projectionLocation = glGetUniformLocation(program, "projection");
glUniformMatrix4fv(projectionLocation, 1, GL_FALSE, pMatrix);
glBindVertexArray(vao);
glUniform3f(glGetUniformLocation(program, "lightPos"), 1.2f, 1.0f, 2.0f);
glUniform3f(glGetUniformLocation(program, "lightColor"), 1.0f, 1.0f, 1.0f);
glUniform3f(glGetUniformLocation(program, "viewPos"), 0.0f, 0.0f, 3.0f);
glUniform3f(glGetUniformLocation(program, "amat"), 0.0f, 0.0f, 0.0f);
glUniform3f(glGetUniformLocation(program, "dmat"), 0.0f, 0.0f, 0.0f);
glUniform3f(glGetUniformLocation(program, "smat"), 0.5f, 0.5f, 0.5f);
glUniform1f(glGetUniformLocation(program, "shininess"), 32.0f);
/* float lightPos[] = {3.0f, 3.0f, 10.0f};
float lightColor[] = {1.0f, 0.0f, 0.0f};
GLuint lightPosLocation = glGetUniformLocation(program, "lightPos");
glUniform3fv(lightPosLocation, 1, lightPos);
GLuint lightColorLocation = glGetUniformLocation(program, "lightColor");
glUniform3fv(lightColorLocation, 1, lightColor); */
drawSceneGraph(scenegraph, program);
}
</code>
<code>void draw(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(program);
//TODO: Eventuell ein struct in camera.c erstellen zum speichern dieser Werte, ebenso wie fovy near und far weiter unten
//camera perspektive bestimmen.
//updateCamera(&c);
//neueCamera();
camerarotation();
Vec3 cameraPosition = {cameraKreis_X, 1.0f, cameraKreis_Y,};
Vec3 cameraTarget = {0.0f, 0.0f, 0.0f};
Vec3 cameraUp = {0.0f, 1.0f, 0.0f};
Mat4 matrix;
lookAt(matrix, cameraPosition, cameraTarget, cameraUp);
GLint viewLocation = glGetUniformLocation(program, "view");
glUniformMatrix4fv(viewLocation, 1, GL_FALSE, matrix);
Mat4 pMatrix;
GLfloat fovy = 90.0f;
GLfloat aspect = (float)windowSize[0] / windowSize[1];
GLfloat near = 0.3f;
GLfloat far = 10.0f;
perspective(pMatrix, fovy, aspect, near, far);
GLint projectionLocation = glGetUniformLocation(program, "projection");
glUniformMatrix4fv(projectionLocation, 1, GL_FALSE, pMatrix);
glBindVertexArray(vao);
glUniform3f(glGetUniformLocation(program, "lightPos"), 1.2f, 1.0f, 2.0f);
glUniform3f(glGetUniformLocation(program, "lightColor"), 1.0f, 1.0f, 1.0f);
glUniform3f(glGetUniformLocation(program, "viewPos"), 0.0f, 0.0f, 3.0f);
glUniform3f(glGetUniformLocation(program, "amat"), 0.0f, 0.0f, 0.0f);
glUniform3f(glGetUniformLocation(program, "dmat"), 0.0f, 0.0f, 0.0f);
glUniform3f(glGetUniformLocation(program, "smat"), 0.5f, 0.5f, 0.5f);
glUniform1f(glGetUniformLocation(program, "shininess"), 32.0f);
/* float lightPos[] = {3.0f, 3.0f, 10.0f};
float lightColor[] = {1.0f, 0.0f, 0.0f};
GLuint lightPosLocation = glGetUniformLocation(program, "lightPos");
glUniform3fv(lightPosLocation, 1, lightPos);
GLuint lightColorLocation = glGetUniformLocation(program, "lightColor");
glUniform3fv(lightColorLocation, 1, lightColor); */
drawSceneGraph(scenegraph, program);
}
</code>
void draw(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(program);
//TODO: Eventuell ein struct in camera.c erstellen zum speichern dieser Werte, ebenso wie fovy near und far weiter unten
//camera perspektive bestimmen.
//updateCamera(&c);
//neueCamera();
camerarotation();
Vec3 cameraPosition = {cameraKreis_X, 1.0f, cameraKreis_Y,};
Vec3 cameraTarget = {0.0f, 0.0f, 0.0f};
Vec3 cameraUp = {0.0f, 1.0f, 0.0f};
Mat4 matrix;
lookAt(matrix, cameraPosition, cameraTarget, cameraUp);
GLint viewLocation = glGetUniformLocation(program, "view");
glUniformMatrix4fv(viewLocation, 1, GL_FALSE, matrix);
Mat4 pMatrix;
GLfloat fovy = 90.0f;
GLfloat aspect = (float)windowSize[0] / windowSize[1];
GLfloat near = 0.3f;
GLfloat far = 10.0f;
perspective(pMatrix, fovy, aspect, near, far);
GLint projectionLocation = glGetUniformLocation(program, "projection");
glUniformMatrix4fv(projectionLocation, 1, GL_FALSE, pMatrix);
glBindVertexArray(vao);
glUniform3f(glGetUniformLocation(program, "lightPos"), 1.2f, 1.0f, 2.0f);
glUniform3f(glGetUniformLocation(program, "lightColor"), 1.0f, 1.0f, 1.0f);
glUniform3f(glGetUniformLocation(program, "viewPos"), 0.0f, 0.0f, 3.0f);
glUniform3f(glGetUniformLocation(program, "amat"), 0.0f, 0.0f, 0.0f);
glUniform3f(glGetUniformLocation(program, "dmat"), 0.0f, 0.0f, 0.0f);
glUniform3f(glGetUniformLocation(program, "smat"), 0.5f, 0.5f, 0.5f);
glUniform1f(glGetUniformLocation(program, "shininess"), 32.0f);
/* float lightPos[] = {3.0f, 3.0f, 10.0f};
float lightColor[] = {1.0f, 0.0f, 0.0f};
GLuint lightPosLocation = glGetUniformLocation(program, "lightPos");
glUniform3fv(lightPosLocation, 1, lightPos);
GLuint lightColorLocation = glGetUniformLocation(program, "lightColor");
glUniform3fv(lightColorLocation, 1, lightColor); */
drawSceneGraph(scenegraph, program);
}
teapot light
I don’t understand why my teapot has only half its vertices blacked out. Can somebody help me out?
I followed very clearly the description of learnOpenGL.
I followed the instructions of learnOpenGl.com the only difference is that my object is a teapot.
What do I do wrong?