int CShaderObject::GenProgram(const char* vertexShader, const char* fragmentShader) { NvGLSLProgram* prog = NvGLSLProgram::createFromStrings(vertexShader, fragmentShader); if (prog) { pid = prog->getProgram(); delete prog; } else pid =-1; return pid; }
unsigned int generate1DConvolutionFP_filter(const char* vs, float *weights, int width, bool vertical, bool tex2D, int img_width, int img_height) { // calculate new set of weights and offsets int nsamples = 2*width+1; int nsamples2 = (int) ceilf(nsamples/2.0f); float *weights2 = new float [nsamples2]; float *offsets = new float [nsamples2]; for(int i=0; i<nsamples2; i++) { float a = weights[i*2]; float b; if (i*2+1 > nsamples-1) b = 0; else b = weights[i*2+1]; weights2[i] = a + b; offsets[i] = b / (a + b); // printf("%d: %f %f\n", i, weights2[i], offsets[i]); } // printf("nsamples = %d\n", nsamples2); char szBuffer[16]; std::ostringstream ost; ost << "precision highp float;\n" "uniform sampler2D TexSampler;\n" "varying vec2 TexCoord0;\n" "void main()\n" "{\n" "vec3 sum = vec3(0.0,0.0,0.0);\n" "vec2 texcoord;\n"; for(int i=0; i<nsamples2; i++) { float x_offset = 0, y_offset = 0; if (vertical) { y_offset = (i*2)-width+offsets[i]; } else { x_offset = (i*2)-width+offsets[i]; } if (tex2D) { x_offset = x_offset / img_width; y_offset = y_offset / img_height; } float weight = weights2[i]; sprintf(szBuffer, "%f", x_offset); ost << "texcoord = TexCoord0 + vec2(" << szBuffer; sprintf(szBuffer, "%f", y_offset); ost << ", " << szBuffer << ");\n"; sprintf(szBuffer, "%f", weight); ost << "sum += texture2D(TexSampler, texcoord).rgb*" << szBuffer << ";\n"; } ost << "gl_FragColor = vec4(sum, 1.0);\n" "}\n"; delete [] weights2; delete [] offsets; NvGLSLProgram* program = NvGLSLProgram::createFromStrings(vs, (char*)ost.str().c_str()); int id = program->getProgram(); return id; }