multiple textures and normal maps
This commit is contained in:
parent
abffb2fe7c
commit
2124eb1d68
|
@ -9,6 +9,7 @@ texture ../texture/chair/chair_texture.png
|
|||
model 2
|
||||
file ../obj/chalkboard/Chalkboard.obj
|
||||
texture ../texture/chalkboard/Chalkboard.jpg
|
||||
texture2 ../texture/chalkboard/text.png
|
||||
|
||||
model 3
|
||||
file ../obj/chalkboard/ChalkboardPoles.obj
|
||||
|
@ -42,6 +43,11 @@ model 10
|
|||
file ../obj/floor/Floor2.obj
|
||||
texture ../texture/floor/Carpet.png
|
||||
|
||||
model 11
|
||||
file ../obj/cube/cube.obj
|
||||
texture ../texture/crate/texture.jpg
|
||||
normal ../texture/crate/normal.jpg
|
||||
|
||||
# Reihe 1 #
|
||||
|
||||
# Platz 1 #
|
||||
|
@ -1677,3 +1683,10 @@ rotateY 3.14159
|
|||
rotateZ 0.0
|
||||
translate 6.0 -0.8 -6.0
|
||||
parent 0
|
||||
|
||||
# Normal Map Crate
|
||||
obj 1000
|
||||
use 11
|
||||
name normalMapCrate
|
||||
scale 0.5 0.5 0.5
|
||||
translate 3.0 0.0 3.0
|
|
@ -16,6 +16,11 @@ uniform float lightBrightness[2];
|
|||
uniform vec4 lightColor;
|
||||
|
||||
uniform sampler2D textureSampler;
|
||||
|
||||
uniform bool useSecondaryTexture;
|
||||
uniform bool useNormalMap;
|
||||
|
||||
uniform sampler2D secondaryTexture;
|
||||
uniform sampler2D normalMap;
|
||||
|
||||
|
||||
|
@ -25,13 +30,29 @@ float emissionStrength = 0.0;
|
|||
void main() {
|
||||
vec4 color = vec4(texture(textureSampler, textureCoordinate).rgb, 1.0);
|
||||
|
||||
vec3 norm = normalize(normal);
|
||||
if (useSecondaryTexture) {
|
||||
vec4 secondColor = texture(secondaryTexture, textureCoordinate).rgba;
|
||||
color = vec4(color.rgb * (1 - secondColor.a) + secondColor.rgb * secondColor.a, min(color.a + secondColor.a, 1.0));
|
||||
}
|
||||
|
||||
vec3 lightDir = normalize(lightPosition - fragmentPosition);
|
||||
vec3 norm;
|
||||
vec3 eyeDir = (-normalize(fragmentPosition));
|
||||
if (useNormalMap) {
|
||||
norm = normalize((texture(normalMap, textureCoordinate).xyz * 2 - vec3(1,1,1)));
|
||||
eyeDir = TBN * eyeDir;
|
||||
} else {
|
||||
norm = normalize(normal);
|
||||
}
|
||||
|
||||
float sumDiffusion = 0;
|
||||
float sumSpecular = 0;
|
||||
|
||||
for (int i = 0; i < lightPositions.length(); i++) {
|
||||
vec3 lightDir = normalize(lightPositions[i] - fragmentPosition);
|
||||
|
||||
if (useNormalMap) {
|
||||
lightDir = TBN * lightDir;
|
||||
}
|
||||
|
||||
sumDiffusion += max(dot(norm, lightDir), 0.0) * lightBrightness[i];
|
||||
|
||||
|
|
27
src/main.c
27
src/main.c
|
@ -154,10 +154,29 @@ void renderNode(SceneNode* node) {
|
|||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, node->model->texture);
|
||||
|
||||
// textureLocation = glGetUniformLocation(program, "normalMap");
|
||||
// glUniform1i(textureLocation, 4);
|
||||
// glActiveTexture(GL_TEXTURE4);
|
||||
// glBindTexture(GL_TEXTURE_2D, textures[NORMAL]);
|
||||
if (node->model->secondaryTexture != -1) {
|
||||
|
||||
glUniform1i(glGetUniformLocation(program, "useSecondaryTexture"), 1);
|
||||
|
||||
glUniform1i(glGetUniformLocation(program, "secondaryTexture"), 1);
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
glBindTexture(GL_TEXTURE_2D, node->model->secondaryTexture);
|
||||
|
||||
} else {
|
||||
glUniform1i(glGetUniformLocation(program, "useSecondaryTexture"), 0);
|
||||
}
|
||||
|
||||
if (node->model->normalMap != -1) {
|
||||
|
||||
glUniform1i(glGetUniformLocation(program, "useNormalMap"), 1);
|
||||
|
||||
glUniform1i(glGetUniformLocation(program, "normalMap"), 2);
|
||||
glActiveTexture(GL_TEXTURE2);
|
||||
glBindTexture(GL_TEXTURE_2D, node->model->normalMap);
|
||||
|
||||
} else {
|
||||
glUniform1i(glGetUniformLocation(program, "useNormalMap"), 0);
|
||||
}
|
||||
|
||||
draw_object(node->model->objectData);
|
||||
}
|
||||
|
|
|
@ -19,6 +19,8 @@
|
|||
|
||||
#define KEYWORD_DEFINE_OBJ_FILE "file"
|
||||
#define KEYWORD_DEFINE_TEXTURE_FILE "texture"
|
||||
#define KEYWORD_DEFINE_SECONDARY_TEXTURE_FILE "texture2"
|
||||
#define KEYWORD_DEFINE_NORMAL_MAP_FILE "normal"
|
||||
|
||||
#define KEYWORD_USE_MODEL "use"
|
||||
#define KEYWORD_DEFINE_PARENT "parent"
|
||||
|
@ -99,7 +101,7 @@ void loadTexture(char* textureFile, GLuint* texture) {
|
|||
glBindTexture(GL_TEXTURE_2D, *texture);
|
||||
|
||||
printf("%s - %d\n", textureFile, nrChannels);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, format, GL_UNSIGNED_BYTE, image);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, image);
|
||||
// load texture using previously determined format ----- ^^^^^^
|
||||
|
||||
glGenerateMipmap(GL_TEXTURE_2D);
|
||||
|
@ -196,6 +198,10 @@ SceneNode* loadSceneGraphFromFile(char* path) {
|
|||
|
||||
if (strcmp(keyword, KEYWORD_DEFINE_MODEL) == 0) {
|
||||
sscanf(buf, KEYWORD_DEFINE_MODEL " %d", ¤tModel);
|
||||
models[currentModel].objectData = NULL;
|
||||
models[currentModel].texture = -1;
|
||||
models[currentModel].secondaryTexture = -1;
|
||||
models[currentModel].normalMap = -1;
|
||||
continue;
|
||||
}
|
||||
if (strcmp(keyword, KEYWORD_DEFINE_OBJ_FILE) == 0) {
|
||||
|
@ -208,6 +214,16 @@ SceneNode* loadSceneGraphFromFile(char* path) {
|
|||
loadTexture(filepathBuffer, &models[currentModel].texture);
|
||||
continue;
|
||||
}
|
||||
if (strcmp(keyword, KEYWORD_DEFINE_SECONDARY_TEXTURE_FILE) == 0) {
|
||||
sscanf(buf, KEYWORD_DEFINE_SECONDARY_TEXTURE_FILE " %s", filepathBuffer);
|
||||
loadTexture(filepathBuffer, &models[currentModel].secondaryTexture);
|
||||
continue;
|
||||
}
|
||||
if (strcmp(keyword, KEYWORD_DEFINE_NORMAL_MAP_FILE) == 0) {
|
||||
sscanf(buf, KEYWORD_DEFINE_NORMAL_MAP_FILE " %s", filepathBuffer);
|
||||
loadTexture(filepathBuffer, &models[currentModel].normalMap);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (strcmp(keyword, KEYWORD_DEFINE_NODE) == 0) {
|
||||
|
|
|
@ -14,6 +14,8 @@ typedef struct SceneNode SceneNode;
|
|||
typedef struct {
|
||||
ObjectData* objectData;
|
||||
GLuint texture;
|
||||
GLuint secondaryTexture;
|
||||
GLuint normalMap;
|
||||
} Model;
|
||||
|
||||
struct SceneNode {
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 25 KiB |
Binary file not shown.
After Width: | Height: | Size: 113 KiB |
Binary file not shown.
After Width: | Height: | Size: 84 KiB |
Binary file not shown.
After Width: | Height: | Size: 70 KiB |
Loading…
Reference in New Issue