Merge branch 'main' into inputhandler
This commit is contained in:
commit
eeb374bcee
|
@ -161,15 +161,15 @@ möglichst viele der folgenden Anforderungen erfüllen:
|
||||||
- [X] sinnvolle Aufteilung des Codes auf mehrere Dateien (insb. Shader-Code in separaten
|
- [X] sinnvolle Aufteilung des Codes auf mehrere Dateien (insb. Shader-Code in separaten
|
||||||
Dateien)
|
Dateien)
|
||||||
- [X] Datentypen und Hilfsfunktionen für Shader, Geometriedaten, Texturen
|
- [X] Datentypen und Hilfsfunktionen für Shader, Geometriedaten, Texturen
|
||||||
- [?] Überprüfung übergebener Funktionsparameter durch Assertions (soweit möglich)
|
- [X] Überprüfung übergebener Funktionsparameter durch Assertions (soweit möglich)
|
||||||
- [X] Tests für alle Matrixfunktionen
|
- [X] Tests für alle Matrixfunktionen
|
||||||
- [x] Strukturierung der Szene durch einen einfachen Szenengraph
|
- [x] Strukturierung der Szene durch einen einfachen Szenengraph
|
||||||
- [X] einfache Benutzerinteraktion mit Kamera und/oder Objekten (z. B. über Tastatur)
|
- [X] einfache Benutzerinteraktion mit Kamera und/oder Objekten (z. B. über Tastatur)
|
||||||
- [X] Beleuchtung der Szene mit mehr als einer Lichtquelle
|
- [X] Beleuchtung der Szene mit mehr als einer Lichtquelle
|
||||||
- [X] gleichzeitige Verwendung von mindestens zwei Texturen in einem Objekt
|
- [X] gleichzeitige Verwendung von mindestens zwei Texturen in einem Objekt
|
||||||
- [?] gleichzeitige Verwendung von mindestens zwei verschiedenen Shader-Programmen in einer Szene
|
- [X] gleichzeitige Verwendung von mindestens zwei verschiedenen Shader-Programmen in einer Szene
|
||||||
- [ ] transparente Objekte
|
- [ ] transparente Objekte
|
||||||
- [?] Verwendung einer Umgebungstextur
|
- [X] Verwendung einer Umgebungstextur
|
||||||
- [?] Spiegelung der Umgebungstextur auf einigen Objekten
|
- [?] Spiegelung der Umgebungstextur auf einigen Objekten
|
||||||
- [ ] Nebel in einer komplexen 3D-Szene
|
- [ ] Nebel in einer komplexen 3D-Szene
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ OTHER_LIBS = -lm
|
||||||
ALL_LIBS = $(GLEW_LIBS) $(GLFW_LIBS) $(OTHER_LIBS)
|
ALL_LIBS = $(GLEW_LIBS) $(GLFW_LIBS) $(OTHER_LIBS)
|
||||||
|
|
||||||
OBJ = matrixMath.o transformation.o wavefrontobj.o sceneGraph.o objectHandler.o shader.o
|
OBJ = matrixMath.o transformation.o wavefrontobj.o sceneGraph.o objectHandler.o shader.o
|
||||||
SHADERS = fragmentShader.c vertexShader.c
|
SHADERS = fragmentShader.c vertexShader.c skyboxFragmentShader.c skyboxVertexShader.c
|
||||||
|
|
||||||
cg1.out: test.out main.o $(OBJ) $(SHADERS)
|
cg1.out: test.out main.o $(OBJ) $(SHADERS)
|
||||||
./test.out
|
./test.out
|
||||||
|
|
138
src/main.c
138
src/main.c
|
@ -9,6 +9,10 @@
|
||||||
|
|
||||||
#include "vertexShader.c"
|
#include "vertexShader.c"
|
||||||
#include "fragmentShader.c"
|
#include "fragmentShader.c"
|
||||||
|
|
||||||
|
#include "skyboxVertexShader.c"
|
||||||
|
#include "skyboxFragmentShader.c"
|
||||||
|
|
||||||
#include "objectHandler.h"
|
#include "objectHandler.h"
|
||||||
#include "matrixMath.h"
|
#include "matrixMath.h"
|
||||||
#include "transformation.h"
|
#include "transformation.h"
|
||||||
|
@ -18,6 +22,10 @@
|
||||||
#include "inputHandler.c"
|
#include "inputHandler.c"
|
||||||
|
|
||||||
GLuint program;
|
GLuint program;
|
||||||
|
GLuint skyboxProgram;
|
||||||
|
|
||||||
|
ObjectData* skyboxObject;
|
||||||
|
GLuint skyboxTexture;
|
||||||
|
|
||||||
#define NUM_TEXTURES 5
|
#define NUM_TEXTURES 5
|
||||||
|
|
||||||
|
@ -47,11 +55,12 @@ vec3 origin = {0.0f, 0.0f, 0.0f};
|
||||||
vec3 cameraPosition = {0.0f, 2.0f, 1.0f};
|
vec3 cameraPosition = {0.0f, 2.0f, 1.0f};
|
||||||
vec3 objectPosition = {0.0f, 0.0f, 0.0f};
|
vec3 objectPosition = {0.0f, 0.0f, 0.0f};
|
||||||
|
|
||||||
vec3 cameraTravelPosition = {0.0f, 3.0f, 5.5f};
|
vec3 cameraTravelPosition = {0.3f, 0.3f, 0.3f};
|
||||||
bool cameraTraveling = true;
|
bool cameraTraveling = false;
|
||||||
|
|
||||||
GLfloat radius = 1.0f;
|
GLfloat radius = 1.0f;
|
||||||
mat4 viewingTransformation;
|
mat4 viewingTransformation;
|
||||||
|
mat4 projection;
|
||||||
|
|
||||||
// Define a global scene graph root node
|
// Define a global scene graph root node
|
||||||
SceneNode* rootNode;
|
SceneNode* rootNode;
|
||||||
|
@ -114,56 +123,76 @@ void renderNode(SceneNode* node) {
|
||||||
draw_object(node->model->objectData);
|
draw_object(node->model->objectData);
|
||||||
}
|
}
|
||||||
|
|
||||||
void init(void) {
|
void linkAndValidateProgram(GLuint prog) {
|
||||||
//IDEE: shader in array speichern und dann so kompilieren etc
|
GLuint status;
|
||||||
GLint status;
|
glLinkProgram(prog);
|
||||||
|
glGetProgramiv(prog, GL_LINK_STATUS, &status);
|
||||||
Shader shaders[2] = {
|
|
||||||
{GL_VERTEX_SHADER, 0},
|
|
||||||
{GL_FRAGMENT_SHADER, 0}
|
|
||||||
};
|
|
||||||
|
|
||||||
const GLchar* shaderSources[2] = {
|
|
||||||
vertexShader_glsl,
|
|
||||||
fragmentShader_glsl
|
|
||||||
};
|
|
||||||
|
|
||||||
int numShaders = sizeof(shaders) / sizeof(Shader);
|
|
||||||
compileShaders(shaders, shaderSources, numShaders);
|
|
||||||
|
|
||||||
program = glCreateProgram();
|
|
||||||
|
|
||||||
// das müsste evtl noch angepasst werden
|
|
||||||
for (int i = 0; i < numShaders; i++) {
|
|
||||||
glAttachShader(program, shaders[i].id);
|
|
||||||
}
|
|
||||||
glLinkProgram(program);
|
|
||||||
|
|
||||||
|
|
||||||
glGetProgramiv(program, GL_LINK_STATUS, &status);
|
|
||||||
|
|
||||||
if (!status) {
|
if (!status) {
|
||||||
printf("Error linking program: ");
|
printf("Error linking program: ");
|
||||||
GLchar infoLog[1024];
|
GLchar infoLog[1024];
|
||||||
glGetProgramInfoLog(program, 1024, NULL, infoLog);
|
glGetProgramInfoLog(prog, 1024, NULL, infoLog);
|
||||||
printf("%s",infoLog);
|
printf("%d - %s\n",status, infoLog);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
glValidateProgram(program);
|
glValidateProgram(prog);
|
||||||
|
|
||||||
|
|
||||||
glGetProgramiv(program, GL_VALIDATE_STATUS, &status);
|
glGetProgramiv(prog, GL_VALIDATE_STATUS, &status);
|
||||||
|
|
||||||
if (!status) {
|
if (!status) {
|
||||||
printf("Error validating program: ");
|
printf("Error validating program: ");
|
||||||
GLchar infoLog[1024];
|
GLchar infoLog[1024];
|
||||||
glGetProgramInfoLog(program, 1024, NULL, infoLog);
|
glGetProgramInfoLog(prog, 1024, NULL, infoLog);
|
||||||
printf("%s",infoLog);
|
printf("%d - %s\n",status, infoLog);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void init(void) {
|
||||||
|
//IDEE: shader in array speichern und dann so kompilieren etc
|
||||||
|
Shader shaders[4] = {
|
||||||
|
{GL_VERTEX_SHADER, 0},
|
||||||
|
{GL_FRAGMENT_SHADER, 0},
|
||||||
|
{GL_VERTEX_SHADER, 0},
|
||||||
|
{GL_FRAGMENT_SHADER, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
const GLchar* shaderSources[4] = {
|
||||||
|
vertexShader_glsl,
|
||||||
|
fragmentShader_glsl,
|
||||||
|
skyboxVertexShader_glsl,
|
||||||
|
skyboxFragmentShader_glsl,
|
||||||
|
};
|
||||||
|
|
||||||
|
int numShaders = sizeof(shaders) / sizeof(Shader);
|
||||||
|
compileShaders(shaders, shaderSources, 4);
|
||||||
|
|
||||||
|
program = glCreateProgram();
|
||||||
|
|
||||||
|
// das müsste evtl noch angepasst werden
|
||||||
|
glAttachShader(program, shaders[0].id);
|
||||||
|
glAttachShader(program, shaders[1].id);
|
||||||
|
linkAndValidateProgram(program);
|
||||||
|
|
||||||
|
printf("Default Program OK\n");
|
||||||
|
|
||||||
|
///// SKYBOX PROGRAM
|
||||||
|
|
||||||
|
skyboxProgram = glCreateProgram();
|
||||||
|
glAttachShader(skyboxProgram, shaders[2].id);
|
||||||
|
glAttachShader(skyboxProgram, shaders[3].id);
|
||||||
|
linkAndValidateProgram(skyboxProgram);
|
||||||
|
|
||||||
|
printf("Skybox Program OK\n");
|
||||||
|
|
||||||
|
|
||||||
|
skyboxObject = readSingleObjFile("../obj/cube/cube.obj");
|
||||||
|
skyboxTexture = loadCubemap();
|
||||||
|
|
||||||
|
|
||||||
stbi_set_flip_vertically_on_load(flipFlag);
|
|
||||||
// --------------- READ SCENE GRAPH
|
// --------------- READ SCENE GRAPH
|
||||||
|
setFlipBit(1);
|
||||||
setNodeRenderFunction(&renderNode);
|
setNodeRenderFunction(&renderNode);
|
||||||
|
|
||||||
// read scene graph
|
// read scene graph
|
||||||
|
@ -185,6 +214,33 @@ void updateStats() {
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void drawSkybox(void) {
|
||||||
|
glUseProgram(skyboxProgram);
|
||||||
|
glDepthMask(GL_FALSE);
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
|
||||||
|
|
||||||
|
mat4 view = viewingTransformation;
|
||||||
|
view.m30 = 0;
|
||||||
|
view.m31 = 0;
|
||||||
|
view.m32 = 0;
|
||||||
|
view.m33 = 1;
|
||||||
|
view.m23 = 0;
|
||||||
|
view.m13 = 0;
|
||||||
|
view.m03 = 0;
|
||||||
|
|
||||||
|
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(skyboxProgram, "view"), 1, GL_FALSE, (GLfloat*)&view);
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(skyboxProgram, "projection"), 1, GL_FALSE, (GLfloat*)&projection);
|
||||||
|
|
||||||
|
glBindVertexArray(skyboxObject->vao);
|
||||||
|
glBindTexture(GL_TEXTURE_CUBE_MAP, skyboxTexture);
|
||||||
|
draw_object(skyboxObject);
|
||||||
|
|
||||||
|
|
||||||
|
glDepthMask(GL_TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Main draw function.
|
* Main draw function.
|
||||||
*/
|
*/
|
||||||
|
@ -210,7 +266,6 @@ void draw(void) {
|
||||||
handleInputs(deltaTime);
|
handleInputs(deltaTime);
|
||||||
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
glUseProgram(program);
|
|
||||||
|
|
||||||
// step for rotations
|
// step for rotations
|
||||||
// counts up to 1.0 and then resets back to 0.0 forever
|
// counts up to 1.0 and then resets back to 0.0 forever
|
||||||
|
@ -241,11 +296,18 @@ void draw(void) {
|
||||||
GLfloat fovy = pi / 2;
|
GLfloat fovy = pi / 2;
|
||||||
normalisedDeviceCoordinatesFov(&normalisationTransformation, fovy, aspectRatio, near, far);
|
normalisedDeviceCoordinatesFov(&normalisationTransformation, fovy, aspectRatio, near, far);
|
||||||
|
|
||||||
mat4 projection;
|
|
||||||
identity(&projection);
|
identity(&projection);
|
||||||
multiply(&projection, &projectionTransformation, &projection);
|
multiply(&projection, &projectionTransformation, &projection);
|
||||||
multiply(&projection, &normalisationTransformation, &projection);
|
multiply(&projection, &normalisationTransformation, &projection);
|
||||||
|
|
||||||
|
|
||||||
|
drawSkybox();
|
||||||
|
|
||||||
|
glEnable(GL_CULL_FACE);
|
||||||
|
glUseProgram(program);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
glUniformMatrix4fv(glGetUniformLocation(program, "projection"), 1, GL_FALSE, (GLfloat*)&projection);
|
glUniformMatrix4fv(glGetUniformLocation(program, "projection"), 1, GL_FALSE, (GLfloat*)&projection);
|
||||||
|
|
||||||
// SET LIGHT DATA
|
// SET LIGHT DATA
|
||||||
|
|
|
@ -29,6 +29,47 @@
|
||||||
|
|
||||||
void (*renderFunction)(SceneNode*);
|
void (*renderFunction)(SceneNode*);
|
||||||
|
|
||||||
|
void setFlipBit(int flip) {
|
||||||
|
stbi_set_flip_vertically_on_load(flip);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int loadCubemap(void) {
|
||||||
|
char* faces[6] = {
|
||||||
|
"../texture/skybox/right.jpg",
|
||||||
|
"../texture/skybox/left.jpg",
|
||||||
|
"../texture/skybox/top.jpg",
|
||||||
|
"../texture/skybox/bottom.jpg",
|
||||||
|
"../texture/skybox/front.jpg",
|
||||||
|
"../texture/skybox/back.jpg"
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned int textureID;
|
||||||
|
glGenTextures(1, &textureID);
|
||||||
|
glBindTexture(GL_TEXTURE_CUBE_MAP, textureID);
|
||||||
|
|
||||||
|
int width, height, nrChannels;
|
||||||
|
for (unsigned int i = 0; i < 6; i++) {
|
||||||
|
unsigned char* image = stbi_load(faces[i], &width, &height, &nrChannels, 0);
|
||||||
|
if (image) {
|
||||||
|
|
||||||
|
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
|
||||||
|
stbi_image_free(image);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "Cubemap text failed to load at path: %s", faces[i]);
|
||||||
|
stbi_image_free(image);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
|
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
|
||||||
|
|
||||||
|
return textureID;
|
||||||
|
}
|
||||||
|
|
||||||
void setNodeRenderFunction(void (*newRenderFunction)(SceneNode*)) {
|
void setNodeRenderFunction(void (*newRenderFunction)(SceneNode*)) {
|
||||||
renderFunction = newRenderFunction;
|
renderFunction = newRenderFunction;
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,5 +43,7 @@ extern void renderSceneNode(SceneNode* node);
|
||||||
extern void freeSceneNode(SceneNode* node);
|
extern void freeSceneNode(SceneNode* node);
|
||||||
extern void printSceneGraph(SceneNode* root, int level);
|
extern void printSceneGraph(SceneNode* root, int level);
|
||||||
extern SceneNode* loadSceneGraphFromFile(char* path);
|
extern SceneNode* loadSceneGraphFromFile(char* path);
|
||||||
|
extern unsigned int loadCubemap(void);
|
||||||
|
extern void setFlipBit(int flip);
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -0,0 +1,10 @@
|
||||||
|
#version 330 core
|
||||||
|
|
||||||
|
in vec3 TexCoords;
|
||||||
|
|
||||||
|
uniform samplerCube skybox;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_FragColor = texture(skybox, TexCoords);
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
#version 330 core
|
||||||
|
|
||||||
|
layout (location = 0) in vec3 aPos;
|
||||||
|
out vec3 TexCoords;
|
||||||
|
|
||||||
|
uniform mat4 projection;
|
||||||
|
uniform mat4 view;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
TexCoords = aPos;
|
||||||
|
gl_Position = projection * view * vec4(aPos, 1.0);
|
||||||
|
}
|
Binary file not shown.
After Width: | Height: | Size: 723 KiB |
Binary file not shown.
After Width: | Height: | Size: 274 KiB |
Binary file not shown.
After Width: | Height: | Size: 462 KiB |
Binary file not shown.
After Width: | Height: | Size: 588 KiB |
Binary file not shown.
After Width: | Height: | Size: 525 KiB |
Binary file not shown.
After Width: | Height: | Size: 338 KiB |
Loading…
Reference in New Issue