From 74b6493f0ec2c5fc239ca20a5687c6f33d36c50e Mon Sep 17 00:00:00 2001 From: blobt Date: Thu, 25 Jun 2020 21:08:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B8=B2=E6=9F=93fbo=E5=88=B0=E5=A4=9A?= =?UTF-8?q?=E4=B8=AA=E7=BA=B9=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vs/shader2/v14/.suo | Bin 52224 -> 53248 bytes main.cpp | 28 ++++++++++++++++++++-------- misc.cpp | 17 ++++++++++++++++- misc.h | 2 +- res/shader/MixLightMT.fs | 35 +++++++++++++++++++++++++++++++++++ res/shader/MixLightMT.vs | 19 +++++++++++++++++++ shader2.vcxproj | 4 ++-- shader2.vcxproj.filters | 4 ++-- 8 files changed, 95 insertions(+), 14 deletions(-) create mode 100644 res/shader/MixLightMT.fs create mode 100644 res/shader/MixLightMT.vs diff --git a/.vs/shader2/v14/.suo b/.vs/shader2/v14/.suo index a6d1dfba96db539a59563c80f55d0f1a09372476..a243411e7c4b8356079091c4c46dd807d76d5083 100644 GIT binary patch delta 1626 zcmc(fe@t6d6vyAa@AU`twUm}01KXw)1_;`nREnt{&Cr|;j0mq1-D**L}M1rh;FE1TcZ9mr}0NjG)|Wk{~!)L7h37&jDLDx zKDpHlDGvym~Df@^e|DgMXDo%8uZ*+ zSs%-28qrsX)FF0+ud1>$x7BDDA+3lx>v!Q?kCY;1h#uj&O87hxG#7ND!8c1Vp}MDi z1KvH5^>FX~S-UCESB`cgvKjFpUStc>jF=D~+?3442DEsFZ8*0f9o*}C1g#y&PGlEi zLmoxCklhI1!AB77J;+`pgzQ5GvBFkz0Nh$LOsaa4G-h!9ymK_CpRlH%$QIRR(v`0t z*NrF5>Bjr#x^XSJt;0EAH}1PlHz-zB>vKXCU~~yKQ{G;M)_;j5W6b|1mg)eWUW~Fu zO@s&nMR;!#&MLx|bT>%SU{Bd=D6?1A6X>rtL)cOQ@uEc9BvB?A|0L?QjTpQ{(q(f* zc3?{W)G*Hq1T8g?+3SQ?>nv<*W#Mfpk`LLz9;wz7KSt-?hSeSMNVlHw{T+FE3NBDD8HHePCj@$1l2$cSZ&)I*=b($Z#;=gF{lXAlA1yrGetIDo|Kt2K z7pI^4$_+Qql!Eg$6KwSyH9Emk@%JpEknKloR@??hf>+R@ck*P2yo9dbL~=PRNU@i}FK*h*`F=mq}y z@Gtpq@#AfYyH}g%y*A$nonG%h>W7Ipeek(=bGjx#WIRgX@9KKyjR~chCQW|kZ~mGv zdsB*lzusLC#-J!7uv-Ov3RB|%~4n3FljuZoI;DyOJ&L<_<9Y|J+K z9f8@oJ!*^3kgM=bExX$=gFSlMqZMM|qM zAUF7L^9dvXw#f=M`_8+fivPTA?AiBUzyl??a(o~)a9+a(roxoXesYAs$8UT9{j3y< ZUePei%nw#&o&r5#f>TpQ=J@bB`3ozCAPfKi delta 1889 zcmb7_eN08I|(@3;R*0xFeC5TJ+lz!yUr_7~NXel5=ZbN7Br z!0|E;Q&4IUJHl7fW0Lo?v7d+-k)22u@(falSddJ_fN=+OP<1b=z8oIAv}c->O3liI@IAM;3?dOImocYlD29Y&sm0rm*>gzmiJs2+TEA%egda*haKZ$DCdi;Faf17Bx}5jWXMY=|l}bIdLtvRH|3wi)A~t;yLKT=lYjH|IF=$(M$A7 z?$DvkQ}D-U7I1!Kf{nJ*$)(d(SH%y1=p1A>*Sm;ublKWoo2TtpUA*=DFH`epn6ddb zk^NL!XJfYJMZ$O9sF6zN{`1nHJ}J60LK7qCN@EK2Z26l6;n>!GvYp-8s-rwyj9ky_ z!w)c*_d;H>I+?veR{w8>Ej2kQvv+METK-9{8bpo^%X>7?5(>j&PA(I}qD~rGBG=*0 z(J%-L2Vk=M75;5w18Z*y&|VSd4p);t_H{2Iau=0E1%v_t6j1qjQa=!;3N2SN*ak$-eZinCRb2(htw)lM&zCfL)4>pbDgK|oMeIo}+ ze1lBiTFr?{MUZ=~Q;6G}i`MD@s~*WBpqv$_oaYD#k^s)}aQd;>j(86$?_=N1PD?r> zzpJI~2jS&0Gn;`UWYt@3C)(!o$F1jMh+PX_atsY;f za=**bTJEiIcs+iid#O^rp*jQ$ z8}mRqoCU&#A~4BWAYKr`I8zO&=ZhdLpJ&Ph`taw)e8`{rm65@_YI%}M(+UK?HL?1S zZxNBS|dx^WXCR E1@w_;6#xJL 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 @@ - + 婧愭枃浠 - + 婧愭枃浠