Browse Source

HDR combine

master
blobt 4 years ago
parent
commit
e514db17a3
  1. BIN
      .vs/shader3/v14/.suo
  2. 7
      FBO.cpp
  3. 4
      FBO.h
  4. 32
      main.cpp
  5. 9
      res/shader/combine.fs
  6. 11
      res/shader/hdr.fs
  7. 1
      shader3.vcxproj
  8. 3
      shader3.vcxproj.filters

BIN
.vs/shader3/v14/.suo

7
FBO.cpp

@ -23,7 +23,7 @@ void FBO::AttachColorBuffer(const char*bufferName, GLenum attachment, GLenum dat
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_2D, colorBuffer, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_2D, colorBuffer, 0);
mDrawBuffers.push(attachment);
mDrawBuffers.push_back(attachment);
mBuffers.insert(std::pair<std::string,GLuint>(bufferName,colorBuffer)); mBuffers.insert(std::pair<std::string,GLuint>(bufferName,colorBuffer));
glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindFramebuffer(GL_FRAMEBUFFER, 0);
} }
@ -52,10 +52,9 @@ void FBO::Finish()
{ {
GLenum *buffers = new GLenum[nCount]; GLenum *buffers = new GLenum[nCount];
int i = 0; int i = 0;
while (!mDrawBuffers.empty())
while (i < nCount)
{ {
buffers[i++] = mDrawBuffers.top();
mDrawBuffers.pop();
buffers[i++] = mDrawBuffers[i];
} }
glBindFramebuffer(GL_FRAMEBUFFER, mFBO); glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
glDrawBuffers(nCount, buffers); glDrawBuffers(nCount, buffers);

4
FBO.h

@ -1,14 +1,14 @@
#pragma once #pragma once
#include "glew.h" #include "glew.h"
#include <map> #include <map>
#include <stack>
#include <vector>
class FBO class FBO
{ {
public: public:
GLuint mFBO; GLuint mFBO;
std::map<std::string, GLuint> mBuffers; std::map<std::string, GLuint> mBuffers;
std::stack<GLenum> mDrawBuffers;
std::vector<GLenum> mDrawBuffers;
public: public:
FBO(); FBO();
//hdr/normal color //hdr/normal color

32
main.cpp

@ -90,14 +90,15 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
hdrProgram.DetectAttribute("texcoord"); hdrProgram.DetectAttribute("texcoord");
hdrProgram.DetectUniform("U_MainTexture"); hdrProgram.DetectUniform("U_MainTexture");
//init dilation program
GPUProgram gaussianProgram;
gaussianProgram.AttachShader(GL_VERTEX_SHADER, "res/shader/fullscreenquad.vs");
gaussianProgram.AttachShader(GL_FRAGMENT_SHADER, "res/shader/fullscreenquad_gaussian.fs");
gaussianProgram.Link();
gaussianProgram.DetectAttribute("pos");
gaussianProgram.DetectAttribute("texcoord");
gaussianProgram.DetectUniform("U_MainTexture");
//combine program
GPUProgram combineProgram;
combineProgram.AttachShader(GL_VERTEX_SHADER, "res/shader/fullscreenquad.vs");
combineProgram.AttachShader(GL_FRAGMENT_SHADER, "res/shader/combine.fs");
combineProgram.Link();
combineProgram.DetectAttribute("pos");
combineProgram.DetectAttribute("texcoord");
combineProgram.DetectUniform("U_MainTexture");
combineProgram.DetectUniform("U_HDRTexture");
//init gpu program //init gpu program
GPUProgram gpuProgram; GPUProgram gpuProgram;
@ -167,7 +168,8 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
fbo.Finish(); fbo.Finish();
FBO HDRfbo; FBO HDRfbo;
HDRfbo.AttachColorBuffer("color", GL_COLOR_ATTACHMENT0, GL_RGBA16F, viewportWidth, viewportHeight);
HDRfbo.AttachColorBuffer("color", GL_COLOR_ATTACHMENT0, GL_RGBA, viewportWidth, viewportHeight);
HDRfbo.AttachColorBuffer("hdrcolor", GL_COLOR_ATTACHMENT1, GL_RGBA16F, viewportWidth, viewportHeight);
HDRfbo.AttachDepthBuffer("depth", viewportWidth, viewportHeight); HDRfbo.AttachDepthBuffer("depth", viewportWidth, viewportHeight);
HDRfbo.Finish(); HDRfbo.Finish();
@ -225,14 +227,18 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
fsq.DrawToLeftTop(originalProgram.GetLocation("pos"), originalProgram.GetLocation("texcoord")); fsq.DrawToLeftTop(originalProgram.GetLocation("pos"), originalProgram.GetLocation("texcoord"));
glUseProgram(hdrProgram.mProgram); glUseProgram(hdrProgram.mProgram);
glBindTexture(GL_TEXTURE_2D, HDRfbo.GetBuffer("color"));
glBindTexture(GL_TEXTURE_2D, HDRfbo.GetBuffer("hdrcolor"));
glUniform1i(hdrProgram.GetLocation("U_MainTexture"), 0); glUniform1i(hdrProgram.GetLocation("U_MainTexture"), 0);
fsq.DrawToRightTop(hdrProgram.GetLocation("pos"), hdrProgram.GetLocation("texcoord")); fsq.DrawToRightTop(hdrProgram.GetLocation("pos"), hdrProgram.GetLocation("texcoord"));
glUseProgram(gaussianProgram.mProgram);
glUseProgram(combineProgram.mProgram);
glBindTexture(GL_TEXTURE_2D, HDRfbo.GetBuffer("color")); glBindTexture(GL_TEXTURE_2D, HDRfbo.GetBuffer("color"));
glUniform1i(gaussianProgram.GetLocation("U_MainTexture"), 0);
fsq.DrawToRightBottom(gaussianProgram.GetLocation("pos"), gaussianProgram.GetLocation("texcoord"));
glUniform1i(combineProgram.GetLocation("U_MainTexture"), 0);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, HDRfbo.GetBuffer("hdrcolor"));
glUniform1i(combineProgram.GetLocation("U_HDRTexture"), 1);
fsq.DrawToRightBottom(combineProgram.GetLocation("pos"), combineProgram.GetLocation("texcoord"));
SwapBuffers(dc); SwapBuffers(dc);
} }

9
res/shader/combine.fs

@ -0,0 +1,9 @@
varying vec2 V_Texcoord;
uniform sampler2D U_MainTexture;
uniform sampler2D U_HDRTexture;
void main()
{
gl_FragColor = texture2D(U_MainTexture, V_Texcoord) + texture2D(U_HDRTexture, V_Texcoord);
}

11
res/shader/hdr.fs

@ -66,5 +66,14 @@ void main()
vec3 VD = normalize(U_EyePos - V_WorldPos); vec3 VD = normalize(U_EyePos - V_WorldPos);
vec4 specularColor = U_SpecularLightColor * U_SpecularMaterial * pow(max(0.0, dot(RD,VD)) ,128); vec4 specularColor = U_SpecularLightColor * U_SpecularMaterial * pow(max(0.0, dot(RD,VD)) ,128);
gl_FragColor = (ambientColor + diffuseColor) * 10.0;
//gl_FragColor = ambientColor + diffuseColor;
vec4 color = ambientColor + diffuseColor;
if(color.r > 1.0){
gl_FragData[1] = color;
} else {
gl_FragData[0] = color;
}
} }

1
shader3.vcxproj

@ -82,6 +82,7 @@
<ClInclude Include="utils.h" /> <ClInclude Include="utils.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="res\shader\combine.fs" />
<None Include="res\shader\fullscreenquad.vs" /> <None Include="res\shader\fullscreenquad.vs" />
<None Include="res\shader\fullscreenquad_gaussian.fs" /> <None Include="res\shader\fullscreenquad_gaussian.fs" />
<None Include="res\shader\fullscreenquad_gaussian_horizontal.fs" /> <None Include="res\shader\fullscreenquad_gaussian_horizontal.fs" />

3
shader3.vcxproj.filters

@ -70,5 +70,8 @@
<None Include="res\shader\fullscreenquad.vs"> <None Include="res\shader\fullscreenquad.vs">
<Filter>src</Filter> <Filter>src</Filter>
</None> </None>
<None Include="res\shader\combine.fs">
<Filter>src</Filter>
</None>
</ItemGroup> </ItemGroup>
</Project> </Project>
Loading…
Cancel
Save