0

So I finally set up opengl window properly and got triangles to show up using vaos, vbos and glDrawElements() etc.

Here is the what i have

But now I have new problem - can't get shaders to work. I don't quite understand them yet. I want fragment shader to show vertex colors which I put into a separate buffer object.

Example code:

const char* vertexShaderSource = 
    "#program 330\n"
    "layout(location = 0) in vec2 position;\n"
    "layout(location = 1) in vec3 color;\n"
    "out vec4 fragColor;\n"
    "void main(void){\n"
    "gl_Position = vec4(position, 0.0, 1.0);\n"
    "fragColor = vec4(color, 1.0);\n"
    "}";

const char* fragShaderSource =
    "#program 330\n"
    "in vec4 fragColor;\n"
    "out vec4 outColor;\n"
    "void main(void){\n"
    "outColor = fragColor;\n"
    "}";

GLuint programID = glCreateProgram();
GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShaderID, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShaderID);

GLuint fragShaderID = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragShaderID, 1, &fragShaderSource, NULL);
glCompileShader(fragShaderID);

glAttachShader(programID, vertexShaderID);
glAttachShader(programID, fragShaderID);
glLinkProgram(programID);
glValidateProgram(programID);

GLfloat vertexPositions[8] = 
{
    -0.5f, 0.5f,
    0.5f, 0.5f,
    -0.5f, -0.5f,
    0.5f, -0.5f,
};

GLfloat colors[18] = 
{
    1.0f, 0.0f, 0.0f,
    0.0f, 1.0f, 0.0f,
    0.0f, 0.0f, 1.0f,

    0.0f, 1.0f, 0.0f,
    1.0f, 0.0f, 0.0f,
    0.0f, 0.0f, 1.0f,
};

GLushort indices[6] =
{
    0, 1, 2,
    1, 3, 2
};

GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

GLuint vbo; //Vertices
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 8, vertexPositions, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);

GLuint cbo; //Colors
glGenBuffers(1, &cbo);
glBindBuffer(GL_ARRAY_BUFFER, cbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 18, colors, GL_STATIC_DRAW);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);

GLuint ibo; //Indexes
glGenBuffers(1, &ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort) * 6, indices, GL_STATIC_DRAW);

And render:

while(..)
{
    ..clear

    glBindVertexArray(vao);
    glUseProgram(programID);

    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (void*)(0));

    ..update
}

Everything seems to work fine except for shaders. Any help is appreciated :) Thanks.

4

1 回答 1

3

In each of the shaders, change "#program 330\n" to "#version 330\n". That is how you specify which GLSL version to use.

于 2015-07-02T09:57:10.307 回答