找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3733|回复: 2

【屏保】某扭曲效果的屏保

[复制链接]
发表于 2014-9-14 20:02:31 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
这个程序用OpenGL编写。使用了OpenGL EW库,在Windows上使用了高版本的OpenGL,因此需要一个glew32.dll
原理很简单。全屏截一张图。然后使用Fragment Shader也就是块着色器将其中的纹理坐标全部扭一边就行啦。
注意是会动的哦。它会一直在那儿鬼畜,直到你把它干掉为止。
按Alt+F4退出。切记是Alt+F4
Windows 7 x64-2014-09-14-19-29-55.png
  1. #define GLEW_STATIC/*使用静态glew库*/

  2. #include<stdio.h>
  3. #include<GL/glew.h>

  4. #include<Windows.h>

  5. LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
  6. WNDCLASSEX g_WCEx=
  7. {
  8.     sizeof(WNDCLASSEX),
  9.     0,
  10.     (WNDPROC)WndProc,
  11.     0,
  12.     0,
  13.     NULL,//hInstance
  14.     NULL,//hIcon
  15.     NULL,//hCursor
  16.     (HBRUSH)(COLOR_BTNFACE+1),
  17.     NULL,//Menu name
  18.     TEXT("FuckingWave"),
  19.     NULL
  20. };
  21. HWND                g_hWnd=NULL;
  22. HDC                 g_hDC=NULL;//窗口的绘图句柄
  23. HGLRC               g_hRC=NULL;//OpenGL句柄

  24. GLuint              g_uTex;//纹理
  25. GLuint              g_uProgram;//着色器程序
  26. GLuint              g_uUniform_g_fTime;

  27. UINT                g_uWidth;
  28. UINT                g_uHeight;

  29. //=============================================================================
  30. //Get2ndValue:
  31. //取得最小的大于Val的2的N次方数
  32. //-----------------------------------------------------------------------------
  33. GLsizei Get2ndValue(GLsizei Val)
  34. {
  35.     GLsizei Ret=1;
  36.     while(Ret<Val)
  37.         Ret<<=1;
  38.     return Ret;
  39. }

  40. //=============================================================================
  41. //CreateFullScreenWindow:
  42. //创建全屏窗口
  43. //-----------------------------------------------------------------------------
  44. BOOL CreateFullScreenWindow()
  45. {
  46.     ATOM aClass;
  47.     g_WCEx.hInstance=GetModuleHandle(NULL);
  48.     g_WCEx.hCursor=LoadCursor(NULL,MAKEINTRESOURCE(IDC_ARROW));

  49.     aClass=RegisterClassEx(&g_WCEx);
  50.     if(!aClass)
  51.         return FALSE;
  52.    
  53.     g_uWidth=GetSystemMetrics(SM_CXSCREEN);
  54.     g_uHeight=GetSystemMetrics(SM_CYSCREEN);

  55.     g_hWnd=CreateWindowEx(0,(LPCTSTR)aClass,TEXT(""),WS_POPUP|WS_SYSMENU,
  56.         0,0,g_uWidth,g_uHeight,
  57.         NULL,NULL,g_WCEx.hInstance,NULL);

  58.     if(!g_hWnd)
  59.         return FALSE;

  60.     return TRUE;
  61. }

  62. //=============================================================================
  63. //InitGL:
  64. //初始化图形库
  65. //-----------------------------------------------------------------------------
  66. void ShowShaderOutput(GLuint uProgram)
  67. {
  68.     GLsizei Length;
  69.     glGetProgramiv(uProgram,GL_INFO_LOG_LENGTH,&Length);
  70.     if(Length)
  71.     {
  72.         GLsizei BytesRet;
  73.         char*pBuffer=(char*)malloc(Length);
  74.         if(!pBuffer)
  75.             return;
  76.         glGetProgramInfoLog(uProgram,Length,&BytesRet,pBuffer);
  77.         if(strlen(pBuffer))
  78.             fprintf(stderr,"Shader Output:\n%s\n",pBuffer);
  79.         free(pBuffer);
  80.     }
  81. }
  82. void CleanupGL()
  83. {
  84.     wglMakeCurrent(NULL,NULL);
  85.     wglDeleteContext(g_hRC);
  86. }
  87. BOOL InitGL(HWND hWnd)
  88. {
  89.     PIXELFORMATDESCRIPTOR PFD={0};
  90.     int nPixelFormat;
  91.    
  92.     BITMAPINFOHEADER    BMIF={0};//BMP信息头
  93.     void                *pBits=NULL;//BMP位图
  94.     size_t              Pitch;//位图数据每行字节数
  95.     size_t              cbBytes;//位图数据总字节数
  96.     HDC                 hScreenDC;//屏幕绘图句柄
  97.     HDC                 hBufferDC;//缓冲区绘图句柄
  98.     HBITMAP             hBMPDC;//缓冲区位图

  99.     //取得屏幕绘图句柄
  100.     hScreenDC=GetDC(NULL);
  101.     if(!hScreenDC)
  102.         goto Cleanup;

  103.     //颜色数据是红绿蓝:8:8:8,因此每个像素3个字节
  104.     //但是BMP位图规定每行字节数必须是4的倍数
  105.     Pitch=((g_uWidth*3-1)/4+1)*4;

  106.     //总字节数
  107.     cbBytes=Pitch*g_uHeight;

  108.     BMIF.biSize=sizeof(BMIF);
  109.     BMIF.biWidth=g_uWidth;
  110.     BMIF.biHeight=g_uHeight;
  111.     BMIF.biPlanes=1;
  112.     BMIF.biBitCount=24;
  113.     BMIF.biSizeImage=cbBytes;

  114.     //建立缓冲区
  115.     hBufferDC=CreateCompatibleDC(NULL);
  116.     if(!hBufferDC)
  117.         goto Cleanup;
  118.     hBMPDC=CreateDIBSection(hBufferDC,(LPBITMAPINFO)&BMIF,DIB_RGB_COLORS,&pBits,NULL,0);
  119.     if(!hBMPDC)
  120.         goto Cleanup;
  121.     SelectObject(hBufferDC,hBMPDC);

  122.     g_hDC=GetDC(hWnd);

  123.     //画到缓冲区
  124.     BitBlt(hBufferDC,0,0,g_uWidth,g_uHeight,hScreenDC,0,0,SRCCOPY);
  125.     BitBlt(g_hDC,0,0,g_uWidth,g_uHeight,hScreenDC,0,0,SRCCOPY);

  126.     PFD.nSize       =sizeof(PFD);
  127.     PFD.nVersion    =1;
  128.     PFD.dwFlags     =PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER;
  129.     PFD.iPixelType  =PFD_TYPE_RGBA;
  130.     PFD.cDepthBits  =0;
  131.     PFD.cBlueBits   =8; PFD.cBlueShift  =16;
  132.     PFD.cGreenBits  =8; PFD.cGreenShift =8;
  133.     PFD.cRedBits    =8; PFD.cRedShift   =0;
  134.     PFD.iLayerType  =PFD_MAIN_PLANE;

  135.     nPixelFormat=ChoosePixelFormat(g_hDC,&PFD);
  136.     SetPixelFormat(g_hDC,nPixelFormat,&PFD);

  137.     g_hRC=wglCreateContext(g_hDC);
  138.     if(!g_hRC)
  139.         goto Cleanup;

  140.     wglMakeCurrent(g_hDC,g_hRC);
  141.     glewInit();
  142.     glViewport(0,0,g_uWidth,g_uHeight);

  143.     glGenTextures(1,&g_uTex);
  144.     glBindTexture(GL_TEXTURE_2D,g_uTex);
  145.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  146.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  147.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
  148.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
  149.     glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,g_uWidth,g_uHeight,0,GL_RGB,GL_UNSIGNED_BYTE,pBits);
  150.     glBindTexture(GL_TEXTURE_2D,0);
  151.    
  152.     DeleteDC(hBufferDC);
  153.     ReleaseDC(NULL,hScreenDC);
  154.     {
  155.         GLsizei VS,FS;
  156.         GLchar szVS[]=
  157.             "varying vec2 TexCoord;"
  158.             "void main()"
  159.             "{"
  160.             "   TexCoord=gl_MultiTexCoord0.xy;"
  161.             "   gl_Position=gl_Vertex;"
  162.             "}";
  163.         GLchar szFS[]=
  164.             "uniform float g_fTime;"
  165.             "uniform sampler2D tex;"
  166.             "const float PI=3.1415926535897932384626433832795;"
  167.             "varying vec2 TexCoord;"
  168.             "void main()"
  169.             "{"
  170.             "   float ftime=g_fTime*0.5;"
  171.             "   vec2 tcoord=vec2(TexCoord.x+sin((ftime+(TexCoord.x+TexCoord.y)*10.0)*PI)*0.01,TexCoord.y+cos((ftime+(TexCoord.x+TexCoord.y)*10.0)*PI)*0.01);"
  172.             "   vec4 vOrgColor=texture2D(tex,tcoord);"
  173.             "   gl_FragColor.x=vOrgColor.z*vOrgColor.a;"
  174.             "   gl_FragColor.y=vOrgColor.y*vOrgColor.a;"
  175.             "   gl_FragColor.z=vOrgColor.x*vOrgColor.a;"
  176.             "   gl_FragColor.a=vOrgColor.a;"
  177.             "}";
  178.         GLint sizeVS=sizeof(szVS);
  179.         GLint sizeFS=sizeof(szFS);
  180.         GLchar*pszVS=szVS;
  181.         GLchar*pszFS=szFS;

  182.         g_uProgram=glCreateProgram();

  183.         VS=glCreateShader(GL_VERTEX_SHADER);
  184.         FS=glCreateShader(GL_FRAGMENT_SHADER);

  185.         glShaderSource(VS,1,&pszVS,&sizeVS);
  186.         glShaderSource(FS,1,&pszFS,&sizeFS);

  187.         glCompileShader(VS);
  188.         glCompileShader(FS);
  189.         
  190.         glAttachShader(g_uProgram,VS);
  191.         glAttachShader(g_uProgram,FS);

  192.         glLinkProgram(g_uProgram);

  193.         ShowShaderOutput(g_uProgram);

  194.         g_uUniform_g_fTime=glGetUniformLocation(g_uProgram,"g_fTime");
  195.     }

  196.     wglMakeCurrent(NULL,NULL);
  197.     return TRUE;
  198. Cleanup:
  199.     DeleteDC(hBufferDC);
  200.     ReleaseDC(NULL,hScreenDC);
  201.     CleanupGL();
  202.     return FALSE;
  203. }

  204. void RenderOnce()
  205. {
  206.     if(!g_hRC)
  207.         return;
  208.     wglMakeCurrent(g_hDC,g_hRC);
  209.     glClear(GL_COLOR_BUFFER_BIT);
  210.    
  211.     glUniform1f(g_uUniform_g_fTime,(GLfloat)GetTickCount()*0.01f);

  212.     //=========================================================================
  213.     //BGR转RGB
  214.     glBindTexture(GL_TEXTURE_2D,g_uTex);
  215.     glUseProgram(g_uProgram);
  216.     //画一个全屏BillBoard,使用着色器程序
  217.     glBegin(GL_TRIANGLE_STRIP);
  218.     glTexCoord2f(0,0);  glVertex2f(-1,-1);
  219.     glTexCoord2f(1,0);  glVertex2f( 1,-1);
  220.     glTexCoord2f(0,1);  glVertex2f(-1, 1);
  221.     glTexCoord2f(1,1);  glVertex2f( 1, 1);
  222.     glEnd();
  223.     glFlush();
  224.     glBindTexture(GL_TEXTURE_2D,0);

  225.     SwapBuffers(g_hDC);
  226.     wglMakeCurrent(NULL,NULL);
  227. }

  228. int main(int argc,char**argv)
  229. {
  230.     MSG msg;

  231.     Sleep(200);

  232.     if(!CreateFullScreenWindow())
  233.     {
  234.         fputs("创建全屏窗口失败。\n",stderr);
  235.         return 1;
  236.     }

  237.     ShowWindow(g_hWnd,SW_SHOW);
  238.     UpdateWindow(g_hWnd);

  239.     for(;;)
  240.     {
  241.         if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
  242.         {
  243.             if(msg.message==WM_QUIT)
  244.                 break;
  245.             TranslateMessage(&msg);
  246.             DispatchMessage(&msg);
  247.         }
  248.         RenderOnce();
  249.     }

  250.     CleanupGL();
  251.     return 0;
  252. }

  253. LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wp,LPARAM lp)
  254. {
  255.     switch(uMsg)
  256.     {
  257.     default:
  258.         return DefWindowProc(hWnd,uMsg,wp,lp);
  259.     case WM_CREATE:
  260.         InitGL(hWnd);
  261.         return 0;
  262.     case WM_DESTROY:
  263.         PostQuitMessage(0);
  264.         return 0;
  265.     }
  266. }
复制代码
BIN:
新版本编译器生成: ScreenWave.exe (191.5 KB, 下载次数: 22)
老版本编译器生成: ScreenWaveVC6.exe (196 KB, 下载次数: 13)
SRC: ScreenWave.zip (115.07 KB, 下载次数: 0, 售价: 5 个宅币)
回复

使用道具 举报

发表于 2014-9-14 20:54:24 | 显示全部楼层
哈哈,不會吧,被我沙發了哈哈...

感謝AA55老大哈哈...
回复 赞! 靠!

使用道具 举报

发表于 2014-9-15 13:46:43 | 显示全部楼层
简直不能更吊!
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-22 01:23 , Processed in 0.037715 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表