diff --git a/main.cpp b/main.cpp
index 0f3f354..4c9f7a9 100644
--- a/main.cpp
+++ b/main.cpp
@@ -99,6 +99,20 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
reflectProgram.DetectUniform("NM");
reflectProgram.DetectUniform("U_MainTexture");
+ //refract program
+ GPUProgram refractProgram;
+ refractProgram.AttachShader(GL_VERTEX_SHADER, "res/shader/skybox_refract.vs");
+ refractProgram.AttachShader(GL_FRAGMENT_SHADER, "res/shader/skybox_refract.fs");
+ refractProgram.Link();
+ refractProgram.DetectAttribute("pos");
+ refractProgram.DetectAttribute("texcoord");
+ refractProgram.DetectAttribute("normal");
+ refractProgram.DetectUniform("M");
+ refractProgram.DetectUniform("V");
+ refractProgram.DetectUniform("P");
+ refractProgram.DetectUniform("NM");
+ refractProgram.DetectUniform("U_MainTexture");
+
//init 3d model
ObjModel cube,sphere;
cube.Init("res/model/Cube.obj");
@@ -115,9 +129,12 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
glm::mat4 cubeModelMatrix;
glm::mat4 projectionMatrix = glm::perspective(50.0f, (float)viewportWidth / (float)viewportHeight, 0.1f, 1000.0f);
- glm::mat4 sphereModelMatrix = glm::translate(0.0f, 0.0f, -4.0f);
+ glm::mat4 sphereModelMatrix = glm::translate(-1.5f, 0.0f, -4.0f);
glm::mat4 sphereNormalMatrix = glm::inverseTranspose(sphereModelMatrix);
+ glm::mat4 sphereModelMatrix2 = glm::translate(1.5f, 0.0f, -4.0f);
+ glm::mat4 sphereNormalMatrix2 = glm::inverseTranspose(sphereModelMatrix2);
+
GLuint mainTexture = SOIL_load_OGL_cubemap(
"res/image/right.bmp",
"res/image/left.bmp",
@@ -169,6 +186,17 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
sphere.Draw();
glUseProgram(0);
+ glUseProgram(refractProgram.mProgram);
+ glUniformMatrix4fv(refractProgram.GetLocation("V"), 1, GL_FALSE, identity);
+ glUniformMatrix4fv(refractProgram.GetLocation("P"), 1, GL_FALSE, glm::value_ptr(projectionMatrix));
+ glUniformMatrix4fv(refractProgram.GetLocation("M"), 1, GL_FALSE, glm::value_ptr(sphereModelMatrix2));
+ glUniformMatrix4fv(refractProgram.GetLocation("NM"), 1, GL_FALSE, glm::value_ptr(sphereNormalMatrix2));
+ glBindTexture(GL_TEXTURE_CUBE_MAP, mainTexture);
+ glUniform1i(refractProgram.GetLocation("U_MainTexture"), 0);
+ sphere.Bind(refractProgram.GetLocation("pos"), refractProgram.GetLocation("texcoord"), refractProgram.GetLocation("normal"));
+ sphere.Draw();
+ glUseProgram(0);
+
glFlush();
SwapBuffers(dc);
}
diff --git a/res/shader/skybox_refract.fs b/res/shader/skybox_refract.fs
new file mode 100644
index 0000000..806b744
--- /dev/null
+++ b/res/shader/skybox_refract.fs
@@ -0,0 +1,13 @@
+
+varying vec4 V_WorldPos;
+varying vec3 V_Normal;
+
+uniform samplerCube U_MainTexture;
+
+void main()
+{
+ vec3 eyeVec = normalize(V_WorldPos.xyz - vec3(0.0));
+ vec3 n = normalize(V_Normal);
+ vec3 r = refract(eyeVec, n, 1.0/1.4);
+ gl_FragColor=textureCube(U_MainTexture, r);
+}
\ No newline at end of file
diff --git a/res/shader/skybox_refract.vs b/res/shader/skybox_refract.vs
new file mode 100644
index 0000000..b2ac37b
--- /dev/null
+++ b/res/shader/skybox_refract.vs
@@ -0,0 +1,18 @@
+attribute vec3 pos;
+attribute vec2 texcoord;
+attribute vec3 normal;
+
+uniform mat4 M;
+uniform mat4 P;
+uniform mat4 V;
+uniform mat4 NM;
+
+varying vec4 V_WorldPos;
+varying vec3 V_Normal;
+
+void main()
+{
+ V_WorldPos = M * vec4(pos,1.0);
+ V_Normal = mat3(NM)*normal;
+ gl_Position = P * V * V_WorldPos;
+}
\ No newline at end of file
diff --git a/shader3.vcxproj b/shader3.vcxproj
index b51d56f..09563ee 100644
--- a/shader3.vcxproj
+++ b/shader3.vcxproj
@@ -84,6 +84,8 @@
+
+
diff --git a/shader3.vcxproj.filters b/shader3.vcxproj.filters
index 2b9c47d..a408264 100644
--- a/shader3.vcxproj.filters
+++ b/shader3.vcxproj.filters
@@ -52,5 +52,11 @@
src
+
+ src
+
+
+ src
+
\ No newline at end of file