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