Thanks for conferming this. Yes, the loop is static.
Now, I have the following code:
pRTTtex and pRTTForce are floating point textures.
void UpdateForce() {
TransferToTexture();
RenderForce();
TransferFromTexture();
}
void TransferToTexture() {
pRTTtex->BindBuffer(WGL_FRONT_LEFT_ARB);
glTexSubImage2D(pRTTtex->GetTextureTarget(), 0, 0, 0, nPARTICLES, 1, GL_RGB, GL_FLOAT, &(r[0].x));
}
void TransferFromTexture() {
pRTTForce->BindBuffer(WGL_FRONT_LEFT_ARB);
glGetTexImage(pRTTForce->GetTextureTarget(), 0, GL_RGB, GL_FLOAT, &(force[0].x));
}
void RenderForce() {
int vp[4];
glGetIntegerv(GL_VIEWPORT, vp);
glViewport(0, 0, nPARTICLES, 1);
glDisable(GL_DEPTH_TEST);
glActiveTextureARB(GL_TEXTURE1);
glEnable(pRTTtex->GetTextureTarget());
pRTTtex->BindBuffer(WGL_FRONT_LEFT_ARB);
glActiveTextureARB(GL_TEXTURE0);
glEnable(pRTTtex->GetTextureTarget());
pRTTForce->BindBuffer(WGL_FRONT_LEFT_ARB);
glUseProgramObjectARB(pShader->GetProgram());
pExt->glUniform1iARB(pShader->GetUniLoc(pShader->GetProgram(), "tex"), 1);
pExt->glUniform1iARB(pShader->GetUniLoc(pShader->GetProgram(), "tforce"), 0);
pRTTForce->BeginCapture();
for(int i = 0; i < nPARTICLES; ++i) {
glUniform1fARB(pShader->GetUniLoc(pShader->GetProgram(), "curTC"), ((float)i) / ((float)nPARTICLES-1.));
glBegin(GL_LINES);
glTexCoord2f(0.0, 0.5);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0, 0.5);
glVertex3f(-1, .0, .0f);
glTexCoord2f(pRTTForce->GetMaxS(), 0.5);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, pRTTtex->GetMaxS(), 0.5);
glVertex3f( 1, .0, .0f);
glEnd();
}
pRTTForce->EndCapture();
glUseProgramObjectARB(0);
glViewport(vp[0], vp[1], vp[2], vp[3]);
glActiveTextureARB(GL_TEXTURE1);
glDisable(pRTTtex->GetTextureTarget());
glActiveTextureARB(GL_TEXTURE0);
glDisable(pRTTtex->GetTextureTarget());
glEnable(GL_DEPTH_TEST);
}
// Vertex shader
void main(void) {
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_TexCoord[1] = gl_MultiTexCoord1;
gl_Position = ftransform();
}
// Fragment shader
uniform sampler2DRect tex;
uniform float curTC;
void main(void) {
vec4 source = texture2DRect(tex, gl_TexCoord[1].xy);
vec4 remote = texture2DRect(tex, vec2(curTC, 0.5f));
vec4 d = source - remote;
float dist2 = d.x*d.x + d.y*d.y + d.z*d.z;
float dist = max(dist2, 0.000001f);
gl_FragColor = 83.0f * (0.8f - dist) * (0.8f - dist) * d / dist;
}
But still not the desired output in the force array (all 0.0)! What is going wrong here? How does this kind of algorithm has to be solved?
Thanks
kon