Browse Source

投影改善

master
blobt 4 years ago
parent
commit
a095fdf44a
  1. BIN
      .vs/shader3/v14/.suo
  2. 66
      main.cpp
  3. 14
      res/shader/projector.fs
  4. 4
      res/shader/projector.vs
  5. 1
      res/shader/sample_depth_buffer.fs
  6. 3
      shader3.vcxproj
  7. 9
      shader3.vcxproj.filters

BIN
.vs/shader3/v14/.suo

66
main.cpp

@ -81,6 +81,25 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
originalProgram.DetectAttribute("texcoord");
originalProgram.DetectUniform("U_MainTexture");
//init depth render program
GPUProgram depthRenderProgram;
depthRenderProgram.AttachShader(GL_VERTEX_SHADER, "res/shader/fullscreenquad.vs");
depthRenderProgram.AttachShader(GL_FRAGMENT_SHADER, "res/shader/depthrender.fs");
depthRenderProgram.Link();
depthRenderProgram.DetectAttribute("pos");
depthRenderProgram.DetectAttribute("texcoord");
depthRenderProgram.DetectUniform("U_MainTexture");
//init depth program
GPUProgram depthProgram;
depthProgram.AttachShader(GL_VERTEX_SHADER, "res/shader/sample_depth_buffer.vs");
depthProgram.AttachShader(GL_FRAGMENT_SHADER, "res/shader/sample_depth_buffer.fs");
depthProgram.Link();
depthProgram.DetectAttribute("pos");
depthProgram.DetectUniform("M");
depthProgram.DetectUniform("V");
depthProgram.DetectUniform("P");
//init projector program
GPUProgram sampleProgram;
sampleProgram.AttachShader(GL_VERTEX_SHADER, "res/shader/sample.vs");
@ -110,6 +129,7 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
projectedTextureProgram.DetectUniform("U_MainTexture");
projectedTextureProgram.DetectUniform("U_ProjectiveTexture");
projectedTextureProgram.DetectUniform("U_ProjectorMatrix");
projectedTextureProgram.DetectUniform("U_ProjectorNoTransScaleMatrix");
//init 3d model
@ -132,12 +152,14 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
glm::mat4 sphereModel = glm::translate<float>(0.0f, 0.0f, 0.0f) * glm::scale(0.3f, 0.3f, 0.3f);
glm::mat4 viewMatrix = glm::lookAt(glm::vec3(10.0f, 3.0f, 0.0f), glm::vec3(6.0f, -1.0f, -6.0f), glm::vec3(0.0f, 1.0f, 0.0f));
glm::mat4 projectionMatrix = glm::perspective(50.0f, (float)viewportWidth / (float)viewportHeight, 0.1f, 1000.0f);
glm::mat4 projectorMatrix = glm::translate<float>(0.5f, 0.5f, 0.5f)*glm::scale(0.5f, 0.5f, 0.5f) * projectionMatrix * viewMatrix;
glm::mat4 projectorViewMatrix = glm::lookAt(glm::vec3(0.0f, 4.0f, 0.0f), glm::vec3(6.0f, -1.0f, -6.0f), glm::vec3(0.0f, 1.0f, 0.0f));
glm::mat4 projectorProjectionMatrix = glm::perspective(50.0f, (float)viewportWidth / (float)viewportHeight, 0.1f, 1000.0f);
glm::mat4 projectorMatrix = glm::translate<float>(0.5f, 0.5f, 0.5f)*glm::scale(0.5f, 0.5f, 0.5f) * projectorProjectionMatrix * projectorViewMatrix;
glm::mat4 projectorNoTransScaleMatrix = projectorProjectionMatrix * projectorViewMatrix;
//³õʼ»¯fsq
FullScreenQuad fsq;
fsq.Init();
@ -152,16 +174,40 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
projectiveTextureFbo.AttachColorBuffer("color", GL_COLOR_ATTACHMENT0, GL_RGBA, viewportWidth, viewportHeight);
projectiveTextureFbo.AttachDepthBuffer("depth", viewportWidth, viewportHeight);
projectiveTextureFbo.Finish();
FBO depthFbo;
depthFbo.AttachColorBuffer("color", GL_COLOR_ATTACHMENT0, GL_RGB, viewportWidth, viewportHeight);
depthFbo.AttachDepthBuffer("depth", viewportWidth, viewportHeight);
depthFbo.Finish();
GLuint mainTexture = SOIL_load_OGL_texture("res/image/stone.bmp", 0, 0, SOIL_FLAG_POWER_OF_TWO);
GLuint projectiveTexture = SOIL_load_OGL_texture("res/image/grass.png", 0, 0, SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_INVERT_Y);
GLuint projectiveTexture = SOIL_load_OGL_texture("res/image/head.png", 0, 0, SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_INVERT_Y);
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);
depthFbo.Bind();
glViewport(0, 0, viewportWidth, viewportHeight);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(depthProgram.mProgram);
glUniformMatrix4fv(depthProgram.GetLocation("P"), 1, GL_FALSE, glm::value_ptr(projectorProjectionMatrix));
glUniformMatrix4fv(depthProgram.GetLocation("M"), 1, GL_FALSE, glm::value_ptr(model));
glUniformMatrix4fv(depthProgram.GetLocation("V"), 1, GL_FALSE, glm::value_ptr(projectorViewMatrix));
obj.Bind(depthProgram.GetLocation("pos"), depthProgram.GetLocation("texcoord"), depthProgram.GetLocation("normal"));
obj.Draw();
glCullFace(GL_BACK);
glUniformMatrix4fv(depthProgram.GetLocation("M"), 1, GL_FALSE, glm::value_ptr(quadModel));
quad.Bind(depthProgram.GetLocation("pos"), depthProgram.GetLocation("texcoord"), depthProgram.GetLocation("normal"));
quad.Draw();
depthFbo.Unbind();
/*ԭͼfbo*/
originalFbo.Bind();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(sampleProgram.mProgram);
@ -180,6 +226,7 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
quad.Draw();
originalFbo.Unbind();
/*ͶӰfbo*/
projectiveTextureFbo.Bind();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(projectedTextureProgram.mProgram);
@ -188,6 +235,7 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
glUniformMatrix4fv(projectedTextureProgram.GetLocation("M"), 1, GL_FALSE, glm::value_ptr(model));
glUniformMatrix4fv(projectedTextureProgram.GetLocation("U_ProjectorMatrix"), 1, GL_FALSE, glm::value_ptr(projectorMatrix));
glUniformMatrix4fv(projectedTextureProgram.GetLocation("U_ProjectorNoTransScaleMatrix"), 1, GL_FALSE, glm::value_ptr(projectorNoTransScaleMatrix));
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, mainTexture);
@ -197,6 +245,10 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
glBindTexture(GL_TEXTURE_2D, projectiveTexture);
glUniform1i(projectedTextureProgram.GetLocation("U_ProjectiveTexture"), 1);
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, depthFbo.GetBuffer("depth"));
glUniform1i(projectedTextureProgram.GetLocation("U_ShadowMap"), 2);
obj.Bind(projectedTextureProgram.GetLocation("pos"), projectedTextureProgram.GetLocation("texcoord"), projectedTextureProgram.GetLocation("normal"));
obj.Draw();
@ -234,6 +286,12 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
glUniform1i(originalProgram.GetLocation("U_MainTexture"), 0);
fsq.DrawToRightTop(originalProgram.GetLocation("pos"), originalProgram.GetLocation("texcoord"));
glUseProgram(depthRenderProgram.mProgram);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, depthFbo.GetBuffer("depth"));
glUniform1i(depthRenderProgram.GetLocation("U_MainTexture"), 0);
fsq.DrawToRightBottom(depthRenderProgram.GetLocation("pos"), depthRenderProgram.GetLocation("texcoord"));
glFlush();
SwapBuffers(dc);
}

14
res/shader/projector.fs

@ -6,11 +6,23 @@ uniform sampler2D U_MainTexture;
varying vec2 V_Texcoord;
varying vec3 V_WorldPos;
varying vec4 V_ProjectCoord;
varying vec4 V_ProjectorSpaceFragPos;
float CalculateShadow(){
vec3 fragPos = V_ProjectorSpaceFragPos.xyz / V_ProjectorSpaceFragPos.w;
fragPos = fragPos * 0.5 + vec3(0.5);
float depthInShadowMap = texture2D(U_ShadowMap, fragPos.xy).r;
float currentDepth = fragPos.z;
float shadow = (currentDepth - 0.001) > depthInShadowMap ? 1.0 : 0.0;
return shadow;
}
void main()
{
if(V_ProjectCoord.z > 0){
gl_FragColor = texture2D(U_MainTexture, V_Texcoord) * textureProj(U_ProjectiveTexture, V_ProjectCoord) * 0.5;
float shadow = CalculateShadow();
gl_FragColor = 0.5*texture2D(U_MainTexture, V_Texcoord) + textureProj(U_ProjectiveTexture, V_ProjectCoord) * 0.5 *vec4(1.0 - shadow);
} else {
gl_FragColor = texture2D(U_MainTexture, V_Texcoord);
}

4
res/shader/projector.vs

@ -6,10 +6,13 @@ uniform mat4 M;
uniform mat4 P;
uniform mat4 V;
uniform mat4 U_ProjectorMatrix;
uniform mat4 U_ProjectorNoTransScaleMatrix;
varying vec2 V_Texcoord;
varying vec3 V_WorldPos;
varying vec4 V_ProjectCoord;
varying vec4 V_ProjectorSpaceFragPos;
void main()
{
@ -18,6 +21,7 @@ void main()
V_WorldPos = worldPos.xyz;
V_ProjectCoord = U_ProjectorMatrix * worldPos;
V_ProjectorSpaceFragPos = U_ProjectorNoTransScaleMatrix * worldPos;
gl_Position=P*V*M*vec4(pos,1.0);
}

1
res/shader/sample_depth_buffer.fs

@ -1,4 +1,5 @@
void main()
{
}

3
shader3.vcxproj

@ -82,10 +82,13 @@
<ClInclude Include="utils.h" />
</ItemGroup>
<ItemGroup>
<None Include="res\shader\depthrender.fs" />
<None Include="res\shader\projector.fs" />
<None Include="res\shader\projector.vs" />
<None Include="res\shader\sample.fs" />
<None Include="res\shader\sample.vs" />
<None Include="res\shader\sample_depth_buffer.fs" />
<None Include="res\shader\sample_depth_buffer.vs" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">

9
shader3.vcxproj.filters

@ -58,5 +58,14 @@
<None Include="res\shader\sample.vs">
<Filter>src</Filter>
</None>
<None Include="res\shader\depthrender.fs">
<Filter>src</Filter>
</None>
<None Include="res\shader\sample_depth_buffer.fs">
<Filter>src</Filter>
</None>
<None Include="res\shader\sample_depth_buffer.vs">
<Filter>src</Filter>
</None>
</ItemGroup>
</Project>
Loading…
Cancel
Save