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