Jump to content

  • Log In with Google      Sign In   
  • Create Account

pinpong issues in opengl


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
1 reply to this topic

#1 zetwalnwar   Members   -  Reputation: 100

Like
0Likes
Like

Posted 18 July 2011 - 10:10 PM

Hello

I'm doing some ping ponging stuff and I am experiencing some weird behaviour with my code. I have 2 shaders which alter the texture and a third one which just displays stuff.

I have a certain number of passes in my program which i can increase and decrease (to make sure that the ping-ponging work). According to my logic, if the number of passes is 0, the color displayed should be black, for 1 pass it should be black, for 2 passes red, for 3 passes yellow, 4 passes orange, ...

However, for 2 passes I'm already getting yellow.

Any help would be very greatly appreciated. Been stuck with that for some time!!!

Thanks

The important part of the code is below:

//some global variables
unsigned char textureArray[4*512*512];

int numberIterations = 0;
GLuint tex_id[2];
GLenum attachmentpoints[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT};
int writeTex = 0;
int readTex = 1;
GLuint frameBuffer;
int textureDim = 512;

string shaderPath = "/Users/pascalgrosset/Utah/Research/myVolRender/pingponging/pingponging/";

bool panSc, zoomSc, rotateSc;
float eye[3], lookat[3];

GLint buf_1, buf_2, buf_Out;

GLhandleARB glsl_program1, vertex_shader_1, fragment_shader_1;
GLhandleARB glsl_program2, vertex_shader_2, fragment_shader_2;
GLhandleARB glsl_programOut, vertex_shader_Out, fragment_shader_Out;


// main
int main(int argc, char* argv[])
{
glutInit(&argc, argv);

if (argc > 1)
numberIterations = atoi(argv[1]);

glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowPosition( 50, 50);
glutInitWindowSize( windowWidth, windowHeight);

//createGlutMenu();
main_window = glutCreateWindow( "Computer Graphics" );
myInitDisplay(windowWidth, windowHeight);

eye[0] = 0.0; eye[1] = 0.0; eye[2] = 2.0;
lookat[0] = 0.0; lookat[1] = 0.0; lookat[2] = 0.0;

panSc = zoomSc = rotateSc = false;


createShaders(glsl_program1, vertex_shader_1, fragment_shader_1, (shaderPath + string("Shaders/shader.vert")).c_str(), (shaderPath + string("Shaders/fragShader1.frag")).c_str());
createShaders(glsl_program2, vertex_shader_2, fragment_shader_2, (shaderPath + string("Shaders/shader.vert")).c_str(), (shaderPath + string("Shaders/fragShader2.frag")).c_str());
createShaders(glsl_programOut, vertex_shader_Out, fragment_shader_Out, (shaderPath + string("Shaders/shader.vert")).c_str(), (shaderPath + string("Shaders/fragShaderOut.frag")).c_str());

initGL();

// Register some callbacks - basically what function is to be associated to what event
glutDisplayFunc( myDisplay );
glutReshapeFunc( myReshape );
glutIdleFunc( myGlutIdle );
glutKeyboardFunc( myKeyboard );
glutMotionFunc( myMotion );
glutMouseFunc( myMouse );

glutMainLoop();

glDeleteFramebuffersEXT(1, &frameBuffer);

return 0;
}


void myInitDisplay( int width, int height )
{
glClearColor( 0.0f, 0.0f, 0.0f, 0.0f); // This Will Clear The Background and set its Color To Black - 4 params coz of RGBA

glDepthFunc( GL_LESS ); // The Type Of Depth Test To Do
glEnable( GL_DEPTH_TEST ); // Enables Depth Testing
glShadeModel( GL_SMOOTH ); // Enables Smooth Color Shading - GL_SMOOTH or GL_FLAT

glutSetMenu( mainMenuId ); // We have a menu
glutAttachMenu( GLUT_RIGHT_BUTTON ); // Attach the menu to the right mouse button

return;
}


void initGL(){
glEnable(GL_TEXTURE_2D);

for (int i=0; i<(textureDim*textureDim); i++)
textureArray[i*4 +0] = textureArray[i*4 +1] = textureArray[i*4 +2] = textureArray[i*4 +3] = 0;

glGenTextures(2, tex_id);
for (int i=0; i<2; i++){
glBindTexture(GL_TEXTURE_2D, tex_id[i]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//NULL means reserve texture memory, but texels are undefined
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, textureDim, textureDim, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureArray);
}


glGenFramebuffersEXT(1, &frameBuffer);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, frameBuffer);

// attach two textures to FBO
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, attachmentpoints[writeTex], GL_TEXTURE_2D, tex_id[writeTex], 0);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, attachmentpoints[readTex], GL_TEXTURE_2D, tex_id[readTex], 0);


GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
if (status == GL_FRAMEBUFFER_COMPLETE_EXT){
// cout << "All Good!!!" << endl;
}
else{
cout << "Error: Binding framebuffer failed" << endl;
exit(0);
}

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);


initUniformVarsShading1();
initUniformVarsShading2();
initUniformVarsShadingOut();
}


void myDisplay( void )
{
for (int i=0; i<(textureDim*textureDim); i++)
textureArray[i*4 +0] = textureArray[i*4 +1] = textureArray[i*4 +2] = textureArray[i*4 +3] = 0;

writeTex = 0; readTex = 1;

glEnable(GL_TEXTURE_2D);
for (int i=0; i<2; i++){
glBindTexture(GL_TEXTURE_2D, tex_id[i]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, textureDim, textureDim, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureArray); //NULL);
}


glEnable( GL_DEPTH_TEST );


if (numberIterations == 0){
///////////////////////////
glViewport (0, 0, (GLsizei) textureDim, (GLsizei) textureDim); // set the size of our viewport (window)

glMatrixMode( GL_PROJECTION ); // load the projection matrix; the subsequent transformations are going to affect it
glLoadIdentity(); // initialise the projection matrix before applying the projection matrix

// Specify that we are going to use a perspective projection - changing our projection matrix - NEW!!!!!
gluPerspective(45.0f, (GLfloat)textureDim/(GLfloat)textureDim, 0.1f, 100.0f); //FOV, aspect ratio, near clipping plane, far clipping plane

glMatrixMode( GL_MODELVIEW ); // load the model view matrix - subsequent matrices are going to affect this one
glLoadIdentity();
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();
gluLookAt(eye[0], eye[1], eye[2], lookat[0], lookat[1], lookat[2], 0, 1, 0);
///////////////////////////


glUseProgramObjectARB(glsl_programOut);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex_id[readTex]);
glUniform1iARB(buf_Out, 0);

glBegin(GL_POLYGON);
glMultiTexCoord2f(GL_TEXTURE0, 0.0, 0.0);
glVertex3f(-0.5, -0.5, -0.5);

glMultiTexCoord2f(GL_TEXTURE0, 1.0, 0.0);
glVertex3f( 0.5, -0.5, -0.5);

glMultiTexCoord2f(GL_TEXTURE0, 1.0, 1.0);
glVertex3f( 0.5, 0.5, -0.5);

glMultiTexCoord2f(GL_TEXTURE0, 0.0, 1.0);
glVertex3f(-0.5, 0.5, -0.5);
glEnd();

glUseProgramObjectARB(0);

}
else{
for (int i=0; i<numberIterations; i++){
//cout << endl << endl << "Pass " << i << " : " << endl;

glPushAttrib(GL_ALL_ATTRIB_BITS);
glPushMatrix();

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, frameBuffer);
glDrawBuffer(attachmentpoints[writeTex]);

/////////////////
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-0.5,0.5,-0.5,0.5,-0.5,0.5);
glMatrixMode(GL_MODELVIEW);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();
glViewport(0, 0, textureDim, textureDim);
/////////////////////

if (writeTex == 0){
glUseProgramObjectARB(glsl_program1);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex_id[readTex]);
glUniform1iARB(buf_1, 0);
}
else{
glUseProgramObjectARB(glsl_program2);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex_id[readTex]);
glUniform1iARB(buf_2, 0);
}

glNormal3f(0.0, 0.0, -1.0);
glBegin(GL_POLYGON);
glMultiTexCoord2f(GL_TEXTURE0, 0.0, 0.0);
glVertex3f(-0.5, -0.5, -0.5);

glMultiTexCoord2f(GL_TEXTURE0, 1.0, 0.0);
glVertex3f( 0.5, -0.5, -0.5);

glMultiTexCoord2f(GL_TEXTURE0, 1.0, 1.0);
glVertex3f( 0.5, 0.5, -0.5);

glMultiTexCoord2f(GL_TEXTURE0, 0.0, 1.0);
glVertex3f(-0.5, 0.5, -0.5);
glEnd();

glUseProgramObjectARB(0);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

glPopMatrix();
glPopAttrib();





///////////////////////////
glViewport (0, 0, (GLsizei) textureDim, (GLsizei) textureDim); // set the size of our viewport (window)

glMatrixMode( GL_PROJECTION ); // load the projection matrix; the subsequent transformations are going to affect it
glLoadIdentity(); // initialise the projection matrix before applying the projection matrix

// Specify that we are going to use a perspective projection - changing our projection matrix - NEW!!!!!
gluPerspective(45.0f, (GLfloat)textureDim/(GLfloat)textureDim, 0.1f, 100.0f); //FOV, aspect ratio, near clipping plane, far clipping plane

glMatrixMode( GL_MODELVIEW ); // load the model view matrix - subsequent matrices are going to affect this one
glLoadIdentity();
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();
gluLookAt(eye[0], eye[1], eye[2], lookat[0], lookat[1], lookat[2], 0, 1, 0);
///////////////////////////


glUseProgramObjectARB(glsl_programOut);

glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, tex_id[readTex]);
glUniform1iARB(buf_Out, 0);

glBegin(GL_POLYGON);
glMultiTexCoord2f(GL_TEXTURE0, 0.0, 0.0);
glVertex3f(-0.5, -0.5, -0.5);

glMultiTexCoord2f(GL_TEXTURE0, 1.0, 0.0);
glVertex3f( 0.5, -0.5, -0.5);

glMultiTexCoord2f(GL_TEXTURE0, 1.0, 1.0);
glVertex3f( 0.5, 0.5, -0.5);

glMultiTexCoord2f(GL_TEXTURE0, 0.0, 1.0);
glVertex3f(-0.5, 0.5, -0.5);
glEnd();

glUseProgramObjectARB(0);

// swap read and write indexes
readTex = 1 - readTex;
writeTex = 1 - writeTex;
}
}

glFlush();
glutSwapBuffers();

return;
}

void initUniformVarsShading1()
{
glUseProgramObjectARB(glsl_program1);

buf_1 = glGetUniformLocationARB(glsl_program1, "tex1");
// glUniform1iARB(buf_1, 0);

glUseProgramObjectARB(0);
}



void initUniformVarsShading2()
{
glUseProgramObjectARB(glsl_program2);

buf_2 = glGetUniformLocationARB(glsl_program2, "tex1");
// glUniform1iARB(buf_2, 0);



glUseProgramObjectARB(0);
}



void initUniformVarsShadingOut()
{
glUseProgramObjectARB(glsl_programOut);

buf_Out = glGetUniformLocationARB(glsl_programOut, "tex1");
// glUniform1iARB(buf_Out, 0);

glUseProgramObjectARB(0);
}


//fragShader1
uniform sampler2D tex1;
varying vec4 vVertex;
void main(){
vec4 colorBuf = texture2D(tex1, gl_TexCoord[0].xy);
gl_FragData[0] = vec4(0.75,0.0,0.0, 0.25) + colorBuf;
}

//fragShader2
uniform sampler2D tex1;
varying vec4 vVertex;
void main(){
vec4 colorBuf = texture2D(tex1, gl_TexCoord[0].xy);
if (colorBuf.a < 0.5)
gl_FragData[0] = vec4(0.0,0.75,0.0, 0.25) + colorBuf;
else
gl_FragData[0] = vec4(0.0,0.0,0.4, 0.25) + colorBuf;
}

//fragShaderOut
uniform sampler2D tex1;
varying vec4 vVertex;
void main(){
vec4 color = texture2D(tex1, gl_TexCoord[0].xy);
gl_FragColor = color;
}

//shader.vert
varying vec4 vVertex;
void main(){
gl_TexCoord[0] = gl_MultiTexCoord0.xyzw;
vVertex = vec4(gl_ModelViewProjectionMatrix * gl_Vertex);
gl_Position = ftransform();
}



Sponsor:

#2 zetwalnwar   Members   -  Reputation: 100

Like
0Likes
Like

Posted 19 July 2011 - 08:10 AM

Got the answer!. There was a typo in my code

glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, tex_id[readTex]); glUniform1iARB(buf_Out, 0);
glActiveTexture(GL_TEXTURE2); should have been glActiveTexture(GL_TEXTURE0); :angry:




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS