• Advertisement
  • Popular Tags

  • Popular Now

  • Advertisement
  • Similar Content

    • 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();
    • By Jens Eckervogt
      Hello everyone
      For @80bserver8 nice job - I have found Google search. How did you port from Javascript WebGL to C# OpenTK.?
      I have been searched Google but it shows f***ing Unity 3D. I really want know how do I understand I want start with OpenTK But I want know where is porting of Javascript and C#?
  • Advertisement
  • Advertisement
Sign in to follow this  

OpenGL Normal Vector in OpenGL

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

1. I would Lkie ask sum thing about Vector Normal in OpenGl when we specify things like this glBegin(GL_QUADS) glNormal3f(0,0,1); glVertex3f(100,100,0); glVertex3f(100,100,200); glNormal3f(0,1,0); glVertex3f(50,50,0); .... sum like dat I wanna ask does OPENGL store Normal Vector like a list or OPENGL just have one current Normal Vector ? if in the Code above we dont specify the any Normal Vector ,so wat will happen when the Vertices are drawn to the Buffer and in dat case how the Normal Vector be calculates 2. Vertex Array I have code snippet like this: glEnableClientState(GL_VERTEX_ARRAY); glEnbaleClinetState(GL_NORMAL_ARRAY); my Array data is 4 3D-Points in the x-y plane for example
float MyArray[]={-50,-50,0
                 ,-50,50,0} // A GL_CCW square lie in x-y plane
here is just 2 Normal Vectors for Example

float MyVector[]={0,0,1,


So I wanna ask when OpenGL Draw My Vertex Array ,which Vector Normal in My Vector Array will be Associated with which Vertex in my vertex Array ?
 or I maybe wrong in the way I specify all that thing ,coz I dun know much about this ,the book Im reading they dont get in detail
3. The last thing : What is Index Array Use for ??? In My Opinion it aint make sense . In the Book they say Index Vertex Array can share Vertices that means each Face can share vertices to each other ,and the datas dat specify the model will be smaller --> Faster performance At the first glance , It sounds resonable But I thinks the vertices OpenGl must Transforms and process are the same if we dont specify index vertex .Let me give example We specify a data array for a Cube: if we dont use index we have specify 4 points for each face of cube ,and the cube has 6 faces so we must specify total 6x4 =24 Vertices. and if we have OPENGL draw it with GL_QUADS ,it has to do 24 times tranformation if we use Vertex Array Index, the first thing we have to do is specify Vertext Array (Not index) ,and it just holds 8 Vertices But ur Index Vertex Array will hold the 24 Indexes so When we call glDrawElement(GL_QUADS,24,GL_UNSIGNED_BYTE,Indexes); for each Index OPENGL has to lookup in Vertex Array ,and then transform, and it has to transform 24 times coz we have 24 indexes so It aint make sense rite?? and we aint count the time it has to lookup for data in the Vertex Array ,if we do it must be slower than normal So what u think ? If I wrong just tell me , coz Im new to OPENGL Thanks

Share this post

Link to post
Share on other sites
1: The last normal issued is always associated with a vertex. OpenGL saves pretty much all states. The second vertex in your case gets the normal (0, 0, 1), since that was the last specified normal before that vertex was specified.

2: All attributes in a vertex array must be reached with the same index. That is, if you have four vertices but only two normals, you must dumplicate the normals so there are four normals aswell; exactly one normal for each vertex, no more, no less. If your vertex arrays are of different lengths, there is something wrong with them.

3: Now let's calculate the memory usage. Plain arrays is 3 (components per vertex) times 24 (number of vertices) times 4 (size of a float) is 288 bytes. Indexed arrays is 3*8*4 is 96 bytes, but add 24 (number of indices) times 4 (size of int), reaching a total of 192 bytes. So we have cut the memory usage down by ~33%.

Now think about the vertex cache also. Each vertex is shared among 3 faces, so using the index (they will all reference the same vertex), the vertex cache can skip re-transforming the vertex and just use the result from the last transform instead. Saves processing power.

Although it may not be as simple as this, it pretty much shows why they are usefull. But keep in mind that not all models gives you a ~33% memory reduction and 3 shared vertices; this scenario was very suitable for index arrays, but not all scenarios are. What's best vary from model to model.

edit: In point 3, I assume there's only the vertex position attribute present, and no normals, color, texture coordinates and such. If you add more attributes, the situation with the simple cube can very easily turn in to the worst case scenario for indexed arrays, leaving non-indexed arrays with the best choise.

Share this post

Link to post
Share on other sites
Yes, but the command itself will not be compiled into the display list, but the result of innvoking them will. That is, the geometry created by calling the vertex array functions is compiled into the display list.

Share this post

Link to post
Share on other sites
Thanks alot, I thought it will compile the command
So if we specify this in Display list like this

static float ang=45;


thats wat I do in void Setup() for example

now in void RenderScene();


when ang=46.0 in next Rendering ,does my sphere Rotate with ang =46 ??

Sum more question plzzz :p

In the book they say OpenGl has many Color Buffer

1.GL_RIGHT and GL_BACK_RIGHT and others same same like that ,coz it say GL_xxx_RIGHT or GL_BACK_xxx ,are they relative to each other ?? or they are unique color buffers ?

2.I wrote an testing example ,and I caught some new problems ,I couldnt know how to explain for myself
My testing example is simple I draw a green square on the screen :

#include <gl/glut.h>
void Render()

void Change(GLsizei w,GLsizei h)
GLfloat k=float(w)/float(h);
void main()
glutCreateWindow(" Redeeculous :( ");

I specify the command glDrawBuffer(GL_LEFT);
I wanna render it in GL_LEFT Color Buffer ,I didnt render it to GL_BACK
color buffer .why can I still see the green square ??, I thought It must be Black screen

3. How to know that how many GL_AUX color buffer we have ?? ,The book doesnt tell me

THanks for interested in :p

Share this post

Link to post
Share on other sites
why my post get push down to page 2nd :D , this magic will bring it up to 1st page what happen???:p

[Edited by - Love3DGraphiks on May 10, 2006 1:20:22 PM]

Share this post

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

  • Advertisement