Jump to content

  • Log In with Google      Sign In   
  • Create Account

nonsenseinc

Member Since 18 Nov 2012
Offline Last Active Nov 19 2012 04:38 AM

Topics I've Started

glVertexAttribPointer - understanding the size attribute

18 November 2012 - 04:28 AM

Greetings,

after reading several OpenGL documentations I understand that glVertexAttribPointer takes a numeral value between 1 and 4 for its second parameter (size) as information how many vertices are taken into consideration to render a single triangle. But I do not understand how to use other then three vertices for a triangle. Also trying different values and seeing the result doesn't help me.
What exactly does this do and what is it used for?

Cheers,
Jan

[solved] Modified opengl-tutorial.org code access violation at 0

18 November 2012 - 02:17 AM

Greetings,

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

PARTNERS