PDA

View Full Version : lighting and viewports



Adrian Hooper
03-22-2009, 11:42 AM
I'm having a few problems lighting my scene. I've setup my lighting properties and enabled lighting however the appearance of it is strange. It only shows any light when I'm looking in one direction,and when I move the camera it changes.

Second thing, is I want to add a second viewport, but inside my current one? Basically I've rendered a TV, and I want it to display what I am currently looking at. Can this be done?

scratt
03-22-2009, 07:31 PM
From memory the OpenGL light positions in the fixed function Pipeline are affected by Matrix transformations. Try moving the location in your code that you set it's position.

Putting a second viewport inside another viewport is very easy.
From your description it may be as simple as redefining glViewport after you have drawn the tv surround and *not* clearing the screen.

But if you are modelling this in 3D and want freedom of movement for the viewpoint then using an FBO and rendering the tv's image to a texture in that FBO which you can then texture onto the 'screen' of the tv in the main view is the best approach.

http://www.songho.ca/opengl/gl_fbo.html

Adrian Hooper
03-24-2009, 03:10 AM
Hey. I've tried to create a FBO (I'm using JOGL rather than plain openGL) and I'm now getting an invalid memory access error


gl.glGenFramebuffersEXT(1, fbo, 0);
gl.glGenRenderbuffersEXT(1, depthBuffer, 0);

It seems that the error is in these 2 lines as this is all I haven't commented out and I still get the error.


gl.glBindRenderbufferEXT(GL.GL_RENDERBUFFER_EXT, depthBuffer[0]);
gl.glRenderbufferStorageEXT(GL.GL_RENDERBUFFER_EXT , GL.GL_DEPTH_COMPONENT, 14, 14);
gl.glFramebufferRenderbufferEXT(GL.GL_FRAMEBUFFER_ EXT, GL.GL_DEPTH_ATTACHMENT_EXT, GL.GL_RENDERBUFFER_EXT, depthBuffer[0]);
gl.glGenTextures(1, customTex, 0);
gl.glBindTexture(GL.GL_TEXTURE_2D, customTex[0]);
gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA8, 14, 14, 0, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, null);
gl.glFramebufferTexture2DEXT(GL.GL_FRAMEBUFFER_EXT , GL.GL_COLOR_ATTACHMENT0_EXT, GL.GL_TEXTURE_2D, customTex[0], 0);

This is the rest yet it is still failing :(

Adrian Hooper
03-24-2009, 04:09 AM
ok bit further. No more errors however the texture it is rendering is blank. There is none. Simply white. Can you see why?


gl.glBindRenderbufferEXT(GL.GL_RENDERBUFFER_EXT, depthBuffer[0]);
gl.glRenderbufferStorageEXT(GL.GL_RENDERBUFFER_EXT , GL.GL_DEPTH_COMPONENT, 14, 14);
gl.glFramebufferRenderbufferEXT(GL.GL_FRAMEBUFFER_ EXT, GL.GL_DEPTH_ATTACHMENT_EXT, GL.GL_RENDERBUFFER_EXT, depthBuffer[0]);
gl.glGenTextures(1, customTex, 0);
gl.glBindTexture(GL.GL_TEXTURE_2D, customTex[0]);
gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA8, 14, 14, 0, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, null);
gl.glFramebufferTexture2DEXT(GL.GL_FRAMEBUFFER_EXT , GL.GL_COLOR_ATTACHMENT0_EXT, GL.GL_TEXTURE_2D, customTex[0], 0);

gl.glBindFramebufferEXT(GL.GL_FRAMEBUFFER_EXT, fbo[0]);
gl.glPushAttrib(GL.GL_VIEWPORT_BIT);
gl.glViewport(0,0,14, 14);

gl.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
gl.glBegin(GL.GL_LINES);
gl.glVertex3f(0.0f, 0.0f, 0.0f);
gl.glVertex3f(10.0f, 10.0f, 10.0f);
gl.glEnd();

gl.glPopAttrib();
gl.glBindFramebufferEXT(GL.GL_FRAMEBUFFER_EXT, 0);

gl.glBindTexture(GL.GL_TEXTURE_2D, customTex[0]);
gl.glGenTextures(1, customTex, 0);
gl.glBindTexture(GL.GL_TEXTURE_2D, customTex[0]);
gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA8, 14, 14, 0, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, null);
gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_CLAMP_TO_EDGE);
gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_CLAMP_TO_EDGE);
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR_MIPMAP_LINEAR);
gl.glGenerateMipmapEXT(GL.GL_TEXTURE_2D);


gl.glDeleteFramebuffersEXT(1, fbo, 0);
gl.glDeleteRenderbuffersEXT(1, depthBuffer, 0);

ZbuffeR
03-24-2009, 05:50 AM
You may miss mipmaps, try with min filter GL_LINEAR.
Or generate mipmaps with glGenerateMipmapEXT.

EDIT : sorry I did not read the whole source. Try anyway with min filter GL_LINEAR, maybe the mipmaps are not generated correctly.

Adrian Hooper
03-24-2009, 06:01 AM
nope still not working. Changed to Linear and nothing :(