blobt 4 years ago
parent
commit
de539f866c
  1. BIN
      .vs/shader3/v14/.suo
  2. 8
      FBO.cpp
  3. 68
      main.cpp
  4. 70
      res/shader/hdr.fs
  5. 13
      res/shader/hdrrender.fs
  6. 3
      shader3.vcxproj
  7. 9
      shader3.vcxproj.filters
  8. 33
      utils.cpp
  9. 5
      utils.h

BIN
.vs/shader3/v14/.suo

8
FBO.cpp

@ -13,7 +13,13 @@ void FBO::AttachColorBuffer(const char*bufferName, GLenum attachment, GLenum dat
glBindTexture(GL_TEXTURE_2D, colorBuffer); glBindTexture(GL_TEXTURE_2D, colorBuffer);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, dataType, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
if (dataType == GL_RGBA16F) {
glTexImage2D(GL_TEXTURE_2D, 0, dataType, width, height, 0, GL_RGBA, GL_UNSIGNED_SHORT, NULL);
}
else {
glTexImage2D(GL_TEXTURE_2D, 0, dataType, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
}
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);

68
main.cpp

@ -81,23 +81,14 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
originalProgram.DetectAttribute("texcoord"); originalProgram.DetectAttribute("texcoord");
originalProgram.DetectUniform("U_MainTexture"); originalProgram.DetectUniform("U_MainTexture");
//init vertical program
GPUProgram verticalProgram;
verticalProgram.AttachShader(GL_VERTEX_SHADER, "res/shader/fullscreenquad.vs");
verticalProgram.AttachShader(GL_FRAGMENT_SHADER, "res/shader/fullscreenquad_gaussian_vertical.fs");
verticalProgram.Link();
verticalProgram.DetectAttribute("pos");
verticalProgram.DetectAttribute("texcoord");
verticalProgram.DetectUniform("U_MainTexture");
//init horizontal program
GPUProgram horizontalProgram;
horizontalProgram.AttachShader(GL_VERTEX_SHADER, "res/shader/fullscreenquad.vs");
horizontalProgram.AttachShader(GL_FRAGMENT_SHADER, "res/shader/fullscreenquad_gaussian_horizontal.fs");
horizontalProgram.Link();
horizontalProgram.DetectAttribute("pos");
horizontalProgram.DetectAttribute("texcoord");
horizontalProgram.DetectUniform("U_MainTexture");
//init hdr program
GPUProgram hdrProgram;
hdrProgram.AttachShader(GL_VERTEX_SHADER, "res/shader/fullscreenquad.vs");
hdrProgram.AttachShader(GL_FRAGMENT_SHADER, "res/shader/hdrrender.fs");
hdrProgram.Link();
hdrProgram.DetectAttribute("pos");
hdrProgram.DetectAttribute("texcoord");
hdrProgram.DetectUniform("U_MainTexture");
//init dilation program //init dilation program
GPUProgram gaussianProgram; GPUProgram gaussianProgram;
@ -111,7 +102,7 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
//init gpu program //init gpu program
GPUProgram gpuProgram; GPUProgram gpuProgram;
gpuProgram.AttachShader(GL_VERTEX_SHADER, "res/shader/test.vs"); gpuProgram.AttachShader(GL_VERTEX_SHADER, "res/shader/test.vs");
gpuProgram.AttachShader(GL_FRAGMENT_SHADER, "res/shader/test.fs");
gpuProgram.AttachShader(GL_FRAGMENT_SHADER, "res/shader/hdr.fs");
gpuProgram.Link(); gpuProgram.Link();
gpuProgram.DetectAttribute("pos"); gpuProgram.DetectAttribute("pos");
@ -175,10 +166,10 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
fbo.AttachDepthBuffer("depth", viewportWidth, viewportHeight); fbo.AttachDepthBuffer("depth", viewportWidth, viewportHeight);
fbo.Finish(); fbo.Finish();
FBO fbo2;
fbo2.AttachColorBuffer("color", GL_COLOR_ATTACHMENT0, GL_RGBA, viewportWidth, viewportHeight);
fbo2.AttachDepthBuffer("depth", viewportWidth, viewportHeight);
fbo2.Finish();
FBO HDRfbo;
HDRfbo.AttachColorBuffer("color", GL_COLOR_ATTACHMENT0, GL_RGBA16F, viewportWidth, viewportHeight);
HDRfbo.AttachDepthBuffer("depth", viewportWidth, viewportHeight);
HDRfbo.Finish();
ShowWindow(hwnd, SW_SHOW); ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd); UpdateWindow(hwnd);
@ -199,7 +190,7 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
fbo.Bind();
HDRfbo.Bind();
glUseProgram(gpuProgram.mProgram); glUseProgram(gpuProgram.mProgram);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUniform4fv(gpuProgram.GetLocation("U_AmbientLightColor"), 1, ambientLightColor); glUniform4fv(gpuProgram.GetLocation("U_AmbientLightColor"), 1, ambientLightColor);
@ -220,40 +211,27 @@ INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
obj.Bind(gpuProgram.GetLocation("pos"), gpuProgram.GetLocation("texcoord"), gpuProgram.GetLocation("normal")); obj.Bind(gpuProgram.GetLocation("pos"), gpuProgram.GetLocation("texcoord"), gpuProgram.GetLocation("normal"));
obj.Draw(); obj.Draw();
glUseProgram(0); glUseProgram(0);
fbo.Unbind();
//blur * 2
fbo2.Bind();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(gaussianProgram.mProgram);
glBindTexture(GL_TEXTURE_2D, fbo.GetBuffer("color"));
glUniform1i(gaussianProgram.GetLocation("U_MainTexture"), 0);
fsq.Draw(gaussianProgram.GetLocation("pos"), gaussianProgram.GetLocation("texcoord"));
fbo2.Unbind();
HDRfbo.Unbind();
glFlush(); glFlush();
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, fbo.GetBuffer("color"));
glUniform1i(originalProgram.GetLocation("U_MainTexture"), 0);
glUseProgram(originalProgram.mProgram); glUseProgram(originalProgram.mProgram);
glBindTexture(GL_TEXTURE_2D, HDRfbo.GetBuffer("color"));
glUniform1i(originalProgram.GetLocation("U_MainTexture"), 0);
fsq.DrawToLeftTop(originalProgram.GetLocation("pos"), originalProgram.GetLocation("texcoord")); fsq.DrawToLeftTop(originalProgram.GetLocation("pos"), originalProgram.GetLocation("texcoord"));
glUseProgram(verticalProgram.mProgram);
fsq.DrawToRightTop(verticalProgram.GetLocation("pos"), verticalProgram.GetLocation("texcoord"));
glUseProgram(horizontalProgram.mProgram);
fsq.DrawToLeftBottom(horizontalProgram.GetLocation("pos"), horizontalProgram.GetLocation("texcoord"));
glUseProgram(hdrProgram.mProgram);
glBindTexture(GL_TEXTURE_2D, HDRfbo.GetBuffer("color"));
glUniform1i(hdrProgram.GetLocation("U_MainTexture"), 0);
fsq.DrawToRightTop(hdrProgram.GetLocation("pos"), hdrProgram.GetLocation("texcoord"));
glUseProgram(gaussianProgram.mProgram); glUseProgram(gaussianProgram.mProgram);
glBindTexture(GL_TEXTURE_2D, fbo2.GetBuffer("color"));
glUniform1i(originalProgram.GetLocation("U_MainTexture"), 0);
glBindTexture(GL_TEXTURE_2D, HDRfbo.GetBuffer("color"));
glUniform1i(gaussianProgram.GetLocation("U_MainTexture"), 0);
fsq.DrawToRightBottom(gaussianProgram.GetLocation("pos"), gaussianProgram.GetLocation("texcoord")); fsq.DrawToRightBottom(gaussianProgram.GetLocation("pos"), gaussianProgram.GetLocation("texcoord"));
SwapBuffers(dc); SwapBuffers(dc);

70
res/shader/hdr.fs

@ -0,0 +1,70 @@
uniform vec4 U_AmbientLightColor;
uniform vec4 U_AmbientMaterial;
uniform vec4 U_LightPos;
uniform vec4 U_LightDirection;
uniform float U_Cutoff;
uniform float U_DiffuseIntensity;
uniform vec4 U_DiffuseLightColor;
uniform vec4 U_DiffuseMaterial;
uniform vec3 U_EyePos;
uniform vec4 U_SpecularLightColor;
uniform vec4 U_SpecularMaterial;
varying vec3 V_Normal;
varying vec3 V_WorldPos;
void main()
{
//common
vec3 N = normalize(V_Normal);
//ambient
vec4 ambientColor = U_AmbientLightColor * U_AmbientMaterial;
//diffuse
vec3 L = vec3(0.0);
float attenuation = 1.0;
float diffuseIntensity = 0.0;
if(U_LightPos.w != 0){//
L = normalize(U_LightPos.xyz - V_WorldPos);
float distance = length(U_LightPos.xyz - V_WorldPos);
float constantFactor=0.5;
float linearFactor=0.3;
float expFactor=0.1;
attenuation = 1.0 / (constantFactor + linearFactor * distance + expFactor * distance * distance);
if( U_Cutoff > 0){//
//
float radianCutoff = U_Cutoff * 3.14 / 180;
float cosThta = cos(radianCutoff);
vec3 spotLightDirection = normalize(U_LightDirection.xyz);
float currentThta = max(0.0, dot(-L, spotLightDirection));
if(currentThta > cosThta){
if(dot(L,N)>0.0)
{
diffuseIntensity=pow(currentThta,U_LightDirection.w);
}
}
} else {
diffuseIntensity = max(0.0, dot(L,N));
}
} else {
//
L = normalize(U_LightPos.xyz - vec3(0.0));
diffuseIntensity = max(0.0, dot(L,N));
}
vec4 diffuseColor = U_DiffuseLightColor * U_DiffuseMaterial * attenuation * diffuseIntensity * U_DiffuseIntensity;
//specualr
vec3 RD = normalize(reflect(-L,N));
vec3 VD = normalize(U_EyePos - V_WorldPos);
vec4 specularColor = U_SpecularLightColor * U_SpecularMaterial * pow(max(0.0, dot(RD,VD)) ,128);
gl_FragColor = (ambientColor + diffuseColor) * 10.0;
}

13
res/shader/hdrrender.fs

@ -0,0 +1,13 @@
varying vec2 V_Texcoord;
uniform sampler2D U_MainTexture;
void main()
{
vec4 color = texture2D(U_MainTexture, V_Texcoord);
if(color.r > 2.0){
discard;
}
gl_FragColor = color;
}

3
shader3.vcxproj

@ -82,9 +82,12 @@
<ClInclude Include="utils.h" /> <ClInclude Include="utils.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<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" />
<None Include="res\shader\fullscreenquad_gaussian_vertical.fs" /> <None Include="res\shader\fullscreenquad_gaussian_vertical.fs" />
<None Include="res\shader\hdr.fs" />
<None Include="res\shader\hdrrender.fs" />
<None Include="res\shader\test.fs" /> <None Include="res\shader\test.fs" />
<None Include="res\shader\test.vs" /> <None Include="res\shader\test.vs" />
</ItemGroup> </ItemGroup>

9
shader3.vcxproj.filters

@ -61,5 +61,14 @@
<None Include="res\shader\fullscreenquad_gaussian_vertical.fs"> <None Include="res\shader\fullscreenquad_gaussian_vertical.fs">
<Filter>src</Filter> <Filter>src</Filter>
</None> </None>
<None Include="res\shader\hdr.fs">
<Filter>src</Filter>
</None>
<None Include="res\shader\hdrrender.fs">
<Filter>src</Filter>
</None>
<None Include="res\shader\fullscreenquad.vs">
<Filter>src</Filter>
</None>
</ItemGroup> </ItemGroup>
</Project> </Project>

33
utils.cpp

@ -73,4 +73,37 @@ GLuint CreateTextureFromFile(const char*filePath)
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
delete imageData; delete imageData;
return texture; return texture;
}
void CheckGLError(const char*file, int line)
{
GLenum error = glGetError();
if (error != GL_NO_ERROR)
{
switch (error)
{
case GL_INVALID_ENUM:
printf("GL Error GL_INVALID_ENUM %s : %d\n", file, line);
break;
case GL_INVALID_VALUE:
printf("GL Error GL_INVALID_VALUE %s : %d\n", file, line);
break;
case GL_INVALID_OPERATION:
printf("GL Error GL_INVALID_OPERATION %s : %d\n", file, line);
break;
case GL_STACK_OVERFLOW:
printf("GL Error GL_STACK_OVERFLOW %s : %d\n", file, line);
break;
case GL_STACK_UNDERFLOW:
printf("GL Error GL_STACK_UNDERFLOW %s : %d\n", file, line);
break;
case GL_OUT_OF_MEMORY:
printf("GL Error GL_OUT_OF_MEMORY %s : %d\n", file, line);
break;
default:
printf("GL Error 0x%x %s : %d\n", error, file, line);
break;
}
}
} }

5
utils.h

@ -2,4 +2,7 @@
#include "glew.h" #include "glew.h"
char* LoadFileContent(const char*path); char* LoadFileContent(const char*path);
unsigned char* LoadBMP(const char*path, int &width, int &height); unsigned char* LoadBMP(const char*path, int &width, int &height);
GLuint CreateTextureFromFile(const char*filePath);
GLuint CreateTextureFromFile(const char*filePath);
void CheckGLError(const char* file, int line);
#define GL_CALL(x) do{x;CheckGLError(__FILE__, __LINE__);}while(0)
Loading…
Cancel
Save