Not getting 0.0f

So I somewhat ported Dominik’s c++ code over for use with java using jogl. The thing is I’m not getting the results of 0.0. The code is very easy to follow, I know it seems like alot, however I’m hoping that others may use or build upon what I was able to do. If you look at the textureParameters variable, I have it set to the twod_arb_rgba_32 object. The shader program for it is quite simple. It is listed in its source. Thanks for anyone who can help!

Sincerely ~Bolt

PS: Some functions were omitted for some resemblance of brevity

this is just the class that is call when display is called, basically just follow the flow in the renderMain function


public class CompleteTestRenderer implements GLEventListener
{
		
	private GLU glu = new GLU();
	private GL gl;
	// mode: 0=test (POT), 1=bench (set from command line)
	int mode = 1;

	// problem size, texture size, number of iterations (set from command line)
	int N;
	int texSize;
	int numIterations;

	// flags to fine-tune application and to ease debugging
	boolean mode_showResults = true;
	boolean mode_compareResults = true;

	// texture identifiers
	IntBuffer yTexID;
	IntBuffer xTexID;
	int aTexID; 

	// ping pong management vars
	int writeTex = 0;
	int readTex = 1;
	int attachmentpoints[] = { GL.GL_COLOR_ATTACHMENT0_EXT, GL.GL_COLOR_ATTACHMENT1_EXT };

	// GLSL vars
	int glslProgram;
	int fragmentShader;
	int yParam, xParam, alphaParam;

	// FBO identifier
	int[] fb = new int[1];

	// timing vars 
	double start, end;

	// handle to offscreen "window", only used to properly shut down the app
	int glutWindowHandle;

	// struct for variable parts of GL calls (texture format, float format etc)
	textParam rect_arb_rgba_32 = new textParam();
	textParam textureParameters = new textParam();
	
	// actual data
	FloatBuffer dataX;
	FloatBuffer dataY;
	FloatBuffer dataY2;
	float alpha;
	
	/**
	 * renderMain, just calls things in the appropriate order
	 */
	public void renderMain(){
		 
		// create variables for GL
		N = 16;
		dataX = FloatBuffer.allocate(255);
		dataY = FloatBuffer.allocate(255);
		dataY2 = FloatBuffer.allocate(255);
	    createAllTextureParameters();
	    textureParameters = twod_arb_rgba_32;
	    
	    // calc texture dimensions
	    if (textureParameters.texFormat == GL.GL_RGBA) texSize = (int)Math.sqrt(N/4.0);
	    else texSize = (int)Math.sqrt((double)N);
	    
	    // fill with some arbitrary values
	    for (int i=0; i<N; i++) {
	    	dataX.put(i, 1.0f);
	    	dataY.put(i, i+1.0f);
	    	dataY2.put(i, 0.0f);
	    }
	    
	    alpha = 1.0f;
	    xTexID = IntBuffer.allocate(1);
	    yTexID = IntBuffer.allocate(2);
	    
	    // init offscreen framebuffer
	    initFBO();
	    // create textures for vectors
	    createTextures();
	    // init shader runtime
	    initGLSL();
	    // and start computation
	    performComputation();
	    // compare results
	    compareResults();
	    // exit
	    return;
	}
	
	/**
	 * Performs and times saxpy on the CPU, compares results
	 */
	public void compareResults(){
		
		// get GPU results
	    FloatBuffer data = null;
	    data = FloatBuffer.allocate(N);
	    transferFromTexture (data);
	    if (mode_compareResults)  {
		// calc on CPU
		start = System.nanoTime();
		for (int n=0; n<numIterations; n++) 
		    for (int i=0; i<N; i++) 
			dataY.put(i, (dataY.get(i) + alpha*dataX.get(i)));
		end = System.nanoTime();
		double total = (end-start)/1000;
		double mflops = (2.0*N*numIterations) / (total * 1000000.0);
		System.out.println("CPU TIME:"+mflops);
		// and compare results
		double maxError = -1000.0;
		double avgError = 0.0;
		for (int i=0; i<N; i++) {
		    double diff = Math.abs((data.get(i)-dataY.get(i)));
		    if (diff > maxError)
			maxError = diff;
		    avgError += diff;
		}
		avgError /= (double)N;
		System.out.println("Max Error: "+maxError);
		System.out.println("Avg Error: "+avgError);
		if (mode_showResults) {
			System.out.println("CPU RESULTS:\n");
		    printVector(dataY,N);
		}
	    }
	    if (mode_showResults) {
		// print out results
	    	System.out.println("GPU RESULTS:\n");
	    	printVector (data,N);
	    }
	}
	
	/**
	 * creates textures, sets proper viewport etc.
	 */
	public void createTextures(){
		// create textures 
	    // y gets two textures, alternatingly read-only and write-only, 
	    // x is just read-only
	    gl.glGenTextures (2, yTexID);
	    gl.glGenTextures (1, xTexID);
	    // set up textures
	    setupTexture (yTexID.get(readTex), dataY);
	    transferToTexture(dataY,yTexID.get(readTex));
	    setupTexture (yTexID.get(writeTex), dataY2);
	    transferToTexture(dataY2,yTexID.get(writeTex));
	    setupTexture (xTexID.get(0), dataX);
	    transferToTexture(dataX,xTexID.get(0));
	    // set texenv mode from modulate (the default) to replace
	    gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE);
	    // check if something went completely wrong
	    checkGLErrors ("createFBOandTextures()");
	}
	
	

Part II of code listing …


/**
	 * Sets up the various structs used to handle texture targets, texture formats etc.
	 */
	public void createAllTextureParameters(){
		
	    twod_arb_rgba_32.name				= "tex2D - float_ARB - RGBA - 32";
	    twod_arb_rgba_32.texTarget			= GL.GL_TEXTURE_2D;
	    twod_arb_rgba_32.texInternalFormat	= GL.GL_RGBA32F_ARB;
	    twod_arb_rgba_32.texFormat			= GL.GL_RGBA;
	    twod_arb_rgba_32.shader_source[0]	= 	"uniform sampler2D textureY;" +
												"uniform sampler2D textureX;" +
												"uniform float alpha;" +
												"void main(void) { " +
												"  vec4 y = texture2D(textureY, gl_TexCoord[0].st);" +
												"  vec4 x = texture2D(textureX, gl_TexCoord[0].st);" +
												"  gl_FragColor = vec4(0.0,0.0,0.0,0.0);" + 
												"}";
	    
	}
	
	/**
	 * Sets up the GLSL runtime and creates shader.
	 */
	public void initGLSL(){
		// create program object
	    glslProgram = gl.glCreateProgram();
	    // create shader object (fragment shader)
	    fragmentShader = gl.glCreateShader(GL.GL_FRAGMENT_SHADER_ARB);
	    // set source for shader
	    String[] source = textureParameters.shader_source;
	    gl.glShaderSource(fragmentShader, 1, source, null);
	    // compile shader
	    gl.glCompileShader(fragmentShader);
	    // check for errors
	    printShaderInfoLog(fragmentShader);
	    // attach shader to program
	    gl.glAttachShader (glslProgram, fragmentShader);
	    // link into full program, use fixed function vertex pipeline
	    gl.glLinkProgram(glslProgram);
	    // check for errors
	    printProgramInfoLog(glslProgram);
	    checkGLErrors("render(2)");
	    // Get location of the texture samplers for future use
	    yParam = gl.glGetUniformLocation(glslProgram, "textureY");
	    xParam = gl.glGetUniformLocation(glslProgram, "textureX");
	    alphaParam = gl.glGetUniformLocation(glslProgram, "alpha");
	}

	/**
	 * Creates framebuffer object, binds it to reroute rendering operations 
	 * from the traditional framebuffer to the offscreen buffer
	 */
	public void initFBO(){
		// create FBO (off-screen framebuffer)
	    gl.glGenFramebuffersEXT(1, fb, 0); 
	    // bind offscreen framebuffer (that is, skip the window-specific render target)
	    gl.glBindFramebufferEXT(GL.GL_FRAMEBUFFER_EXT, fb[0]);
	    // viewport for 1:1 pixel=texture mapping
	    gl.glMatrixMode(GL.GL_PROJECTION);
	    gl.glLoadIdentity();
	    glu.gluOrtho2D(0.0, texSize, 0.0, texSize);
	    gl.glMatrixMode(GL.GL_MODELVIEW);
	    gl.glLoadIdentity();
	    gl.glViewport(0, 0, texSize, texSize);
	}
	
	/**
	 * Performs the actual calculation.
	 */
	public void performComputation(){
		// attach two textures to FBO
	    gl.glFramebufferTexture2DEXT(GL.GL_FRAMEBUFFER_EXT, attachmentpoints[writeTex], textureParameters.texTarget, yTexID.get(writeTex), 0);
	    gl.glFramebufferTexture2DEXT(GL.GL_FRAMEBUFFER_EXT, attachmentpoints[readTex], textureParameters.texTarget, yTexID.get(readTex), 0);
	    // check if that worked
	    if (!checkFramebufferStatus()) {
	    	System.out.println("glFramebufferTexture2DEXT():\t [FAIL]\n");
	    	return;
	    } 
	    else if (mode == 0) {
	    	System.out.println("glFramebufferTexture2DEXT():\t [PASS]\n");
	    }
	    // enable GLSL program
	    gl.glUseProgram(glslProgram);
	    // enable texture x (read-only, not changed in the computation loop)
	    gl.glActiveTexture(GL.GL_TEXTURE1);	
	    gl.glBindTexture(textureParameters.texTarget,xTexID.get(0));
	    gl.glUniform1i(xParam, 1); // texunit 1
	    // enable scalar alpha (same)
	    gl.glUniform1f(alphaParam,alpha);
	    // Calling glFinish() is only neccessary to get accurate timings,
	    // and we need a high number of iterations to avoid timing noise.
	    gl.glFinish();

	    start = System.nanoTime();
	    for (int i=0; i<numIterations; i++) {
		// set render destination
		gl.glDrawBuffer (attachmentpoints[writeTex]);
		// enable texture y_old (read-only)
		gl.glActiveTexture(GL.GL_TEXTURE0);
		gl.glBindTexture(textureParameters.texTarget,yTexID.get(readTex));
		gl.glUniform1i(yParam,0); // texunit 0
		// and render multitextured viewport-sized quad
		// depending on the texture target, switch between 
		// normalised ([0,1]^2) and unnormalised ([0,w]x[0,h])
		// texture coordinates
		
		// make quad filled to hit every pixel/texel 
		// (should be default but we never know)
		gl.glPolygonMode(GL.GL_FRONT,GL.GL_FILL);

		// and render the quad
		if (textureParameters.texTarget == GL.GL_TEXTURE_2D) {
		    // render with normalized texcoords
			gl.glBegin(GL.GL_QUADS);
			gl.glTexCoord2f(0.0f, 0.0f); 
			gl.glVertex2f(0.0f, 0.0f);
			gl.glTexCoord2f(1.0f, 0.0f); 
			gl.glVertex2f(texSize, 0.0f);
			gl.glTexCoord2f(1.0f, 1.0f); 
			gl.glVertex2f(texSize, texSize);
			gl.glTexCoord2f(0.0f, 1.0f); 
			gl.glVertex2f(0.0f, texSize);
			gl.glEnd();
		} else {
		    // render with unnormalized texcoords
			gl.glBegin(GL.GL_QUADS);
			gl.glTexCoord2f(0.0f, 0.0f); 
			gl.glVertex2f(0.0f, 0.0f);
			gl.glTexCoord2f(texSize, 0.0f); 
			gl.glVertex2f(texSize, 0.0f);
			gl.glTexCoord2f(texSize, texSize); 
			gl.glVertex2f(texSize, texSize);
			gl.glTexCoord2f(0.0f, texSize); 
			gl.glVertex2f(0.0f, texSize);
			gl.glEnd();
		}
		// swap role of the two textures (read-only source becomes 
		// write-only target and the other way round):
		swap();
	    }
	    // done, stop timer, calc MFLOP/s if neccessary
	    if (mode == 1) {
	    	gl.glFinish();
			end = System.nanoTime();
			double total = (end-start)/1000;
			// calc mflops 
			double mflops = (2.0*N*numIterations) / (total * 1000000.0);
			System.out.println("GPU Time :" + mflops);
	    }
	    // done, just do some checks if everything went smoothly.
	    checkFramebufferStatus();
	    checkGLErrors("render()");
	}
	
	/**
	 * Sets up a floating point texture with NEAREST filtering.
	 * (mipmaps etc. are unsupported for floating point textures)
	 */
	public void setupTexture(int texID, FloatBuffer _data){
		// make active and bind
	    gl.glBindTexture(textureParameters.texTarget,texID);
	    // turn off filtering and wrap modes
	    gl.glTexParameteri(textureParameters.texTarget, GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST);
	    gl.glTexParameteri(textureParameters.texTarget, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST);
	    gl.glTexParameteri(textureParameters.texTarget, GL.GL_TEXTURE_WRAP_S, GL.GL_CLAMP);
	    gl.glTexParameteri(textureParameters.texTarget, GL.GL_TEXTURE_WRAP_T, GL.GL_CLAMP);
	    // define texture with floating point format
	    gl.glTexImage2D(textureParameters.texTarget,0,textureParameters.texInternalFormat,texSize,texSize,0,textureParameters.texFormat,GL.GL_FLOAT,_data);
	    // check if that worked
	    int tempError = -1;
	    if ((tempError = gl.glGetError()) != GL.GL_NO_ERROR) {
			System.out.println("glTexImage2D():\t\t\t [FAIL]\n [line 706]" + tempError);
			return;
	    } else if (mode == 0) {
	    	System.out.println("glTexImage2D():\t\t\t [PASS]\n");
	    }
	}
	
	/**
	 * Transfers data from currently texture, and stores it in given array.
	 */
	public void transferFromTexture(FloatBuffer data){
		// version (a): texture is attached
	    // recommended on both NVIDIA and ATI
	    gl.glReadBuffer(attachmentpoints[readTex]);
	    gl.glReadPixels(0, 0, texSize, texSize,textureParameters.texFormat,GL.GL_FLOAT,data);
	    // version b: texture is not neccessarily attached
//		glBindTexture(textureParameters.texTarget,yTexID[readTex]);
//		glGetTexImage(textureParameters.texTarget,0,textureParameters.texFormat,GL_FLOAT,data);
	}
	
	/**
	 * Transfers data to texture. 
	 * Check web page for detailed explanation on the difference between ATI and NVIDIA.
	 */
	public void transferToTexture(FloatBuffer data, int texID){
		// version (a): HW-accelerated on NVIDIA 
	    gl.glBindTexture(textureParameters.texTarget, texID);
	    gl.glTexSubImage2D(textureParameters.texTarget,0,0,0,texSize,texSize,textureParameters.texFormat,GL.GL_FLOAT,data);
	}
	

}
/code]

In almost all your posts, you’ve been pasting massive blocks of code. It’s not exactly inviting to read through, let alone analyse, debug and suggest a fix.

If you really want to include large code-blocks, use the attachments, but don’t expect many to look at it.

Actually this is the second post I did that to, my third post was to help other people, sorry that I came to the wrong forum to ask for help, my bad.

What exactly was the problem again? Something about 0.0f?

After spending much time looking at this, I rewrote a smaller code portion and got it to work. I’ll try and make this larger portion to work, thanks anyways…

~Bolt

Try not to take anything personally, it can be a pain trying to read through and understand someone’s code better than the person who wrote it to try and help them. In the quantity that you posted, the results were expected, especially since most often, the only thing to do is debug line by line and print out some statements, which is what the author should do.