diff --git a/.vs/shader2/v14/.suo b/.vs/shader2/v14/.suo index a6d1dfb..a243411 100644 Binary files a/.vs/shader2/v14/.suo and b/.vs/shader2/v14/.suo differ diff --git a/main.cpp b/main.cpp index 6e1c620..797b63b 100644 --- a/main.cpp +++ b/main.cpp @@ -91,7 +91,7 @@ INT WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine glewInit(); /*创建program*/ - GLuint program = CreateGPUProgram("res/shader/test.vs", "res/shader/test.fs"); + GLuint program = CreateGPUProgram("res/shader/MixLightMT.vs", "res/shader/MixLightMT.fs"); GLuint posLocation, texcoordLocation, normalLocation, MLocation, VLocation, PLocation, NMLocation, textureLocation, offsetLocation; posLocation = glGetAttribLocation(program, "pos"); @@ -134,8 +134,8 @@ INT WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine GLuint mainTexture = CreateTextureFromFile("res/image/niutou.bmp"); /*创建FBO*/ - GLuint colorBuffer, depthBuffer; - GLuint fbo = CreateFramebufferObject(colorBuffer, depthBuffer, windowWidth, windowHeight); + GLuint colorBuffer, depthBuffer, colorBuffer2; + GLuint fbo = CreateFramebufferObject(colorBuffer, depthBuffer, windowWidth, windowHeight, &colorBuffer2); glViewport(0, 0, windowWidth, windowHeight); @@ -208,15 +208,27 @@ INT WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine GL_CALL(glClearColor(0.5f, 0.4f, 0.7f, 1.0f)); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, colorBuffer); + glEnable(GL_SCISSOR_TEST); + glBindTexture(GL_TEXTURE_2D, colorBuffer); + glScissor(0, 0, windowWidth, windowHeight/2); glBegin(GL_QUADS); - glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, -4.0f); - glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, -0.5f, -4.0f); - glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, 0.5f, -4.0f); - glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, -4.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, -1.0f); + glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, -0.5f, -1.0f); + glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, 0.5f, -1.0f); + glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, -1.0f); glEnd(); + glBindTexture(GL_TEXTURE_2D, colorBuffer2); + glScissor(0, windowHeight / 2, windowWidth, windowHeight / 2); + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, -1.0f); + glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, -0.5f, -1.0f); + glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, 0.5f, -1.0f); + glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, -1.0f); + glEnd(); + + glDisable(GL_SCISSOR_TEST); SwapBuffers(dc); } diff --git a/misc.cpp b/misc.cpp index 6ae2905..d71c077 100644 --- a/misc.cpp +++ b/misc.cpp @@ -26,7 +26,7 @@ GLuint CreateVAOWithVBOSettings(std::function settings) return vao; } -GLuint CreateFramebufferObject(GLuint & colorBuffer, GLuint & depthBuffer, int width, int height) +GLuint CreateFramebufferObject(GLuint & colorBuffer, GLuint & depthBuffer, int width, int height, GLuint *colorBuffer2) { GLuint fbo; glGenFramebuffers(1, &fbo); @@ -43,6 +43,21 @@ GLuint CreateFramebufferObject(GLuint & colorBuffer, GLuint & depthBuffer, int w glBindTexture(GL_TEXTURE_2D, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBuffer, 0);//绑定刚才生成的texture到GL_COLOR_ATTACHMENT0 + //colorbuffer2 + if (colorBuffer2 != nullptr) { + glGenTextures(1, colorBuffer2); + glBindTexture(GL_TEXTURE_2D, *colorBuffer2); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glBindTexture(GL_TEXTURE_2D, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, *colorBuffer2, 0);//绑定刚才生成的texture到GL_COLOR_ATTACHMENT0 + GLenum buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 }; + glDrawBuffers(2, buffers); + } + //depthbuffer glGenTextures(1, &depthBuffer); glBindTexture(GL_TEXTURE_2D, depthBuffer); diff --git a/misc.h b/misc.h index b074a4b..703a6db 100644 --- a/misc.h +++ b/misc.h @@ -4,7 +4,7 @@ GLuint CreateBufferObject(GLenum bufferType, GLsizeiptr size, GLenum usage, void* data = nullptr); GLuint CreateVAOWithVBOSettings(std::functionsettings); -GLuint CreateFramebufferObject(GLuint &colorBuffer, GLuint &depthBuffer, int width, int height); +GLuint CreateFramebufferObject(GLuint &colorBuffer, GLuint &depthBuffer, int width, int height, GLuint *colorBuffer2 = nullptr); char* LoadFileContent(const char *path); GLuint CompileShader(GLenum shaderType, const char* shaderPath); diff --git a/res/shader/MixLightMT.fs b/res/shader/MixLightMT.fs new file mode 100644 index 0000000..d3b5922 --- /dev/null +++ b/res/shader/MixLightMT.fs @@ -0,0 +1,35 @@ +uniform sampler2D U_MainTexture; +varying vec3 V_Normal; +varying vec4 V_WorldPos;//当前的位置 +varying vec2 V_Texcoord; + +void main() { + + vec3 lightPos = vec3(10.0, 10.0, 0.0); + vec3 L=lightPos; + L = normalize(L); + vec3 n = normalize(V_Normal); + + + //ambient + vec4 AmbientLightColor = vec4(0.2, 0.2, 0.2, 1.0); + vec4 AmbientMaterial = vec4(0.2, 0.2, 0.2, 1.0); + vec4 AmbientColor = AmbientLightColor*AmbientMaterial; + + //diffuse + vec4 DiffuseLightColor = vec4(1.0,1.0,1.0,1.0); + vec4 DiffuseMaterial = vec4(0.8, 0.8, 0.8, 1.0); + vec4 diffuseColor = DiffuseLightColor*DiffuseMaterial*max(0.0, dot(L,n)); + + //specular + vec4 SpecularLightColor = vec4(1.0,1.0,1.0,1.0); + vec4 SpecularMaterial = vec4(0.9,0.9,0.9,1.0); + vec3 reflectDir = normalize(reflect(-L,n));//-L就是光线的入射方向向量,以法线为基础计算方式向量 + vec3 viewDir = normalize(vec3(0.0) - V_WorldPos.xyz);//vec3(0.0)表示已中心为观察点,这里求的是眼睛到物体的视线向量 + vec4 specularColor = SpecularLightColor*SpecularMaterial*pow(max(0.0,dot(viewDir,reflectDir)),128.0); + + + //gl_FragColor = texture2D(U_MainTexture, V_Texcoord) * (AmbientColor + diffuseColor + specularColor); + gl_FragData[0] = AmbientColor + texture2D(U_MainTexture, V_Texcoord) * diffuseColor + specularColor; + gl_FragData[1] = vec4(1.0); +} \ No newline at end of file diff --git a/res/shader/MixLightMT.vs b/res/shader/MixLightMT.vs new file mode 100644 index 0000000..c28572e --- /dev/null +++ b/res/shader/MixLightMT.vs @@ -0,0 +1,19 @@ +attribute vec3 pos; +attribute vec2 texcoord; +attribute vec3 normal; + +uniform mat4 M; +uniform mat4 V; +uniform mat4 P; +uniform mat4 NM; + +varying vec3 V_Normal; +varying vec4 V_WorldPos;//当前的位置 +varying vec2 V_Texcoord; + +void main() { + V_Normal = mat3(NM)*normal; + V_WorldPos = M * vec4(pos, 1.0); + V_Texcoord = texcoord; + gl_Position = P*V*M*vec4(pos,1.0); +} \ No newline at end of file diff --git a/shader2.vcxproj b/shader2.vcxproj index 407f510..14aeab5 100644 --- a/shader2.vcxproj +++ b/shader2.vcxproj @@ -159,8 +159,8 @@ - - + + diff --git a/shader2.vcxproj.filters b/shader2.vcxproj.filters index 1a92544..9ed379d 100644 --- a/shader2.vcxproj.filters +++ b/shader2.vcxproj.filters @@ -46,10 +46,10 @@ - + 婧愭枃浠 - + 婧愭枃浠