World mesh loads; working on diffuse shader

This commit is contained in:
Adog64 2023-12-19 12:11:04 -05:00
parent 53c6256e9c
commit 46bde19035
8 changed files with 145 additions and 72 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -66,7 +66,7 @@ int main()
glGenVertexArrays(1, &vertexArrayID);
glBindVertexArray(vertexArrayID);
//glEnable(GL_DEPTH_TEST);
GLuint programID = loadShaders( "src/shader.vert", "src/shader.frag" );
GLuint matrixID = glGetUniformLocation(programID, "MVP");
@ -92,7 +92,7 @@ int main()
do
{
glClear( GL_COLOR_BUFFER_BIT );
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
mat4s view = glms_lookat(eye, center, up);
mat4s model = glms_mat4_identity();
@ -133,75 +133,37 @@ int main()
return 0;
}
GLuint loadShaders(const char* vertexShaderPath, const char* fragmentShaderPath)
{
char* vertexShaderCode = readTextFile( vertexShaderPath );
char* fragmentShaderCode = readTextFile( fragmentShaderPath );
GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER);
GLuint fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
GLint result = GL_FALSE;
int infoLogLength;
printf("Compiling vertex shader...\n");
glShaderSource(vertexShaderID, 1, &vertexShaderCode, NULL);
glCompileShader(vertexShaderID);
glGetShaderiv(vertexShaderID, GL_COMPILE_STATUS, &result);
glGetShaderiv(vertexShaderID, GL_INFO_LOG_LENGTH, &infoLogLength);
if( infoLogLength > 0 )
{
char vertexShaderErrorMessage[infoLogLength + 1];
glGetShaderInfoLog(vertexShaderID, infoLogLength, NULL, &vertexShaderErrorMessage);
printf("%s\n", &vertexShaderErrorMessage);
}
printf("Compiling fragment shader...\n");
glShaderSource(fragmentShaderID, 1, &fragmentShaderCode, NULL);
glCompileShader(fragmentShaderID);
glGetShaderiv(fragmentShaderID, GL_COMPILE_STATUS, &result);
glGetShaderiv(fragmentShaderID, GL_INFO_LOG_LENGTH, &infoLogLength);
if( infoLogLength > 0 )
{
char fragmentShaderErrorMessage[infoLogLength + 1];
glGetShaderInfoLog(fragmentShaderID, infoLogLength, NULL, &fragmentShaderErrorMessage);
printf("%s\n", &fragmentShaderErrorMessage);
}
printf("Linking program\n");
GLuint programID = glCreateProgram();
glAttachShader(programID, vertexShaderID);
glAttachShader(programID, fragmentShaderID);
glLinkProgram(programID);
glGetProgramiv(programID, GL_LINK_STATUS, &result);
glGetProgramiv(programID, GL_INFO_LOG_LENGTH, &infoLogLength);
if( infoLogLength > 0 )
{
char programErrorMessage[infoLogLength + 1];
glGetProgramInfoLog(programID, infoLogLength, NULL, &programErrorMessage);
printf("%s\n", &programErrorMessage);
}
free( vertexShaderCode );
free( fragmentShaderCode );
glDetachShader( programID, vertexShaderID );
glDetachShader( programID, fragmentShaderID );
glDeleteShader( vertexShaderID );
glDeleteShader( fragmentShaderID );
return programID;
}
void setVertexBufferData(GLfloat* vertices, unsigned int* triangles, unsigned int triangleCount)
{
for( int i = 0; i < triangleCount; ++i )
vec3s triangleVerts[3];
int startingIndex;
for( unsigned int i = 0; i < triangleCount; i+=3 )
{
vertexBufferData[i*3] = vertices[triangles[i]*3];
vertexBufferData[i*3 + 1] = vertices[triangles[i]*3 + 1];
vertexBufferData[i*3 + 2] = vertices[triangles[i]*3 + 2];
startingIndex = i*6;
for( int j = 0; j < 3; ++j )
{
triangleVerts[j].x = vertices[triangles[i+j]*3];
triangleVerts[j].y = vertices[triangles[i+j]*3 + 1];
triangleVerts[j].z = vertices[triangles[i+j]*3 + 2];
vertexBufferData[startingIndex + j*6] = triangleVerts[j].x;
vertexBufferData[startingIndex + j*6 + 1] = triangleVerts[j].y;
vertexBufferData[startingIndex + j*6 + 2] = triangleVerts[j].z;
}
vec3s normal = glms_vec3_crossn(glms_vec3_sub(triangleVerts[0], triangleVerts[1]),
glms_vec3_sub(triangleVerts[0], triangleVerts[2]));
vertexBufferData[startingIndex + 3] = normal.x;
vertexBufferData[startingIndex + 4] = normal.y;
vertexBufferData[startingIndex + 5] = normal.z;
vertexBufferData[startingIndex + 9] = normal.x;
vertexBufferData[startingIndex + 10] = normal.y;
vertexBufferData[startingIndex + 11] = normal.z;
vertexBufferData[startingIndex + 15] = normal.x;
vertexBufferData[startingIndex + 16] = normal.y;
vertexBufferData[startingIndex + 17] = normal.z;
}
}

View File

@ -1,7 +1,24 @@
#version 330 core
// Ouput data
out vec3 color;
out vec4 FragColor;
in vec3 Normal;
in vec3 FragPos;
uniform vec3 lightPos;
uniform vec3 viewPos;
uniform vec3 lightColor;
uniform vec3 objectColor;
void main()
{
color = vec3(1,1,1);
float ambientStrength = 0.1;
vec3 ambient = ambientStrength * lightColor;
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(lightPos - FragPos);
float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = diff * lightColor;
vec3 result = (ambient + diffuse) * objectColor;
FragColor = vec4(result, 1.0);
}

View File

@ -1,9 +1,15 @@
#version 330 core
layout(location = 0) in vec3 vertexPosition_modelspace;
layout(location = 0) in vec3 aPos;
layout(location = 1) in vec3 aNormal;
out vec3 Normal;
uniform mat4 MVP;
void main(){
gl_Position = MVP * vec4(vertexPosition_modelspace,1);
FragPos = vec3(model * vec4(aPos, 1.0));
Normal = mat3(transpose(inverse(model))) * aNormal;
gl_Position = MVP * vec4(aPos, 1.0);
}

64
src/shaders.c Normal file
View File

@ -0,0 +1,64 @@
GLuint loadShaders(const char* vertexShaderPath, const char* fragmentShaderPath)
{
char* vertexShaderCode = readTextFile( vertexShaderPath );
char* fragmentShaderCode = readTextFile( fragmentShaderPath );
GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER);
GLuint fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
GLint result = GL_FALSE;
int infoLogLength;
printf("Compiling vertex shader...\n");
glShaderSource(vertexShaderID, 1, &vertexShaderCode, NULL);
glCompileShader(vertexShaderID);
glGetShaderiv(vertexShaderID, GL_COMPILE_STATUS, &result);
glGetShaderiv(vertexShaderID, GL_INFO_LOG_LENGTH, &infoLogLength);
if( infoLogLength > 0 )
{
char vertexShaderErrorMessage[infoLogLength + 1];
glGetShaderInfoLog(vertexShaderID, infoLogLength, NULL, &vertexShaderErrorMessage);
printf("%s\n", &vertexShaderErrorMessage);
}
printf("Compiling fragment shader...\n");
glShaderSource(fragmentShaderID, 1, &fragmentShaderCode, NULL);
glCompileShader(fragmentShaderID);
glGetShaderiv(fragmentShaderID, GL_COMPILE_STATUS, &result);
glGetShaderiv(fragmentShaderID, GL_INFO_LOG_LENGTH, &infoLogLength);
if( infoLogLength > 0 )
{
char fragmentShaderErrorMessage[infoLogLength + 1];
glGetShaderInfoLog(fragmentShaderID, infoLogLength, NULL, &fragmentShaderErrorMessage);
printf("%s\n", &fragmentShaderErrorMessage);
}
printf("Linking program\n");
GLuint programID = glCreateProgram();
glAttachShader(programID, vertexShaderID);
glAttachShader(programID, fragmentShaderID);
glLinkProgram(programID);
glGetProgramiv(programID, GL_LINK_STATUS, &result);
glGetProgramiv(programID, GL_INFO_LOG_LENGTH, &infoLogLength);
if( infoLogLength > 0 )
{
char programErrorMessage[infoLogLength + 1];
glGetProgramInfoLog(programID, infoLogLength, NULL, &programErrorMessage);
printf("%s\n", &programErrorMessage);
}
free( vertexShaderCode );
free( fragmentShaderCode );
glDetachShader( programID, vertexShaderID );
glDetachShader( programID, fragmentShaderID );
glDeleteShader( vertexShaderID );
glDeleteShader( fragmentShaderID );
return programID;
}

24
src/shaders.h Normal file
View File

@ -0,0 +1,24 @@
#include <stdbool.h>
#include <cglm/struct.h>
#include <GL/glew.h>
GLuint loadShaders(const char* vertexShaderPath, const char* fragmentShaderPath);
void use();
void setBool(char* name, bool value);
void setInt(char* name, int value);
void setFloat(char* name, float value);
void setVec2(char* name, vec2s value);
void setVec3(char* name, float x, float y);
void setVec3(char* name, vec3s value);
void setVec3(char* name, float x, float y, float z);
void setVec4(char* name, vec4s value);
void setVec4(char* name, float x, float y, float z, float w);
void setMat2(char* name, mat2s value);
void setMat3(char* name, mat3s value);
void setMat4(char* name, mat4s value);