Browse Source

使用skybox做球体的反射

master
blobt 4 years ago
parent
commit
4a734e5b75
  1. BIN
      .vs/shader3/v14/.suo
  2. 36
      main.cpp
  3. 13
      res/shader/skybox_reflect.fs
  4. 18
      res/shader/skybox_reflect.vs
  5. 4
      shader3.vcxproj
  6. 4
      shader3.vcxproj.filters

BIN
.vs/shader3/v14/.suo

36
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_VERTEX_SHADER, "res/shader/skybox.vs");
gpuProgram.AttachShader(GL_FRAGMENT_SHADER, "res/shader/skybox.fs"); gpuProgram.AttachShader(GL_FRAGMENT_SHADER, "res/shader/skybox.fs");
gpuProgram.Link(); gpuProgram.Link();
gpuProgram.DetectAttribute("pos"); gpuProgram.DetectAttribute("pos");
gpuProgram.DetectAttribute("texcoord"); gpuProgram.DetectAttribute("texcoord");
gpuProgram.DetectAttribute("normal"); gpuProgram.DetectAttribute("normal");
gpuProgram.DetectUniform("M"); gpuProgram.DetectUniform("M");
gpuProgram.DetectUniform("V"); gpuProgram.DetectUniform("V");
gpuProgram.DetectUniform("P"); 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 //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[] = { float identity[] = {
1.0f,0,0,0, 1.0f,0,0,0,
@ -102,6 +115,9 @@ 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 sphereNormalMatrix = glm::inverseTranspose(sphereModelMatrix);
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",
@ -141,6 +157,18 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
cube.Draw(); cube.Draw();
glUseProgram(0); glUseProgram(0);
glEnable(GL_DEPTH_TEST); 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(); glFlush();
SwapBuffers(dc); SwapBuffers(dc);
} }

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

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

4
shader3.vcxproj

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

4
shader3.vcxproj.filters

@ -46,10 +46,10 @@
</ClInclude> </ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="res\shader\skybox.fs">
<None Include="res\shader\skybox_reflect.fs">
<Filter>src</Filter> <Filter>src</Filter>
</None> </None>
<None Include="res\shader\skybox.vs">
<None Include="res\shader\skybox_reflect.vs">
<Filter>src</Filter> <Filter>src</Filter>
</None> </None>
</ItemGroup> </ItemGroup>
Loading…
Cancel
Save