• Advertisement
  • Popular Tags

  • Popular Now

  • Advertisement
  • Similar Content

    • By lxjk
      Hi guys,
      There are many ways to do light culling in tile-based shading. I've been playing with this idea for a while, and just want to throw it out there.
      Because tile frustums are general small compared to light radius, I tried using cone test to reduce false positives introduced by commonly used sphere-frustum test.
      On top of that, I use distance to camera rather than depth for near/far test (aka. sliced by spheres).
      This method can be naturally extended to clustered light culling as well.
      The following image shows the general ideas

       
      Performance-wise I get around 15% improvement over sphere-frustum test. You can also see how a single light performs as the following: from left to right (1) standard rendering of a point light; then tiles passed the test of (2) sphere-frustum test; (3) cone test; (4) spherical-sliced cone test
       

       
      I put the details in my blog post (https://lxjk.github.io/2018/03/25/Improve-Tile-based-Light-Culling-with-Spherical-sliced-Cone.html), GLSL source code included!
       
      Eric
    • By Fadey Duh
      Good evening everyone!

      I was wondering if there is something equivalent of  GL_NV_blend_equation_advanced for AMD?
      Basically I'm trying to find more compatible version of it.

      Thank you!
    • By Jens Eckervogt
      Hello guys, 
       
      Please tell me! 
      How do I know? Why does wavefront not show for me?
      I already checked I have non errors yet.
      using OpenTK; using System.Collections.Generic; using System.IO; using System.Text; namespace Tutorial_08.net.sourceskyboxer { public class WaveFrontLoader { private static List<Vector3> inPositions; private static List<Vector2> inTexcoords; private static List<Vector3> inNormals; private static List<float> positions; private static List<float> texcoords; private static List<int> indices; public static RawModel LoadObjModel(string filename, Loader loader) { inPositions = new List<Vector3>(); inTexcoords = new List<Vector2>(); inNormals = new List<Vector3>(); positions = new List<float>(); texcoords = new List<float>(); indices = new List<int>(); int nextIdx = 0; using (var reader = new StreamReader(File.Open("Contents/" + filename + ".obj", FileMode.Open), Encoding.UTF8)) { string line = reader.ReadLine(); int i = reader.Read(); while (true) { string[] currentLine = line.Split(); if (currentLine[0] == "v") { Vector3 pos = new Vector3(float.Parse(currentLine[1]), float.Parse(currentLine[2]), float.Parse(currentLine[3])); inPositions.Add(pos); if (currentLine[1] == "t") { Vector2 tex = new Vector2(float.Parse(currentLine[1]), float.Parse(currentLine[2])); inTexcoords.Add(tex); } if (currentLine[1] == "n") { Vector3 nom = new Vector3(float.Parse(currentLine[1]), float.Parse(currentLine[2]), float.Parse(currentLine[3])); inNormals.Add(nom); } } if (currentLine[0] == "f") { Vector3 pos = inPositions[0]; positions.Add(pos.X); positions.Add(pos.Y); positions.Add(pos.Z); Vector2 tc = inTexcoords[0]; texcoords.Add(tc.X); texcoords.Add(tc.Y); indices.Add(nextIdx); ++nextIdx; } reader.Close(); return loader.loadToVAO(positions.ToArray(), texcoords.ToArray(), indices.ToArray()); } } } } } And It have tried other method but it can't show for me.  I am mad now. Because any OpenTK developers won't help me.
      Please help me how do I fix.

      And my download (mega.nz) should it is original but I tried no success...
      - Add blend source and png file here I have tried tried,.....  
       
      PS: Why is our community not active? I wait very longer. Stop to lie me!
      Thanks !
    • By codelyoko373
      I wasn't sure if this would be the right place for a topic like this so sorry if it isn't.
      I'm currently working on a project for Uni using FreeGLUT to make a simple solar system simulation. I've got to the point where I've implemented all the planets and have used a Scene Graph to link them all together. The issue I'm having with now though is basically the planets and moons orbit correctly at their own orbit speeds.
      I'm not really experienced with using matrices for stuff like this so It's likely why I can't figure out how exactly to get it working. This is where I'm applying the transformation matrices, as well as pushing and popping them. This is within the Render function that every planet including the sun and moons will have and run.
      if (tag != "Sun") { glRotatef(orbitAngle, orbitRotation.X, orbitRotation.Y, orbitRotation.Z); } glPushMatrix(); glTranslatef(position.X, position.Y, position.Z); glRotatef(rotationAngle, rotation.X, rotation.Y, rotation.Z); glScalef(scale.X, scale.Y, scale.Z); glDrawElements(GL_TRIANGLES, mesh->indiceCount, GL_UNSIGNED_SHORT, mesh->indices); if (tag != "Sun") { glPopMatrix(); } The "If(tag != "Sun")" parts are my attempts are getting the planets to orbit correctly though it likely isn't the way I'm meant to be doing it. So I was wondering if someone would be able to help me? As I really don't have an idea on what I would do to get it working. Using the if statement is truthfully the closest I've got to it working but there are still weird effects like the planets orbiting faster then they should depending on the number of planets actually be updated/rendered.
    • By Jens Eckervogt
      Hello everyone, 
      I have problem with texture
      using System; using OpenTK; using OpenTK.Input; using OpenTK.Graphics; using OpenTK.Graphics.OpenGL4; using System.Drawing; using System.Reflection; namespace Tutorial_05 { class Game : GameWindow { private static int WIDTH = 1200; private static int HEIGHT = 720; private static KeyboardState keyState; private int vaoID; private int vboID; private int iboID; private Vector3[] vertices = { new Vector3(-0.5f, 0.5f, 0.0f), // V0 new Vector3(-0.5f, -0.5f, 0.0f), // V1 new Vector3(0.5f, -0.5f, 0.0f), // V2 new Vector3(0.5f, 0.5f, 0.0f) // V3 }; private Vector2[] texcoords = { new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 1), new Vector2(1, 0) }; private int[] indices = { 0, 1, 3, 3, 1, 2 }; private string vertsrc = @"#version 450 core in vec3 position; in vec2 textureCoords; out vec2 pass_textureCoords; void main(void) { gl_Position = vec4(position, 1.0); pass_textureCoords = textureCoords; }"; private string fragsrc = @"#version 450 core in vec2 pass_textureCoords; out vec4 out_color; uniform sampler2D textureSampler; void main(void) { out_color = texture(textureSampler, pass_textureCoords); }"; private int programID; private int vertexShaderID; private int fragmentShaderID; private int textureID; private Bitmap texsrc; public Game() : base(WIDTH, HEIGHT, GraphicsMode.Default, "Tutorial 05 - Texturing", GameWindowFlags.Default, DisplayDevice.Default, 4, 5, GraphicsContextFlags.Default) { } protected override void OnLoad(EventArgs e) { base.OnLoad(e); CursorVisible = true; GL.GenVertexArrays(1, out vaoID); GL.BindVertexArray(vaoID); GL.GenBuffers(1, out vboID); GL.BindBuffer(BufferTarget.ArrayBuffer, vboID); GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(vertices.Length * Vector3.SizeInBytes), vertices, BufferUsageHint.StaticDraw); GL.GenBuffers(1, out iboID); GL.BindBuffer(BufferTarget.ElementArrayBuffer, iboID); GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)(indices.Length * sizeof(int)), indices, BufferUsageHint.StaticDraw); vertexShaderID = GL.CreateShader(ShaderType.VertexShader); GL.ShaderSource(vertexShaderID, vertsrc); GL.CompileShader(vertexShaderID); fragmentShaderID = GL.CreateShader(ShaderType.FragmentShader); GL.ShaderSource(fragmentShaderID, fragsrc); GL.CompileShader(fragmentShaderID); programID = GL.CreateProgram(); GL.AttachShader(programID, vertexShaderID); GL.AttachShader(programID, fragmentShaderID); GL.LinkProgram(programID); // Loading texture from embedded resource texsrc = new Bitmap(Assembly.GetEntryAssembly().GetManifestResourceStream("Tutorial_05.example.png")); textureID = GL.GenTexture(); GL.BindTexture(TextureTarget.Texture2D, textureID); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)All.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)All.Linear); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, texsrc.Width, texsrc.Height, 0, PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero); System.Drawing.Imaging.BitmapData bitmap_data = texsrc.LockBits(new Rectangle(0, 0, texsrc.Width, texsrc.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb); GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, texsrc.Width, texsrc.Height, PixelFormat.Bgra, PixelType.UnsignedByte, bitmap_data.Scan0); texsrc.UnlockBits(bitmap_data); GL.Enable(EnableCap.Texture2D); GL.BufferData(BufferTarget.TextureBuffer, (IntPtr)(texcoords.Length * Vector2.SizeInBytes), texcoords, BufferUsageHint.StaticDraw); GL.BindAttribLocation(programID, 0, "position"); GL.BindAttribLocation(programID, 1, "textureCoords"); } protected override void OnResize(EventArgs e) { base.OnResize(e); GL.Viewport(0, 0, ClientRectangle.Width, ClientRectangle.Height); } protected override void OnUpdateFrame(FrameEventArgs e) { base.OnUpdateFrame(e); keyState = Keyboard.GetState(); if (keyState.IsKeyDown(Key.Escape)) { Exit(); } } protected override void OnRenderFrame(FrameEventArgs e) { base.OnRenderFrame(e); // Prepare for background GL.Clear(ClearBufferMask.ColorBufferBit); GL.ClearColor(Color4.Red); // Draw traingles GL.EnableVertexAttribArray(0); GL.EnableVertexAttribArray(1); GL.BindVertexArray(vaoID); GL.UseProgram(programID); GL.BindBuffer(BufferTarget.ArrayBuffer, vboID); GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 0, IntPtr.Zero); GL.ActiveTexture(TextureUnit.Texture0); GL.BindTexture(TextureTarget.Texture3D, textureID); GL.BindBuffer(BufferTarget.ElementArrayBuffer, iboID); GL.DrawElements(BeginMode.Triangles, indices.Length, DrawElementsType.UnsignedInt, 0); GL.DisableVertexAttribArray(0); GL.DisableVertexAttribArray(1); SwapBuffers(); } protected override void OnClosed(EventArgs e) { base.OnClosed(e); GL.DeleteVertexArray(vaoID); GL.DeleteBuffer(vboID); } } } I can not remember where do I add GL.Uniform2();
  • Advertisement
  • Advertisement
Sign in to follow this  

OpenGL gluLookAt() and matrix stack operations deprecated?

This topic is 1453 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

I have a couple question about some opengl deprecated functionality and it's replacements:

 

1.) I'm told gluLookAt() is deprecated in 3.0. What do i use as it's replacement? Do i multiply a camera rotation matrix by the view matrix to get the new view matrix?

 

2.) My understanding was that OpenGL works with a 32 stack of 4x4 ModelView matrices. If i can't push and pop matrices anymore and vertex data is in a VAO, then there is absolutely no point in 32 stacks and it mine as well be 1 ModelView matrix?

Share this post


Link to post
Share on other sites
Advertisement

All matrix operations and everything that came with it, such as the stack, are all gone. There's not even anything called a model view matrix in OpenGL anymore. You have to manage all matrices yourself now and load them to your shaders as necessary.

Share this post


Link to post
Share on other sites

Do you have a sample program code by chance or can tell me how i could manage model, view, and proj matrix? It seems like 99% of opengl tutorial code on the web is using functionality that was deprecated years before they published the tutorial.

 

Could i get the MVP matrices like so, then send modelview[16] to the shader:

float modelview[16];
glGetFloatv(GL_MODELVIEW_MATRIX, modelview);

Share this post


Link to post
Share on other sites

I have a couple question about some opengl deprecated functionality and it's replacements:

 

1.) I'm told gluLookAt() is deprecated in 3.0. What do i use as it's replacement? Do i multiply a camera rotation matrix by the view matrix to get the new view matrix?

 

2.) My understanding was that OpenGL works with a 32 stack of 4x4 ModelView matrices. If i can't push and pop matrices anymore and vertex data is in a VAO, then there is absolutely no point in 32 stacks and it mine as well be 1 ModelView matrix?

 

1) Vast amount of legacy OpenGL functions is deprecated, not just matrix manipulation.

 

2) Vertex data is not stored in VAO, but in VBO. VAO stores client state (which attributes are enabled, offsets, etc.). A stack of model-view or projection matrices are still useful, but YOU have to implement them if you need them.

 

 

Do you have a sample program code by chance or can tell me how i could manage model, view, and proj matrix? It seems like 99% of opengl tutorial code on the web is using functionality that was deprecated years before they published the tutorial.

 

Could i get the MVP matrices like so, then send modelview[16] to the shader:

float modelview[16];
glGetFloatv(GL_MODELVIEW_MATRIX, modelview);

 

No, you cannot do that! Because functions that sets legacy model-view (top) matrix are deprecated as well. There is a plenty of modern OpenGL tutorials. Just google for them. :)

...

Share this post


Link to post
Share on other sites

You can use uniforms to pass the MVP matrix. I recommend you read a tutorial like this one on modern OpenGL. I also recommend using a math library like GLM which provides functions like lookAt except if you like writing this functionality yourself. For example:

glm::perspective(angle, ratio, near, far) * glm::lookAt(position, target, up)

Share this post


Link to post
Share on other sites

At this stage it's important to add:

 

While the functionality had been officially deprecated, that doesn't mean that it's stopped working!

 

For the most part you can continue using it and it will continue working just as before.  The exception is if you create a "core context" which only supports the non-deprecated functionality, but all drivers will by default give you a "compatibility context", which fully supports it.

 

In other words: unless you explicitly ask for it to not be available, you can continue using it.

 

This seems similar to when Microsoft announced that they weren't providing any more updates to XNA and the internet was full of whining as if XNA had suddenly stopped working.  Yayy internet.  That's not the case at all.

 

Now, it's necessary for me to temper that with a healthily-sized dose of "just because you can doesn't mean that you should" (because yayy internet again).  The old matrix stack and GLU functions were never anything more than a software matrix library, so if you want a replacement for them, the answer is simple: find and use a software matrix library (glm seems to be a popular choice).

 

But unless you need to stop using the old stuff, there's no reason to not continue using it.

 

Again - yayy internet - that doesn't mean I'm advocating it's use.  Just that I'm conscious that porting existing code from old to new (anything, not just GL) can be a very large job, and often has minimal benefit.  All new programs should just use the new stuff.

Share this post


Link to post
Share on other sites

I see, i see.

 

I have a couple last questions:

 

 

(i) Since i feed vertex position in eye space into the VAO/VBO, instead of model space vertex position through glBegin->glVertex3f->glEnd, does this mean, in my vertex shader, i no longer need to transform the received vertex from model->eye space like so:

void main() {
 
    gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex;
}

and i can instead do the following since im passing in eye space vertex positions to thee vertex shader?:

attribute vec4 v_coord;
attribute vec3 v_normal;
 
void main() {
 
    gl_Position = v_coord;
}

(ii) I know i have to control the MVP matrices myself, then send them to the shader. When do i change the Model matrix? Because in legacy opengl, the Model matrix was changed with every glTranslate or glRotate call.

Edited by Shawn619

Share this post


Link to post
Share on other sites

I see, i see.
 
I have a couple last questions:
 
 
(i) Since i feed vertex position in eye space into the VAO/VBO, instead of model space vertex position through glBegin->glVertex3f->glEnd, does this mean, in my vertex shader, i no longer need to transform the received vertex from model->eye space like so:

void main() {
 
    gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex;
}
and i can instead do the following since im passing in eye space vertex positions to thee vertex shader?:
attribute vec4 v_coord;
attribute vec3 v_normal;
 
void main() {
 
    gl_Position = v_coord;
}

If you're passing eye-space coordinates then you shouldn't do anther model-to-eye space transformation because your vertices are already in eye-space. But that also implies that you're doing your transformations manually instead of doing them in the shader. If you want to do the equivalent operations to the legacy model, you need to pass the projection and modelview matrices to your shader, pass model-space vertices, and do the transformations in there but with your own uniform variables instead of the built in gl-uniforms.

 

(ii) I know i have to control the MVP matrices myself, then send them to the shader. When do i change the Model matrix? Because in legacy opengl, the Model matrix was changed with every glTranslate or glRotate call.

You should upload the matrix to the shader program when you have composed all the necessary transformations. If you have a translation and a rotation, then combine them and load the final matrix to the shader.

Share this post


Link to post
Share on other sites

Sorry for all the questions.

 

Do i send eye-space vertex positions in the VAO/VBO? Because model-space vertex positions in the VAO/VBO wouldn't make sense, right? 

Share this post


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

  • Advertisement