PDA

View Full Version : Need Helpppppp



AdamVO
12-03-2013, 02:11 PM
Helloooo.
I'm trying to figure out how to use shading pipeline aswell as GLSL itself, and I've encountered a problem with openGL not drawing my vertices. OpenGL drew the vertices without a problem before I added in colour Vertex Array Objects and binded them. I got the idea that you were supposed to have two separate sets of vertex array objects; one storing the coordinates of the vertices, and the other storing colour values. Perhaps this is where I went wrong? Some one please help me with this.
Cheers.

Here is my code:


#include "main.h" //g++ main.cpp -lGLEW -lGL -lglfw -lGLU -lglut -o triangle
#define BUFFER_OFFSET(offset) ((void *)(offset))
using namespace std;


enum VAO_IDs {Triangles, NumVAOs, colours};
enum Buffer_IDs {ArrayBuffer, NumBuffers, cBuffer};
enum Attrib_IDs {vPosition = 0, colorPosition = 1};
GLuint VAOs[NumVAOs];
GLuint ColourObjects[NumVAOs];
GLuint Buffers[NumBuffers];
GLuint colorbuffer[NumBuffers];
const GLuint NumVertices = 36;

//assigning vertex data to buffer objects and preparing to send to
void init() //Vertex Shaders.
{
glewInit();
glGenVertexArrays(NumVAOs, VAOs);
glBindVertexArray(VAOs[Triangles]);

GLfloat vertices [NumVertices] [3] =
{
{ 0.30, 0.00, -0.30 }, //Triangle 1
{ 0.30, 0.00, 0.30 },
{ -0.30, 0.00, -0.30 },
{ -0.30, 0.00, -0.30 }, //Triangle 2
{ -0.30, 0.00, 0.30 },
{ 0.30, 0.00, -0.30 },
{ -0.30, 0.00, 0.30 }, //Triangle 3
{ 0.30, 0.00, 0.30 },
{ 0.30, 0.60, 0.30 },
{ -0.30, 0.60, 0.30 }, //Triangle 4
{ 0.30, 0.60, 0.30 },
{ -0.30, 0.00, 0.30 },
};

glGenBuffers(NumBuffers, Buffers);
glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);


glGenVertexArrays(NumVAOs, ColourObjects);
glBindVertexArray(ColourObjects[colours]);

GLfloat g_color_buffer_data[NumVertices][3] =
{
{ 0.583f, 0.771f, 0.014f },
{ 0.609f, 0.115f, 0.436f },
{ 0.327f, 0.483f, 0.844f },
{ 0.822f, 0.569f, 0.201f },
{ 0.435f, 0.602f, 0.223f },
{ 0.310f, 0.747f, 0.185f },
{ 0.597f, 0.770f, 0.761f },
{ 0.559f, 0.436f, 0.730f },
{ 0.359f, 0.583f, 0.152f },
{ 0.483f, 0.596f, 0.789f },
{ 0.559f, 0.861f, 0.639f },
{ 0.195f, 0.548f, 0.859f },
};
glGenBuffers(1, colorbuffer);
glBindBuffer(GL_ARRAY_BUFFER, colorbuffer[cBuffer]);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_color_buffer_data), g_color_buffer_data, GL_STATIC_DRAW);

ShaderInfo shaders[] =
{
{ GL_VERTEX_SHADER, "triangles.vert"},
{ GL_FRAGMENT_SHADER, "triangle.frag"},
{ GL_NONE, NULL}
};

glVertexAttribPointer(vPosition, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
glEnableVertexAttribArray(vPosition );

glVertexAttribPointer(colorPosition, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
glEnableVertexAttribArray(colorPosition);


}

void display()
{
glClearColor(1,0.5f,0,0);
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(VAOs[Triangles]); //?
glDrawArrays(GL_TRIANGLES, 0, NumVertices);
glFlush();
}



int main(int argc, char** argv)
{
const int width = 400, height = 400;

glutInit(&argc, argv);
glutInitWindowSize(width, height);
glutInitDisplayMode(GLUT_RGBA);
glutInitContextVersion(3, 3);
glutInitContextProfile(GLUT_CORE_PROFILE);
glutCreateWindow(argv[0]);

init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}


My Vertex Shader:

#version 330 core

layout(location = 0) in vec4 vPostion;
layout(location = 1) in vec3 vertexColor;
out vec3 fragmentColor;
void main()
{
gl_Position = vPosition;
fragmentColor = vertexColor
}

My Fragment Shader:


#version 330 core
in vec3 fragmentColor;
out vec3 color;

void main()
{
color = fragmentColor
}

tonyo_au
12-03-2013, 04:30 PM
two separate sets of vertex array objects; one storing the coordinates of the vertices, and the other storing colour values
You should only have one VAO to which you attach the vertex and colour buffers.


bind vao
bind vertex buffer, load and set attributes
bind colour buffer,load and set attributes
unbind vao


It is not necessary to have separate buffers for the colour and vertex; they can be inter-leaved and probably should be