Guest User

Untitled

a guest
Jul 12th, 2021
887
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.26 KB | None | 0 0
  1. -----------------------GoldSrc version-----------------------
  2. //=======================================
  3. // CGLSLShader :: CompileShader
  4. // Purpose:
  5. //=======================================
  6. bool CGLSLShader :: CompileShader( int index, glsl_shader_t* pshader, csdshaderdata_t* pshaderdata )
  7. {
  8.     int iStatus;
  9.     const GLchar *vp = (GLchar*)((byte*)m_pCSDHeader + pshaderdata->vertexdataoffs);
  10.     pshader->vertex_id = gImports.glCreateShader(GL_VERTEX_SHADER);
  11.     gImports.glShaderSource(pshader->vertex_id, 1, &vp, &pshaderdata->vertexdatasize);
  12.     gImports.glCompileShader(pshader->vertex_id);
  13.  
  14.     char szBasename[64];
  15.     Sh_FilenameFromPath(m_szShaderFile, szBasename);
  16.  
  17.     static char szvsout[MAX_PATH];
  18.     sprintf(szvsout, "logs/%s_%d_vs", szBasename, index);
  19.  
  20.     gImports.glGetShaderiv(pshader->vertex_id, GL_COMPILE_STATUS, &iStatus);
  21.     if(iStatus != TRUE)
  22.     {
  23.         Shader_PrintLog(pshader->vertex_id, (char*)vp, pshaderdata->vertexdatasize, szvsout);
  24.         sprintf(m_szErrorString, "Vertex shader %s failed to compile.\nLog file was written.\n", m_szShaderFile);
  25.         return false;
  26.     }
  27.  
  28.     const GLchar *fp = (GLchar*)((byte*)m_pCSDHeader + pshaderdata->fragmentdataoffs);
  29.     pshader->fragment_id = gImports.glCreateShader(GL_FRAGMENT_SHADER);
  30.     gImports.glShaderSource(pshader->fragment_id, 1, &fp, &pshaderdata->fragmentdatasize);
  31.     gImports.glCompileShader(pshader->fragment_id);
  32.        
  33.     static char szfsout[MAX_PATH];
  34.     sprintf(szfsout, "logs/%s_%d_fs", szBasename, index);
  35.  
  36.     gImports.glGetShaderiv(pshader->fragment_id, GL_COMPILE_STATUS, &iStatus);
  37.     if(iStatus != TRUE)
  38.     {
  39.         Shader_PrintLog(pshader->fragment_id, (char*)fp, pshaderdata->fragmentdatasize, szfsout);
  40.         sprintf(m_szErrorString, "Fragment shader %s failed to compile.\nLog file was written.\n", m_szShaderFile);
  41.         return false;
  42.     }
  43.  
  44.     pshader->program_id = gImports.glCreateProgram();
  45.     gImports.glAttachShader(pshader->program_id, pshader->vertex_id);
  46.     gImports.glAttachShader(pshader->program_id, pshader->fragment_id);
  47.     gImports.glLinkProgram(pshader->program_id);
  48.  
  49.     static char szprogout[MAX_PATH];
  50.     sprintf(szprogout, "logs/%s_%d_prog", szBasename, index);
  51.        
  52.     gImports.glGetProgramiv(pshader->program_id, GL_LINK_STATUS, &iStatus);
  53.     if(iStatus != TRUE)
  54.     {
  55.         Shader_PrintLog(pshader->vertex_id, (char*)vp, pshaderdata->vertexdatasize, szvsout);
  56.         Shader_PrintLog(pshader->fragment_id, (char*)fp, pshaderdata->fragmentdatasize, szfsout);
  57.         Program_PrintLog(pshader->program_id, szprogout);
  58.  
  59.         sprintf(m_szErrorString, "Program %s failed to compile.\nLog file was written.\n", m_szShaderFile);
  60.         return false;
  61.     }
  62.  
  63.     // Flag it as compiled
  64.     pshader->compiled = true;
  65.  
  66.     return true;
  67. }
  68.  
  69.  
  70. -----------------------Custom engine version-----------------------
  71. //=============================================
  72. // @brief Compiles a single unique shader
  73. //
  74. // @param index Index of the shader to compile
  75. // @param pshader Shader information object
  76. // @param pshaderdata Pointer to compiled shader data
  77. // @return TRUE if the compile was successful, FALSE otherwise
  78. //=============================================
  79. bool CGLSLShader::CompileShader( Uint32 index, glsl_shader_t* pshader, csdshaderdata_t* pshaderdata )
  80. {
  81.     // Try to compile the vertex shader
  82.     const Char *vp = (Char*)((byte*)m_pCSDHeader + pshaderdata->vertexdataoffs);
  83.     pshader->vertex_id = m_glExtF.glCreateShader(GL_VERTEX_SHADER);
  84.     m_glExtF.glShaderSource(pshader->vertex_id, 1, &vp, &pshaderdata->vertexdatasize);
  85.     m_glExtF.glCompileShader(pshader->vertex_id);
  86.  
  87.     CString basename;
  88.     COM_Basename(m_shaderFile.c_str(), basename);
  89.  
  90.     CString vsOut;
  91.     vsOut << "logs/" << basename << "_" << (Int32)index << "_vs";
  92.  
  93.     Int32 iStatus = FALSE;
  94.     m_glExtF.glGetShaderiv(pshader->vertex_id, GL_COMPILE_STATUS, &iStatus);
  95.     if(iStatus != TRUE)
  96.     {
  97.         Shader_PrintLog(pshader->vertex_id, (Char*)vp, vsOut.c_str());
  98.         m_errorString = "Vertex shader " + m_shaderFile + " failed to compile. Log file was written.";
  99.         return false;
  100.     }
  101.  
  102.     // Compile the fragment shader now
  103.     const Char *fp = (Char*)((byte*)m_pCSDHeader + pshaderdata->fragmentdataoffs);
  104.     pshader->fragment_id = m_glExtF.glCreateShader(GL_FRAGMENT_SHADER);
  105.     m_glExtF.glShaderSource(pshader->fragment_id, 1, &fp, &pshaderdata->fragmentdatasize);
  106.     m_glExtF.glCompileShader(pshader->fragment_id);
  107.        
  108.     CString fsOut;
  109.     fsOut << "logs/" << basename << "_" << (Int32)index << "_fs";
  110.  
  111.     m_glExtF.glGetShaderiv(pshader->fragment_id, GL_COMPILE_STATUS, &iStatus);
  112.     if(iStatus != TRUE)
  113.     {
  114.         Shader_PrintLog(pshader->fragment_id, (Char*)fp, fsOut.c_str());
  115.         m_errorString = "Fragment shader " + m_shaderFile + " failed to compile. Log file was written.";
  116.         return false;
  117.     }
  118.  
  119.     // Link the two into one program
  120.     pshader->program_id = m_glExtF.glCreateProgram();
  121.     m_glExtF.glAttachShader(pshader->program_id, pshader->vertex_id);
  122.     m_glExtF.glAttachShader(pshader->program_id, pshader->fragment_id);
  123.     m_glExtF.glLinkProgram(pshader->program_id);
  124.  
  125.     CString progOut;
  126.     progOut << "logs/" << basename << "_" << (Int32)index << "_prog";
  127.  
  128.     m_glExtF.glGetProgramiv(pshader->program_id, GL_LINK_STATUS, &iStatus);
  129.     if(iStatus != TRUE)
  130.     {
  131.         Shader_PrintLog(pshader->vertex_id, (Char*)vp, vsOut.c_str());
  132.         Shader_PrintLog(pshader->fragment_id, (Char*)fp, fsOut.c_str());
  133.         Program_PrintLog(pshader->program_id, progOut.c_str());
  134.  
  135.         m_errorString = "Program " + m_shaderFile + " failed to compile. Log file was written.";
  136.         return false;
  137.     }
  138.  
  139.     // Flag it as compiled
  140.     pshader->compiled = true;
  141.  
  142.     return true;
  143. }
  144.  
  145.  
  146. -----------------------Vertex shader-----------------------
  147. #version 140
  148.  
  149. uniform mat4 projection;
  150. uniform mat4 modelview;
  151.  
  152. in vec4 in_position;
  153. in vec2 in_texcoord;
  154.  
  155. out vec2 ps_texcoord;
  156.  
  157. void main()
  158. {
  159.     ps_texcoord = in_texcoord;
  160.     vec4 position = in_position*modelview;;
  161.     gl_Position = position*projection;
  162. }
  163.  
  164.  
  165. -----------------------Fragment shader-----------------------
  166. #version 140
  167.  
  168. uniform sampler2DRect texture0;
  169. uniform vec4 color;
  170. uniform float screenwidth;
  171. uniform float screenheight;
  172.  
  173. in vec2 ps_texcoord;
  174. out vec4 oColor;
  175.  
  176. uniform float timer;
  177.  
  178. const float permTexUnit = 1.0/256.0;        // Perm texture texel-size
  179. const float permTexUnitHalf = 0.5/256.0;    // Half perm texture texel-size
  180.  
  181. const float grainamount = 0.05; //grain amount
  182. float grainsize = 1.6; //grain particle size (1.5 - 2.5)
  183. float lumamount = 1.0; //
  184. float coloramount = 0.6;
  185.  
  186. //a random texture generator, but you can also use a pre-computed perturbation texture
  187. vec4 rnm(in vec2 tc)
  188. {
  189.     float noise =  sin(dot(tc + vec2(timer,timer),vec2(12.9898,78.233))) * 43758.5453;
  190.  
  191.     float noiseR =  fract(noise)*2.0-1.0;
  192.     float noiseG =  fract(noise*1.2154)*2.0-1.0;
  193.     float noiseB =  fract(noise*1.3453)*2.0-1.0;
  194.     float noiseA =  fract(noise*1.3647)*2.0-1.0;
  195.    
  196.     return vec4(noiseR,noiseG,noiseB,noiseA);
  197. }
  198.  
  199. float fade(in float t) {
  200.     return t*t*t*(t*(t*6.0-15.0)+10.0);
  201. }
  202.  
  203. float pnoise3D(in vec3 p)
  204. {
  205.     vec3 pi = permTexUnit*floor(p)+permTexUnitHalf; // Integer part, scaled so +1 moves permTexUnit texel
  206.     // and offset 1/2 texel to sample texel centers
  207.     vec3 pf = fract(p);     // Fractional part for interpolation
  208.  
  209.     // Noise contributions from (x=0, y=0), z=0 and z=1
  210.     float perm00 = rnm(pi.xy).a ;
  211.     vec3  grad000 = rnm(vec2(perm00, pi.z)).rgb * 4.0 - 1.0;
  212.     float n000 = dot(grad000, pf);
  213.     vec3  grad001 = rnm(vec2(perm00, pi.z + permTexUnit)).rgb * 4.0 - 1.0;
  214.     float n001 = dot(grad001, pf - vec3(0.0, 0.0, 1.0));
  215.  
  216.     // Noise contributions from (x=0, y=1), z=0 and z=1
  217.     float perm01 = rnm(pi.xy + vec2(0.0, permTexUnit)).a ;
  218.     vec3  grad010 = rnm(vec2(perm01, pi.z)).rgb * 4.0 - 1.0;
  219.     float n010 = dot(grad010, pf - vec3(0.0, 1.0, 0.0));
  220.     vec3  grad011 = rnm(vec2(perm01, pi.z + permTexUnit)).rgb * 4.0 - 1.0;
  221.     float n011 = dot(grad011, pf - vec3(0.0, 1.0, 1.0));
  222.  
  223.     // Noise contributions from (x=1, y=0), z=0 and z=1
  224.     float perm10 = rnm(pi.xy + vec2(permTexUnit, 0.0)).a ;
  225.     vec3  grad100 = rnm(vec2(perm10, pi.z)).rgb * 4.0 - 1.0;
  226.     float n100 = dot(grad100, pf - vec3(1.0, 0.0, 0.0));
  227.     vec3  grad101 = rnm(vec2(perm10, pi.z + permTexUnit)).rgb * 4.0 - 1.0;
  228.     float n101 = dot(grad101, pf - vec3(1.0, 0.0, 1.0));
  229.  
  230.     // Noise contributions from (x=1, y=1), z=0 and z=1
  231.     float perm11 = rnm(pi.xy + vec2(permTexUnit, permTexUnit)).a ;
  232.     vec3  grad110 = rnm(vec2(perm11, pi.z)).rgb * 4.0 - 1.0;
  233.     float n110 = dot(grad110, pf - vec3(1.0, 1.0, 0.0));
  234.     vec3  grad111 = rnm(vec2(perm11, pi.z + permTexUnit)).rgb * 4.0 - 1.0;
  235.     float n111 = dot(grad111, pf - vec3(1.0, 1.0, 1.0));
  236.  
  237.     // Blend contributions along x
  238.     vec4 n_x = mix(vec4(n000, n001, n010, n011), vec4(n100, n101, n110, n111), fade(pf.x));
  239.  
  240.     // Blend contributions along y
  241.     vec2 n_xy = mix(n_x.xy, n_x.zw, fade(pf.y));
  242.  
  243.     // Blend contributions along z
  244.     float n_xyz = mix(n_xy.x, n_xy.y, fade(pf.z));
  245.  
  246.     // We're done, return the final noise value.
  247.     return n_xyz;
  248. }
  249.  
  250. //2d coordinate orientation thing
  251. vec2 coordRot(in vec2 tc, in float angle)
  252. {
  253.     float aspect = screenwidth/screenheight;
  254.     float rotX = ((tc.x*2.0-1.0)*aspect*cos(angle)) - ((tc.y*2.0-1.0)*sin(angle));
  255.     float rotY = ((tc.y*2.0-1.0)*cos(angle)) + ((tc.x*2.0-1.0)*aspect*sin(angle));
  256.     rotX = ((rotX/aspect)*0.5+0.5);
  257.     rotY = rotY*0.5+0.5;
  258.     return vec2(rotX,rotY);
  259. }
  260.  
  261. void main()
  262. {
  263.     vec2 norm_texcoords = vec2(ps_texcoord.x/screenwidth, ps_texcoord.y/screenheight);
  264.  
  265.     vec3 rotOffset = vec3(1.425,3.892,5.835); //rotation offset values 
  266.     vec2 rotCoordsR = coordRot(norm_texcoords, timer*0.25 + rotOffset.x);
  267.     vec2 rotCoordsG = coordRot(norm_texcoords, timer*0.25 + rotOffset.y);
  268.     vec2 rotCoordsB = coordRot(norm_texcoords, timer*0.25 + rotOffset.z);
  269.    
  270.     vec3 noise;
  271.     noise.r = vec3(pnoise3D(vec3(rotCoordsR*vec2(screenwidth/grainsize,screenheight/grainsize),0.0))).r;
  272.     noise.g = mix(noise.r,pnoise3D(vec3(rotCoordsG*vec2(screenwidth/grainsize,screenheight/grainsize),1.0)), coloramount);
  273.     noise.b = mix(noise.r,pnoise3D(vec3(rotCoordsB*vec2(screenwidth/grainsize,screenheight/grainsize),2.0)), coloramount);
  274.    
  275.     vec3 col = texture(texture0, ps_texcoord).rgb;
  276.  
  277.     //noisiness response curve based on scene luminance
  278.     vec3 lumcoeff = vec3(0.299,0.587,0.114);
  279.     float luminance = mix(0.0,dot(col, lumcoeff),lumamount);
  280.     luminance = clamp(luminance, 0.25, 0.75);
  281.     float lum = smoothstep(0.2,0.0,luminance);
  282.     lum += luminance;
  283.  
  284.     noise = mix(noise,vec3(0.0),pow(lum,4.0));
  285.     col = col+noise*grainamount;
  286.    
  287.     oColor =  vec4(col,1.0);   
  288. }
Advertisement
Add Comment
Please, Sign In to add comment