Sign in to follow this  
storm33229

OpenGL Custom Vertex structure

Recommended Posts

I am using OpenGL and C to create a 2D rendering engine. I am learning about VBOs and how to use them for non-immediate mode rendering. I have been reading from: http://www.opengl.org/wiki/Vertex_Buffer_Object

The tutorial suggests the following:

struct MyVertex
{
float x, y, z; //Vertex
float nx, ny, nz; //Normal
float s0, t0; //Texcoord0
float s1, t1; //Texcoord1
float s2, t2; //Texcoord2
float padding[4];
};

I do not need the Normal values, and I am unsure how or why there are three texture coordinates for a single vertex.

I think all I should need is Vertex (XYZ), and one Texcoord (s0, t0 <-- still do not know what those mean).

Share this post


Link to post
Share on other sites
This is my vertex structure, also for 2D:

[code]

struct NLVertexData
{
/// \brief Constructor
NLVertexData()
: x(0), y(0), z(0),
r(1), g(1), b(1), a(1),
s(0), t(0)
{}

/// \brief X
f32 x;

/// \brief Y
f32 y;

/// \brief Z
f32 z;

/// \brief Red
f32 r;

/// \brief Green
f32 g;

/// \brief Blue
f32 b;

/// \brief Alpha
f32 a;

/// \brief s
f32 s;

/// \brief t
f32 t;
};
[/code]

That makes a size of 36 bytes per Vertex.
That leads to the following Vertex Attribute Set:

[code]
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(NLVertexData), 0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(NLVertexData), (void*)(3*sizeof(float)));
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(NLVertexData), (void*)(7*sizeof(float)));
[/code]

Shader-Layout:

[code]
layout(location = 0) in vec3 Vertex;
layout(location = 1) in vec4 Color;
layout(location = 2) in vec2 TextureCoord;
[/code]

So yes, you need only 1 set of texture-coordinates per Vertex. Don't know why they use it like this in that tutorial.
Why they are called S and T is something I did not figure out after reading 3 Books and an unknown amount of websites regarding the topic :P.
I just take it as a given naming :lol:.

Good Tutorial:

[url="http://arcsynthesis.org/gltut/"]Learning Modern 3D Graphics Programming Through OpenGL[/url]

Share this post


Link to post
Share on other sites
[quote name='storm33229' timestamp='1312850252' post='4846459']
I am using OpenGL and C to create a 2D rendering engine. I am learning about VBOs and how to use them for non-immediate mode rendering. I have been reading from: [url="http://www.opengl.org/wiki/Vertex_Buffer_Object"]http://www.opengl.or...x_Buffer_Object[/url]

The tutorial suggests the following:

struct MyVertex
{
float x, y, z; //Vertex
float nx, ny, nz; //Normal
float s0, t0; //Texcoord0
float s1, t1; //Texcoord1
float s2, t2; //Texcoord2
float padding[4];
};

I do not need the Normal values, and I am unsure how or why there are three texture coordinates for a single vertex.

I think all I should need is Vertex (XYZ), and one Texcoord (s0, t0 <-- still do not know what those mean).
[/quote]

Then make your structure like this


struct MyVertex
{
float x, y, z; //Vertex
float s0, t0; //Texcoord0
};

or if you want it to by 32 bytes
struct MyVertex
{
float x, y, z; //Vertex
float s0, t0; //Texcoord0
float padding[3];
};

s0 and t0 are texcoords (XY). You can call it whatever you want such as


struct MyVertex
{
float fatso_x, fatso_y, fatso_z; //Vertex
float nipples_x, nipples_y; //Texcoord0
float padding[3];
};

Share this post


Link to post
Share on other sites
Thank you both for those examples. I about choked on what I was drinking when I read fatso and nipples. [img]http://public.gamedev.net/public/style_emoticons/default/laugh.gif[/img]

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Partner Spotlight

  • Forum Statistics

    • Total Topics
      627636
    • Total Posts
      2978331
  • Similar Content

    • By xhcao
      Before using void glBindImageTexture(    GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format), does need to make sure that texture is completeness. 
    • By cebugdev
      hi guys, 
      are there any books, link online or any other resources that discusses on how to build special effects such as magic, lightning, etc. in OpenGL? i mean, yeah most of them are using particles but im looking for resources specifically on how to manipulate the particles to look like an effect that can be use for games,. i did fire particle before, and I want to learn how to do the other 'magic' as well.
      Like are there one book or link(cant find in google) that atleast featured how to make different particle effects in OpenGL (or DirectX)? If there is no one stop shop for it, maybe ill just look for some tips on how to make a particle engine that is flexible enough to enable me to design different effects/magic 
      let me know if you guys have recommendations.
      Thank you in advance!
    • By dud3
      How do we rotate the camera around x axis 360 degrees, without having the strange effect as in my video below? 
      Mine behaves exactly the same way spherical coordinates would, I'm using euler angles.
      Tried googling, but couldn't find a proper answer, guessing I don't know what exactly to google for, googled 'rotate 360 around x axis', got no proper answers.
       
      References:
      Code: https://pastebin.com/Hcshj3FQ
      The video shows the difference between blender and my rotation:
       
    • By Defend
      I've had a Google around for this but haven't yet found some solid advice. There is a lot of "it depends", but I'm not sure on what.
      My question is what's a good rule of thumb to follow when it comes to creating/using VBOs & VAOs? As in, when should I use multiple or when should I not? My understanding so far is that if I need a new VBO, then I need a new VAO. So when it comes to rendering multiple objects I can either:
      * make lots of VAO/VBO pairs and flip through them to render different objects, or
      * make one big VBO and jump around its memory to render different objects. 
      I also understand that if I need to render objects with different vertex attributes, then a new VAO is necessary in this case.
      If that "it depends" really is quite variable, what's best for a beginner with OpenGL, assuming that better approaches can be learnt later with better understanding?
       
    • By test opty
      Hello all,
       
      On my Windows 7 x64 machine I wrote the code below on VS 2017 and ran it.
      #include <glad/glad.h>  #include <GLFW/glfw3.h> #include <std_lib_facilities_4.h> using namespace std; void framebuffer_size_callback(GLFWwindow* window , int width, int height) {     glViewport(0, 0, width, height); } //****************************** void processInput(GLFWwindow* window) {     if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)         glfwSetWindowShouldClose(window, true); } //********************************* int main() {     glfwInit();     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);     glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);     //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);     GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", nullptr, nullptr);     if (window == nullptr)     {         cout << "Failed to create GLFW window" << endl;         glfwTerminate();         return -1;     }     glfwMakeContextCurrent(window);     if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))     {         cout << "Failed to initialize GLAD" << endl;         return -1;     }     glViewport(0, 0, 600, 480);     glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);     glClearColor(0.2f, 0.3f, 0.3f, 1.0f);     glClear(GL_COLOR_BUFFER_BIT);     while (!glfwWindowShouldClose(window))     {         processInput(window);         glfwSwapBuffers(window);         glfwPollEvents();     }     glfwTerminate();     return 0; }  
      The result should be a fixed dark green-blueish color as the end of here. But the color of my window turns from black to green-blueish repeatedly in high speed! I thought it might be a problem with my Graphics card driver but I've updated it and it's: NVIDIA GeForce GTX 750 Ti.
      What is the problem and how to solve it please?
  • Popular Now