Browse Source

天空盒反射

master
blobt 4 years ago
parent
commit
e3540a1b98
  1. 30
      main.cpp
  2. 13
      res/shader/skybox_refract.fs
  3. 18
      res/shader/skybox_refract.vs
  4. 2
      shader3.vcxproj
  5. 6
      shader3.vcxproj.filters

30
main.cpp

@ -99,6 +99,20 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
reflectProgram.DetectUniform("NM"); reflectProgram.DetectUniform("NM");
reflectProgram.DetectUniform("U_MainTexture"); 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 //init 3d model
ObjModel cube,sphere; ObjModel cube,sphere;
cube.Init("res/model/Cube.obj"); 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 cubeModelMatrix;
glm::mat4 projectionMatrix = glm::perspective(50.0f, (float)viewportWidth / (float)viewportHeight, 0.1f, 1000.0f); 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 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( GLuint mainTexture = SOIL_load_OGL_cubemap(
"res/image/right.bmp", "res/image/right.bmp",
"res/image/left.bmp", "res/image/left.bmp",
@ -169,6 +186,17 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
sphere.Draw(); sphere.Draw();
glUseProgram(0); 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(); glFlush();
SwapBuffers(dc); SwapBuffers(dc);
} }

13
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);
}

18
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;
}

2
shader3.vcxproj

@ -84,6 +84,8 @@
<ItemGroup> <ItemGroup>
<None Include="res\shader\skybox_reflect.fs" /> <None Include="res\shader\skybox_reflect.fs" />
<None Include="res\shader\skybox_reflect.vs" /> <None Include="res\shader\skybox_reflect.vs" />
<None Include="res\shader\skybox_refract.fs" />
<None Include="res\shader\skybox_refract.vs" />
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">

6
shader3.vcxproj.filters

@ -52,5 +52,11 @@
<None Include="res\shader\skybox_reflect.vs"> <None Include="res\shader\skybox_reflect.vs">
<Filter>src</Filter> <Filter>src</Filter>
</None> </None>
<None Include="res\shader\skybox_refract.fs">
<Filter>src</Filter>
</None>
<None Include="res\shader\skybox_refract.vs">
<Filter>src</Filter>
</None>
</ItemGroup> </ItemGroup>
</Project> </Project>
Loading…
Cancel
Save