This commit is contained in:
pyron 2022-02-02 00:25:38 +01:00
parent c7d0290676
commit 228a2ea4f9
31 changed files with 124937 additions and 80 deletions

View File

@ -1,8 +1 @@
 main_2_1a.cpp
C:\Users\pyron\Documents\grafika\submarine\cw 2\src\main_2_1a.cpp(335,69): warning C4305: 'argument': truncation from 'double' to 'float'
C:\Users\pyron\Documents\grafika\submarine\cw 2\src\main_2_1a.cpp(384,15): warning C4244: 'argument': conversion from 'time_t' to 'unsigned int', possible loss of data
Camera.obj : warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/INCREMENTAL:NO' specification
PhysXExtensions_static_32.lib(ExtCpuWorkerThread.obj) : warning LNK4099: PDB 'PhysXExtensions_static_32.pdb' was not found with 'PhysXExtensions_static_32.lib(ExtCpuWorkerThread.obj)' or at 'C:\Users\pyron\Documents\grafika\submarine\Debug\PhysXExtensions_static_32.pdb'; linking object as if no debug info
PhysXExtensions_static_32.lib(ExtDefaultCpuDispatcher.obj) : warning LNK4099: PDB 'PhysXExtensions_static_32.pdb' was not found with 'PhysXExtensions_static_32.lib(ExtDefaultCpuDispatcher.obj)' or at 'C:\Users\pyron\Documents\grafika\submarine\Debug\PhysXExtensions_static_32.pdb'; linking object as if no debug info
PhysXExtensions_static_32.lib(ExtDefaultErrorCallback.obj) : warning LNK4099: PDB 'PhysXExtensions_static_32.pdb' was not found with 'PhysXExtensions_static_32.lib(ExtDefaultErrorCallback.obj)' or at 'C:\Users\pyron\Documents\grafika\submarine\Debug\PhysXExtensions_static_32.pdb'; linking object as if no debug info
grk-cw2.vcxproj -> C:\Users\pyron\Documents\grafika\submarine\Debug\grk-cw2.exe
 grk-cw2.vcxproj -> C:\Users\pyron\Documents\grafika\submarine\Debug\grk-cw2.exe

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -15,6 +15,8 @@
<None Include="shaders\shader_box.vert" />
<None Include="shaders\shader_color.frag" />
<None Include="shaders\shader_color.vert" />
<None Include="shaders\shader_particle.frag" />
<None Include="shaders\shader_particle.vert" />
<None Include="shaders\shader_tex.frag" />
<None Include="shaders\shader_tex.vert" />
</ItemGroup>

View File

@ -39,6 +39,12 @@
<None Include="shaders\shader_box.vert">
<Filter>Shader Files</Filter>
</None>
<None Include="shaders\shader_particle.frag">
<Filter>Shader Files</Filter>
</None>
<None Include="shaders\shader_particle.vert">
<Filter>Shader Files</Filter>
</None>
</ItemGroup>
<ItemGroup>
<ClCompile Include="src\Shader_Loader.cpp">

85579
cw 2/models/geyser.obj Normal file

File diff suppressed because it is too large Load Diff

39134
cw 2/models/submarine.obj Normal file

File diff suppressed because it is too large Load Diff

View File

@ -6,9 +6,11 @@ out vec3 TexCoords;
uniform mat4 perspective;
uniform mat4 view;
void main()
{
TexCoords = aPos;
vec4 pos = perspective * view * vec4(aPos, 1.0);
gl_Position = pos.xyww;
}

View File

@ -3,12 +3,19 @@
uniform vec3 objectColor;
uniform vec3 lightDir;
//vec4(0.0175,0.4716,0.5109,1.0)
in vec3 interpNormal;
in float visibility;
void main()
{
vec3 normal = normalize(interpNormal);
float ambient = 0.2;
float diffuse = max(dot(normal, -lightDir), 0.0);
gl_FragColor = vec4(objectColor * (ambient + (1-ambient) * diffuse), 1.0);
gl_FragColor = mix(vec4(0.0175,0.4716,0.5109,0.5), gl_FragColor, visibility);
}

View File

@ -7,10 +7,22 @@ layout(location = 2) in vec3 vertexNormal;
uniform mat4 modelViewProjectionMatrix;
uniform mat4 modelMatrix;
out vec3 interpNormal;
out float visibility;
const float density = 0.0035;
const float gradient = 5.0;
void main()
{
gl_Position = modelViewProjectionMatrix * vec4(vertexPosition, 1.0);
interpNormal = (modelMatrix * vec4(vertexNormal, 0.0)).xyz;
float distance = length(gl_Position.xyz);
visibility = exp(-pow((distance*density),gradient));
visibility = clamp(visibility,0.0,1.0);
}

View File

@ -0,0 +1,11 @@
#version 330 core
in vec2 TexCoords;
in vec4 ParticleColor;
out vec4 color;
uniform sampler2D sprite;
void main()
{
color = (texture(sprite, TexCoords) * ParticleColor);
}

View File

@ -0,0 +1,17 @@
#version 330 core
layout (location = 0) in vec4 vertex; // <vec2 position, vec2 texCoords>
out vec2 TexCoords;
out vec4 ParticleColor;
uniform mat4 projection;
uniform vec2 offset;
uniform vec4 color;
void main()
{
float scale = 10.0f;
TexCoords = vertex.zw;
ParticleColor = color;
gl_Position = projection * vec4((vertex.xy * scale) + offset, 0.0, 1.0);
}

View File

@ -6,12 +6,17 @@ uniform vec3 lightDir;
in vec3 interpNormal;
in vec2 interpTexCoord;
in float visibility;
void main()
{
vec2 modifiedTexCoord = vec2(interpTexCoord.x, 1.0 - interpTexCoord.y); // Poprawka dla tekstur Ziemi, ktore bez tego wyswietlaja sie 'do gory nogami'
vec2 modifiedTexCoord = vec2(interpTexCoord.x, 1.0 - interpTexCoord.y);
vec3 color = texture2D(textureSampler, modifiedTexCoord).rgb;
vec3 normal = normalize(interpNormal);
float ambient = 0.2;
float diffuse = max(dot(normal, -lightDir), 0.0);
gl_FragColor = vec4(color * (ambient + (1-ambient) * diffuse), 1.0);
gl_FragColor = mix(vec4(0.0175,0.4716,0.5109,1.0), gl_FragColor, visibility);
}

View File

@ -7,12 +7,23 @@ layout(location = 2) in vec3 vertexNormal;
uniform mat4 modelViewProjectionMatrix;
uniform mat4 modelMatrix;
uniform vec3 cameraPos;
out vec3 interpNormal;
out vec2 interpTexCoord;
out float visibility;
const float density = 0.006;
const float gradient = 2.0;
void main()
{
gl_Position = modelViewProjectionMatrix * vec4(vertexPosition, 1.0);
interpNormal = (modelMatrix * vec4(vertexNormal, 0.0)).xyz;
interpTexCoord = vertexTexCoord;
float distance = length(gl_Position);
visibility = exp(-pow((distance*density),gradient));
visibility = clamp(visibility,0.0,1.0);
}

View File

@ -15,9 +15,11 @@
#define SIZE 1.0f
#define SCREEN_X 1920
#define SCREEN_Y 1080
#define SEAWEED_NUM 20
#define FISH_NUM 20
#define SEAWEED_NUM 100
#define FISH_NUM 100
#define PARTICLE_NUM 300
#define GROUND_XY 400
#define GEYSER_NUM 3
Core::Shader_Loader shaderLoader;
GLuint programColor;
@ -26,9 +28,24 @@ GLuint programSkyBox;
auto radians = 0.01f;
struct fish
{
glm::vec3 position;
int counter = 0;
int rotation = 0;
glm::vec3 color = glm::vec3(0.9f, 0.1f, 0.3f);
};
struct particle
{
glm::vec3 position;
glm::vec3 color = glm::vec3(0.55f, 0.65f, 0.94f);
float velocity = 0;
float size;
};
// Skybox
GLuint SkyboxVertexBuffer, SkyboxVertexAttributes;
float cubeMapVertices[] = {
-SIZE, SIZE, -SIZE,
-SIZE, -SIZE, -SIZE,
@ -73,65 +90,58 @@ float cubeMapVertices[] = {
SIZE, -SIZE, SIZE
};
// Modele
obj::Model groundModel, boxModel, sphereModel, seaweedModel, fishModel;
obj::Model groundModel, boxModel, sphereModel, seaweedModel, fishModel, submarineModel, particleModel, geyserModel;
// Contexty
Core::RenderContext groundContext, boxContext, sphereContext, seaweedContext, fishContext;
Core::RenderContext groundContext, boxContext, sphereContext, seaweedContext, fishContext, submarineContext, particleContext, geyserContext;
// Tekstury
GLuint boxTexture, groundTexture, seaweedTexture, cubeMapTexture;
GLuint boxTexture, groundTexture, seaweedTexture, cubeMapTexture, submarineTexture, particleTexture, geyserTexture;
// Kamera
float cameraAngle = 0;
glm::vec3 cameraPos = glm::vec3(0, 10, 0);
glm::vec3 cameraSide;
glm::vec3 cameraDir;
bool firstMouse = true;
glm::mat4 cameraMatrix, perspectiveMatrix;
int xDiff, yDiff = 0;
int xPos, yPos = 0;
glm::quat rotation = glm::quat(1, 0, 0, 0);
float y_rotation_angle;
float around_rotation_angle;
float moving_angle = 360.0;
glm::vec3 lightDir = glm::normalize(glm::vec3(-1, 0, -1));
int xDiff, yDiff = 0;
int xPos, yPos = 0;
bool firstMouse = true;
glm::vec3 cameraPos = glm::vec3(0, 35, 10);
glm::vec3 cameraSide;
glm::vec3 cameraDir;
glm::vec3 lightDir = glm::normalize(glm::vec3(-0.5, -1, -0.5));
glm::mat4 cameraMatrix, perspectiveMatrix;
glm::quat rotation = glm::quat(1, 0, 0, 0);
std::vector<glm::vec3> seaweedPosition;
std::vector<glm::vec3> fishPosition;
struct fish
{
glm::vec3 position;
int counter = 0;
int rotation = 0;
glm::vec3 color = glm::vec3(0.9f, 0.1f, 0.3f);
};
std::vector<fish> fishList;
std::vector<std::vector<particle>> particleList;
std::vector<glm::vec3> geyserList;
void keyboard(unsigned char key, int x, int y)
{
float angleSpeed = 0.1f;
float angleSpeed = 0.05f;
float moveSpeed = 0.5f;
switch (key)
{
case 'z': rotation = glm::angleAxis(angleSpeed, glm::vec3(0, 0, 1)) * rotation; break;
case 'x': rotation = glm::angleAxis(angleSpeed, glm::vec3(0, 0, -1)) * rotation; break;
case 'w': cameraPos += cameraDir * moveSpeed; break;
case 's': cameraPos -= cameraDir * moveSpeed; break;
case 'd': cameraPos += cameraSide * moveSpeed; moving_angle > 340.0 ? moving_angle -= 1.0 : moving_angle += 0; break;
case 'a': cameraPos -= cameraSide * moveSpeed; moving_angle < 380.0 ? moving_angle += 1.0 : moving_angle += 0; break;
case 'r': cameraPos += glm::vec3(0,1,0) * moveSpeed; break;
case 't': cameraPos += glm::vec3(0, -1, 0) * moveSpeed; break;
case 'a': rotation = glm::angleAxis(angleSpeed, glm::vec3(0, -1, 0)) * rotation; break;
case 'd': rotation = glm::angleAxis(angleSpeed, glm::vec3(0, 1, 0)) * rotation; break;
case 'q': cameraPos -= cameraSide * moveSpeed; break;
case 'e': cameraPos += cameraSide * moveSpeed; break;
case 'p': glutLeaveMainLoop();
}
}
void mouse(int x, int y)
{
if (firstMouse) {
@ -195,7 +205,7 @@ void drawObjectTexture(Core::RenderContext* context, glm::mat4 modelMatrix, GLui
glUniform3f(glGetUniformLocation(program, "lightDir"), lightDir.x, lightDir.y, lightDir.z);
Core::SetActiveTexture(textureId, "textureSampler", program, 0);
glUniform3f(glGetUniformLocation(program, "cameraPos"), cameraPos.x, cameraPos.y, cameraPos.z);
glm::mat4 transformation = perspectiveMatrix * cameraMatrix * modelMatrix;
glUniformMatrix4fv(glGetUniformLocation(program, "modelViewProjectionMatrix"), 1, GL_FALSE, (float*)&transformation);
glUniformMatrix4fv(glGetUniformLocation(program, "modelMatrix"), 1, GL_FALSE, (float*)&modelMatrix);
@ -204,30 +214,33 @@ void drawObjectTexture(Core::RenderContext* context, glm::mat4 modelMatrix, GLui
glUseProgram(0);
}
void initGeyser() {
void renderSkybox()
{
glDepthFunc(GL_LEQUAL);
glUseProgram(programSkyBox);
glm::mat4 view = glm::mat4(glm::mat3(cameraMatrix));
glUniformMatrix4fv(glGetUniformLocation(programSkyBox, "view"), 1, GL_FALSE, (float*)&view);
glUniformMatrix4fv(glGetUniformLocation(programSkyBox, "perspective"), 1, GL_FALSE, (float*)&perspectiveMatrix);
geyserList.push_back(glm::vec3(180, 0.1f, 210));
geyserList.push_back(glm::vec3(-130, 0.1f, 50));
geyserList.push_back(glm::vec3(30, 0.1f, -80));
glBindVertexArray(SkyboxVertexAttributes);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_CUBE_MAP, cubeMapTexture);
glDrawArrays(GL_TRIANGLES, 0, 36);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
glDepthFunc(GL_LESS);
//glDepthMask(GL_TRUE);
glUseProgram(0);
}
void initBubbles() {
for (int j = 0; j < GEYSER_NUM; j++)
{
std::vector<particle> particleGroup;
for (int i = 0; i < PARTICLE_NUM; i++) {
particle new_particle;
new_particle.position = glm::vec3(geyserList[j].x + static_cast<float>(rand() % 4000 - 2000) / 1000.0f, static_cast<float>(rand() % 60 + 5), geyserList[j].z + static_cast<float>(rand() % 4000 - 2000) / 1000.0f);
new_particle.velocity = static_cast<float>(rand() % 50 + 300) / 1000.0f;
new_particle.size = static_cast<float>(rand() % 150 + 150) / 1000.0f;
particleGroup.push_back(new_particle);
}
particleList.push_back(particleGroup);
}
}
void initSeaweed() {
for (int i = 0; i < SEAWEED_NUM; i++) {
seaweedPosition.push_back(glm::vec3(static_cast<float>(rand() % 200 - 100), 0.1f, static_cast<float>(rand() % 200 - 100)));
auto x = static_cast<float>(rand() % GROUND_XY - (GROUND_XY / 2));
auto z = static_cast<float>(rand() % GROUND_XY - (GROUND_XY / 2));
seaweedPosition.push_back(glm::vec3(x,0.1f,z));
}
}
@ -235,7 +248,9 @@ void initFish() {
for (int i = 0; i < FISH_NUM; i++) {
fish new_fish;
new_fish.position = glm::vec3(static_cast<float>(rand() % 200 - 100), static_cast<float>(rand() % 20 + 10), static_cast<float>(rand() % 200 - 100));
auto x = static_cast<float>(rand() % GROUND_XY - (GROUND_XY / 2));
auto z = static_cast<float>(rand() % GROUND_XY - (GROUND_XY / 2));
new_fish.position = glm::vec3(x, static_cast<float>(rand() % 40 + 10), z);
new_fish.rotation = rand() % 4;
new_fish.color.x = static_cast<float>(rand() % 10) / 10;
@ -244,8 +259,6 @@ void initFish() {
fishList.push_back(new_fish);
}
}
void initSkybox()
{
@ -271,27 +284,51 @@ void initSkybox()
cubeMapTexture = Core::LoadCubemap(faces);
}
void renderSkybox()
{
glDepthFunc(GL_LEQUAL);
glUseProgram(programSkyBox);
glm::mat4 view = glm::mat4(glm::mat3(cameraMatrix));
glUniformMatrix4fv(glGetUniformLocation(programSkyBox, "view"), 1, GL_FALSE, (float*)&view);
glUniformMatrix4fv(glGetUniformLocation(programSkyBox, "perspective"), 1, GL_FALSE, (float*)&perspectiveMatrix);
glBindVertexArray(SkyboxVertexAttributes);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_CUBE_MAP, cubeMapTexture);
glDrawArrays(GL_TRIANGLES, 0, 36);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
glDepthFunc(GL_LESS);
//glDepthMask(GL_TRUE);
glUseProgram(0);
}
void renderSubmarine()
{
glm::mat4 submarineInitialMatrix = glm::translate(glm::vec3(0, -20, -30)) * glm::rotate(glm::radians(180.0f),glm::vec3(0,1,0)) * glm::scale(glm::vec3(2.0f));
glm::mat4 submarineMatrix = glm::translate(cameraPos + cameraDir * 0.5f) * glm::mat4_cast(glm::inverse(rotation)) * submarineInitialMatrix;
drawObjectTexture(&submarineContext, submarineMatrix, submarineTexture);
}
void renderGround()
{
glm::mat4 groundMatrix = glm::translate(glm::vec3(0, 0, 0)) * glm::rotate(glm::radians(90.0f), glm::vec3(0, 0, -1));// *glm::scale(glm::vec3(30));;
float scale = static_cast<float>(GROUND_XY) / 100.0f;
glm::mat4 groundMatrix = glm::translate(glm::vec3(0, 0, 0)) * glm::rotate(glm::radians(90.0f), glm::vec3(0, 0, -1)) * glm::scale(glm::vec3(scale));
drawObjectTexture(&groundContext, groundMatrix, groundTexture);
}
void renderSeaweed()
{
for (int i = 0; i < SEAWEED_NUM; i++) {
glm::mat4 seaweedMatrix = glm::translate(seaweedPosition[i]);// * glm::scale(glm::vec3(0.01f));
glm::mat4 seaweedMatrix = glm::translate(seaweedPosition[i]);
drawObjectColor(&seaweedContext, seaweedMatrix, glm::vec3(0.1f, 0.6f, 0.1f));
}
}
void renderFish()
{
glm::mat4 fishMatrix;
for (int i = 0; i < FISH_NUM; i++) {
int result = rand() % (10000 - fishList[i].counter);
int result = rand() % (20000 - fishList[i].counter);
if (result == 0)
{
fishList[i].rotation = rand() % 4;
@ -305,32 +342,59 @@ void renderFish()
switch (fishList[i].rotation)
{
case 0:
fishList[i].position.z -= 0.001f;
fishList[i].position.z -= 0.008f;
break;
case 1:
fishList[i].position.x -= 0.001f;
fishList[i].position.x -= 0.008f;
break;
case 2:
fishList[i].position.z += 0.001f;
fishList[i].position.z += 0.008f;
break;
case 3:
fishList[i].position.x += 0.001f;
fishList[i].position.x += 0.008f;
break;
}
fishMatrix = glm::translate(fishList[i].position) * glm::rotate(glm::radians(fishList[i].rotation * 90.0f), glm::vec3(0, 1, 0));
drawObjectColor(&fishContext, fishMatrix, fishList[i].color);
}
}
void renderBubbles()
{
for (int j = 0; j < GEYSER_NUM; j++)
{
for (int i = 0; i < PARTICLE_NUM; i++)
{
//glm::mat4 particleTrans = glm::translate(glm::vec3(0 + -0.1 * i / 45, -2.5f, -4 * sin(time * i))) * glm::rotate(glm::radians(270.0f), glm::vec3(0, -2, 0)) * glm::rotate(glm::radians(0.0f), glm::vec3(1, 0, 0)) * glm::scale(glm::vec3(0.02f));
//glm::mat4 particleModelMatrix = glm::translate(cameraPos + cameraDir * 0.5f) * glm::mat4_cast(glm::inverse(rotation)) * particleTrans;
glm::mat4 particleModelMatrix = glm::translate(particleList[j][i].position) * glm::scale(glm::vec3(particleList[j][i].size));
if (particleList[j][i].position.y > 90) {
particleList[j][i].position.y = 5;
particleList[j][i].velocity = static_cast<float>(rand() % 90 + 10) / 1000.0f;
}
particleList[j][i].position.y += particleList[j][i].velocity;//particleList[i].color
drawObjectTexture(&particleContext, particleModelMatrix, particleTexture);
}
}
}
void renderGeyser()
{
for (int j = 0; j < GEYSER_NUM; j++)
{
glm::mat4 gayserModelMatrix = glm::translate(geyserList[j]) * scale(glm::vec3(0.006f)) * scale(glm::vec3(1.0f, 3.0f, 1.0f));
drawObjectTexture(&geyserContext, gayserModelMatrix, geyserTexture);
}
}
void renderScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.0f, 0.1f, 0.3f, 1.0f);
cameraMatrix = createCameraMatrix();
perspectiveMatrix = Core::createPerspectiveMatrix(0.1, 400, 1.1f);
perspectiveMatrix = Core::createPerspectiveMatrix(0.1, 500, 1.1f);
renderSkybox();
@ -338,6 +402,9 @@ void renderScene()
renderGround();
renderSeaweed();
renderFish();
renderSubmarine();
renderBubbles();
renderGeyser();
glutSwapBuffers();
@ -352,17 +419,28 @@ void init()
groundModel = obj::loadModelFromFile("models/plane.obj");
seaweedModel = obj::loadModelFromFile("models/seaweed.obj");
fishModel = obj::loadModelFromFile("models/fish.obj");
submarineModel = obj::loadModelFromFile("models/submarine.obj");
particleModel = obj::loadModelFromFile("models/sphere.obj");
geyserModel = obj::loadModelFromFile("models/geyser.obj");
groundTexture = Core::LoadTexture("textures/sand.jpg");
seaweedTexture = Core::LoadTexture("textures/sea.jpg");
submarineTexture = Core::LoadTexture("textures/Base_color.png");
particleTexture = Core::LoadTexture("textures/bubble.jpg");
geyserTexture = Core::LoadTexture("textures/geyser.jpg");
groundContext.initFromOBJ(groundModel);
seaweedContext.initFromOBJ(seaweedModel);
fishContext.initFromOBJ(fishModel);
submarineContext.initFromOBJ(submarineModel);
particleContext.initFromOBJ(particleModel);
geyserContext.initFromOBJ(geyserModel);
initFish();
initSeaweed();
initSkybox();
initGeyser();
initBubbles();
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 MiB

BIN
cw 2/textures/bubble.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 KiB

BIN
cw 2/textures/bubble.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 KiB

BIN
cw 2/textures/geyser.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

BIN
cw 2/textures/particle.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 723 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 274 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 462 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 525 KiB

After

Width:  |  Height:  |  Size: 65 KiB

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: 525 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 588 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 588 KiB

After

Width:  |  Height:  |  Size: 65 KiB