I am trying to learn OpenGL with the tutorials at opengl-tutorial.org and started modifying tutorial two that basically draws a simple triangle. In addiction to changing some of the utility code that seems to work for me I tried to add another triangle to draw a square that I would want to texture later.
Now I ran into my first problem that I cannot identify. I am getting an access violation at position 0 at glDisableVertexAttribArray.
My Code:
#include <GL/glew.h>
#include <GL/glfw.h>
#include <glm/glm.hpp>
#include <string>
#include <fstream>
#include <streambuf>
#include <iostream>
using namespace glm;
using namespace std;
GLuint loadShaders(const string vertexShaderPath, const string fragmentShaderPath) {
GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER);
GLuint fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
string vertexShaderCode;
ifstream vertexShaderStream(vertexShaderPath);
vertexShaderStream.seekg(0, ios::end);
vertexShaderCode.reserve(vertexShaderStream.tellg());
vertexShaderStream.seekg(0, ios::beg);
vertexShaderCode.assign((istreambuf_iterator<char>(vertexShaderStream)), istreambuf_iterator<char>());
string fragmentShaderCode;
ifstream fragmentShaderStream(fragmentShaderPath);
fragmentShaderStream.seekg(0, ios::end);
fragmentShaderCode.reserve(fragmentShaderStream.tellg());
fragmentShaderStream.seekg(0, ios::beg);
fragmentShaderCode.assign((istreambuf_iterator<char>(fragmentShaderStream)), istreambuf_iterator<char>());
const char *vertexShaderSource = vertexShaderCode.c_str();
glShaderSource(vertexShaderID, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShaderID);
const char *fragmentShaderSource = fragmentShaderCode.c_str();
glShaderSource(fragmentShaderID, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShaderID);
GLuint programID = glCreateProgram();
glAttachShader(programID, vertexShaderID);
glAttachShader(programID, fragmentShaderID);
glLinkProgram(programID);
glDeleteShader(vertexShaderID);
glDeleteShader(fragmentShaderID);
return programID;
}
int main(int argc, char* argv[]) {
glfwInit();
glfwOpenWindowHint(GLFW_FSAA_SAMPLES, 4);
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3);
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 3);
glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwOpenWindow(1024, 768, 0, 0, 0, 0, 32, 0, GLFW_WINDOW);
glfwSetWindowTitle("RTS");
glfwEnable(GLFW_STICKY_KEYS);
glewExperimental = GL_TRUE;
glewInit();
glClearColor(0.0f, 1.0f, 0.0f, 0.0f);
GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);
GLuint programID = loadShaders("VertexShader.glsl", "FragmentShader.glsl");
const GLfloat vertexBufferData[] = {
-1.0f, -1.0f, 0.0f,
-1.0f, 1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
1.0f, 1.0f, 0.0f,
-1.0f, 1.0f, 0.0f
};
GLuint vertexBuffer;
glGenBuffers(1, &vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexBufferData), vertexBufferData, GL_STATIC_DRAW);
do {
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(programID);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glVertexAttribPointer(0, 6, GL_FLOAT, GL_FALSE, 0, (void*)0);
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableVertexAttribArray(0);
glfwSwapBuffers();
}
while(glfwGetKey(GLFW_KEY_ESC) != GLFW_PRESS && glfwGetWindowParam(GLFW_OPENED));
glDeleteBuffers(1, &vertexBuffer);
glDeleteProgram(programID);
glDeleteVertexArrays(1, &VertexArrayID);
glfwTerminate();
return 0;
}
(original on http://www.opengl-tu...first-triangle/)The shader code is the same as the original, it compiles fine and the original code does run perfectly.
Please help me fix my code, thank you!
Cheers,
Jan