예제 #1
0
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;
}