void init() { if (!initialized) { GLuint vertexShaderId = glCreateShader(GL_VERTEX_SHADER); GLuint fragmentShaderId = glCreateShader(GL_FRAGMENT_SHADER); // vertex shader glShaderSource(vertexShaderId, 1, &vertexShader, NULL); glCompileShader(vertexShaderId); checkShaderError(vertexShaderId, "Vertex shader compilation failed."); // fragment shader glShaderSource(fragmentShaderId, 1, &fragmentShader, NULL); glCompileShader(fragmentShaderId); checkShaderError(fragmentShaderId, "Fragment shader compilation failed."); // linking program programId = glCreateProgram(); glAttachShader(programId, vertexShaderId); glAttachShader(programId, fragmentShaderId); glLinkProgram(programId); checkProgramError(programId, "Shader program link failed."); // once linked into a program, we no longer need the shaders. glDeleteShader(vertexShaderId); glDeleteShader(fragmentShaderId); projectionUniformId = glGetUniformLocation(programId, "projection"); modelViewUniformId = glGetUniformLocation(programId, "modelView"); initialized = true; } }
bool CgUtil::MakeHaloShader(int pow) { char fp[10096]; sprintf(fp,"\ !!ARBfp1.0\n\ \n\ ATTRIB data = fragment.texcoord; \n\ \n\ TEMP tmp,tmp2,tmp3, t,t0,t1,t2,nor,n,nabs,nsign,disp,res,depth,pos,\n\ lighting; \n\ \n\ MOV nor, data; \n\ MUL tmp, data, data; \n\ ADD tmp2.x, tmp.x, tmp.y;\n\ ADD tmp2.z, -tmp2.x, 1;\n\ KIL tmp2.z;\n\ \n\ MAD tmp2.x, -data.z, tmp2.x, data.z;\n\ \n\ #TEST!\n\ #ADD tmp2.x, tmp2.x, %10.8f;\n\ #CMP result.color, tmp2.x, {1,0,0,1}, {0,0,1,1};\n\ \n\ MUL tmp, fragment.position, {%14.12f, %14.12f, 0, 0};\n\ #MAD tmp, fragment.position, {0.5, 0.5, 0, 0}, {0.5, 0.5, 0, 0};\n\ TEX tmp.z, tmp, texture[1], 2D; # tmp.z = old depth \n\ ADD tmp.z, tmp.z, -fragment.position.z; \n\ MUL_SAT tmp.z, tmp.z, program.env[0].x; \n\ MUL tmp.z, tmp.z, tmp2.x; \n\ MUL tmp.z, tmp.z, tmp2.x; # again for smoother edges\n\ ", +P_halo_str-1, 1.0f/(1<<pow), 1.0f/(1<<pow) ); if (P_halo_str<1.0) { sprintf(fp,"%sMUL tmp.z , tmp.z, %10.8f;\n",fp, P_halo_str ); } if (!doingAlphaSnapshot) sprintf(fp,"%sMAD result.color, {0,0,0,1}, tmp.z, {%5.4f,%5.4f,%5.4f,0.0} ;\n",fp,P_halo_col,P_halo_col,P_halo_col); else { if (P_halo_col==1.0) // white halo sprintf(fp,"%sMOV result.color, tmp.z;\n",fp); else sprintf(fp,"%sMUL result.color, {0,0,0,1}, tmp.z;\n",fp); } sprintf(fp,"%sEND\n",fp); glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(fp), fp); // printf("\n-------<fp HALO>--------\n%s",fp); if(!checkProgramError(fp)) return false; return true; }