Jump to content
  • Advertisement
Sign in to follow this  
PascalGrosset

OpenGL pinpong issues in opengl

This topic is 2555 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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);
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);
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();
}[/quote]

Share this post


Link to post
Share on other sites
Advertisement
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:

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!