diff --git a/.vs/shader3/v14/.suo b/.vs/shader3/v14/.suo
index 2027f87..3a4377e 100644
Binary files a/.vs/shader3/v14/.suo and b/.vs/shader3/v14/.suo differ
diff --git a/main.cpp b/main.cpp
index 2c375bb..0f3f354 100644
--- a/main.cpp
+++ b/main.cpp
@@ -78,18 +78,31 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
gpuProgram.AttachShader(GL_VERTEX_SHADER, "res/shader/skybox.vs");
gpuProgram.AttachShader(GL_FRAGMENT_SHADER, "res/shader/skybox.fs");
gpuProgram.Link();
-
gpuProgram.DetectAttribute("pos");
gpuProgram.DetectAttribute("texcoord");
gpuProgram.DetectAttribute("normal");
gpuProgram.DetectUniform("M");
gpuProgram.DetectUniform("V");
gpuProgram.DetectUniform("P");
-
+
+ //reflect program
+ GPUProgram reflectProgram;
+ reflectProgram.AttachShader(GL_VERTEX_SHADER, "res/shader/skybox_reflect.vs");
+ reflectProgram.AttachShader(GL_FRAGMENT_SHADER, "res/shader/skybox_reflect.fs");
+ reflectProgram.Link();
+ reflectProgram.DetectAttribute("pos");
+ reflectProgram.DetectAttribute("texcoord");
+ reflectProgram.DetectAttribute("normal");
+ reflectProgram.DetectUniform("M");
+ reflectProgram.DetectUniform("V");
+ reflectProgram.DetectUniform("P");
+ reflectProgram.DetectUniform("NM");
+ reflectProgram.DetectUniform("U_MainTexture");
//init 3d model
- ObjModel cube;
- cube.Init("res/model/Sphere.obj");
+ ObjModel cube,sphere;
+ cube.Init("res/model/Cube.obj");
+ sphere.Init("res/model/Sphere.obj");
float identity[] = {
1.0f,0,0,0,
@@ -102,6 +115,9 @@ 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 sphereNormalMatrix = glm::inverseTranspose(sphereModelMatrix);
+
GLuint mainTexture = SOIL_load_OGL_cubemap(
"res/image/right.bmp",
"res/image/left.bmp",
@@ -141,6 +157,18 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
cube.Draw();
glUseProgram(0);
glEnable(GL_DEPTH_TEST);
+
+ glUseProgram(reflectProgram.mProgram);
+ glUniformMatrix4fv(reflectProgram.GetLocation("V"), 1, GL_FALSE, identity);
+ glUniformMatrix4fv(reflectProgram.GetLocation("P"), 1, GL_FALSE, glm::value_ptr(projectionMatrix));
+ glUniformMatrix4fv(reflectProgram.GetLocation("M"), 1, GL_FALSE, glm::value_ptr(sphereModelMatrix));
+ glUniformMatrix4fv(reflectProgram.GetLocation("NM"), 1, GL_FALSE, glm::value_ptr(sphereNormalMatrix));
+ glBindTexture(GL_TEXTURE_CUBE_MAP, mainTexture);
+ glUniform1i(reflectProgram.GetLocation("U_MainTexture"), 0);
+ sphere.Bind(reflectProgram.GetLocation("pos"), reflectProgram.GetLocation("texcoord"), reflectProgram.GetLocation("normal"));
+ sphere.Draw();
+ glUseProgram(0);
+
glFlush();
SwapBuffers(dc);
}
diff --git a/res/shader/skybox_reflect.fs b/res/shader/skybox_reflect.fs
new file mode 100644
index 0000000..bf7c614
--- /dev/null
+++ b/res/shader/skybox_reflect.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 = reflect(eyeVec, n);
+ gl_FragColor=textureCube(U_MainTexture, r);
+}
\ No newline at end of file
diff --git a/res/shader/skybox_reflect.vs b/res/shader/skybox_reflect.vs
new file mode 100644
index 0000000..b2ac37b
--- /dev/null
+++ b/res/shader/skybox_reflect.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 896190c..b51d56f 100644
--- a/shader3.vcxproj
+++ b/shader3.vcxproj
@@ -82,8 +82,8 @@
-
-
+
+
diff --git a/shader3.vcxproj.filters b/shader3.vcxproj.filters
index 6b906a5..2b9c47d 100644
--- a/shader3.vcxproj.filters
+++ b/shader3.vcxproj.filters
@@ -46,10 +46,10 @@
-
+
src
-
+
src