First attempt at non-deprecated code

Started by
31 comments, last by BackwardSpy 13 years, 4 months ago
Still nothing. I tried what you said, and I also fiddled with the triangle's vertices in other ways as well to try and get them to work.
Advertisement
I've changed a few things around again
#include <iostream>#include <SFML/Window.hpp>#define GLEW_STATIC#include <GL/glew.h>#include "math3d.h"void LogErrors(){	GLenum err;	while((err = glGetError()) != GL_NO_ERROR)	{		switch(err)		{		case(GL_INVALID_ENUM):			std::cerr << "GL_INVALID_ENUM" << std::endl;			break;		case(GL_INVALID_VALUE):			std::cerr << "GL_INVALID_VALUE" << std::endl;			break;		case(GL_INVALID_OPERATION):			std::cerr << "GL_INVALID_OPERATION" << std::endl;			break;		case(GL_STACK_OVERFLOW):			std::cerr << "GL_STACK_OVERFLOW" << std::endl;			break;		case(GL_STACK_UNDERFLOW):			std::cerr << "GL_STACK_UNDERFLOW" << std::endl;			break;		case(GL_OUT_OF_MEMORY):			std::cerr << "GL_OUT_OF_MEMORY" << std::endl;			break;		case(GL_TABLE_TOO_LARGE):			std::cerr << "GL_TABLE_TOO_LARGE" << std::endl;			break;		}	}}int main(){	const float W = 800.0f;	const float H = 600.0f;	sf::Window window(sf::VideoMode(W, H), "Non-deprecated OpenGL", sf::Style::Close);	bool keys[sf::Key::Count];	glewInit();	// Triangle vertex data	GLfloat triangle[] = {		0.0f, 0.8f, 1.0f,	// Vertices		0.8f, -0.8f, 1.0f,		-0.8f, -0.8f, 1.0f };	// Create a buffer to hold the data	GLuint triangleBuffer;	glGenBuffers(1, &triangleBuffer);	// Hint that we'll be buffering a vertex array...	glBindBuffer(GL_ARRAY_BUFFER, triangleBuffer);	// And finally put the data into the buffer	glBufferData(GL_ARRAY_BUFFER, sizeof(triangle), triangle, GL_STATIC_DRAW);		// Initialise OpenGL stuff	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);	// Set up some basic shaders	const GLchar *vertShaderCode =		"#version 140\n"		"uniform mat4 mvpMatrix;\n"		"in vec4 vertex;\n"		"void main()\n"		"{\n"		"gl_Position = vertex;\n"		"}\n";	const GLchar *fragShaderCode =		"#version 140\n"		"void main()\n"		"{\n"		"gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\n"		"}\n";	// Create some new shaders	GLuint vertShader = glCreateShader(GL_VERTEX_SHADER);	GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);	// Put the code into them	glShaderSource(vertShader, 1, &vertShaderCode, NULL);	glShaderSource(fragShader, 1, &fragShaderCode, NULL);	// Compile them	glCompileShader(vertShader);	glCompileShader(fragShader);	GLint status;	glGetShaderiv(vertShader, GL_COMPILE_STATUS, &status);	if(status == GL_FALSE)	{		std::cerr << "Failed to load vertex shader" << std::endl;		GLint logLength = 0;		glGetShaderiv(vertShader, GL_INFO_LOG_LENGTH, &logLength);		GLchar *log = new GLchar[logLength];		glGetShaderInfoLog(vertShader, logLength, &status, log);		std::cerr << log << std::endl;		delete[] log;	}	glGetShaderiv(fragShader, GL_COMPILE_STATUS, &status);	if(status == GL_FALSE)	{		std::cerr << "Failed to load fragment shader" << std::endl;		GLint logLength = 0;		glGetShaderiv(fragShader, GL_INFO_LOG_LENGTH, &logLength);		GLchar *log = new GLchar[logLength];		glGetShaderInfoLog(fragShader, logLength, &status, log);		std::cerr << log << std::endl;		delete[] log;	}	// Link them into a program to use in rendering	GLuint shaderProgram = glCreateProgram();	glAttachShader(shaderProgram, vertShader);	glAttachShader(shaderProgram, fragShader);	glLinkProgram(shaderProgram);	glGetProgramiv(shaderProgram, GL_LINK_STATUS, &status);	if(status == GL_FALSE)	{		std::cerr << "Failed to link shader program" << std::endl;		GLint logLength = 0;		glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &logLength);		GLchar *log = new GLchar[logLength];		glGetProgramInfoLog(shaderProgram, logLength, &status, log);		std::cerr << log << std::endl;		delete[] log;	}	// Get the location of the mvp matrix in the vertex shader	GLint mvpmLocation = glGetUniformLocation(shaderProgram, "mvpMatrix");	// And also get the location of the colour and vertex attributes	GLint vertexLocation = glGetAttribLocation(shaderProgram, "vertex");	// Construct a projection matrix	M3DMatrix44f projectionMatrix;	m3dMakePerspectiveMatrix(projectionMatrix, 35.0f, W / H, 0.1f, 100.0f);		// And a modelview matrix	M3DMatrix44f modelviewMatrix;	m3dLoadIdentity44(modelviewMatrix);		// And combine them into a modelview-projection matrix!	M3DMatrix44f mvpMatrix;	m3dMatrixMultiply44(mvpMatrix, projectionMatrix, modelviewMatrix);	while(window.IsOpened())	{		sf::Event e;		while(window.GetEvent(e))		{			switch(e.Type)			{			case(sf::Event::Closed):				window.Close();				break;			case(sf::Event::KeyPressed):				if(e.Key.Code == sf::Key::Escape)					window.Close();				else					keys[e.Key.Code] = true;				break;			case(sf::Event::KeyReleased):				keys[e.Key.Code] = false;				break;			default:				break;			}		}		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);		// Enable the shader program (not required in this case, but it's safe enough to do it anyway		glUseProgram(shaderProgram);		// Tell the shader about our modelview projection matrix...		glUniformMatrix4fv(mvpmLocation, 1, GL_FALSE, mvpMatrix);		// Give it our triangle's vertices		glEnableClientState(GL_VERTEX_ARRAY);		glBindBuffer(GL_ARRAY_BUFFER, triangleBuffer);		glVertexPointer(3, GL_FLOAT, 0, 0);		// Finally, we can do some drawing!		glDrawElements(GL_LINE_LOOP, 3, 0, 0);		glDisableClientState(GL_VERTEX_ARRAY);		glBindBuffer(GL_ARRAY_BUFFER, 0);		//glBegin(GL_LINE_LOOP);		//glVertex3f(0.0f, 0.8f, 1.0f);		//glVertex3f(0.8f, -0.8f, 1.0f);		//glVertex3f(-0.8f, -0.8f, 1.0f);		//glEnd();		window.Display();	}	// Remove our buffer objects	glDeleteBuffers(1, &triangleBuffer);}


The commented out lines above window.Display is to prove my shaders and matrices are all working as they should. Uncommenting them draws a white triangle at the specified vertices. The vertex coordinates in the glVertex3f calls are the same as those in my vertex array near the top of the code.

I've also added a call to glEnableClientState with GL_VERTEX_ARRAY as the argument.

Yet again; nothing drawing on screen
glVertexPointer (deprecated) only works with a special input variable (I forget what it's called), it won't do anything with your "in vec4 vertex".

You had it right the first time with glVertexAttribArray, not sure why you changed it.

Also you're not multiplying with the projection matrix in your shader, not sure if that's intentional.
[size=2]My Projects:
[size=2]Portfolio Map for Android - Free Visual Portfolio Tracker
[size=2]Electron Flux for Android - Free Puzzle/Logic Game
I see. I changed it because it fit better with a sample code I found somewhere online :P

I'll change it back.

And yes, not multiplying by my matrix is intentional, I'm taking out every possible thing that could be going wrong in an attempt to figure out why it's not working
I don't see glEnableVertexAttribArray anywhere in your original code samples, which is required to use glVertexAttribPointer. This would be one of the reasons your draw isn't working.

It's basically the equivalent of glEnableClientState when you're using glVertexPointer.

[size=2]My Projects:
[size=2]Portfolio Map for Android - Free Visual Portfolio Tracker
[size=2]Electron Flux for Android - Free Puzzle/Logic Game
Ok, now we're getting somewhere (I hope)

With this code:
#include <iostream>#include <SFML/Window.hpp>#define GLEW_STATIC#include <GL/glew.h>#include "math3d.h"void LogErrors(){	GLenum err;	while((err = glGetError()) != GL_NO_ERROR)	{		switch(err)		{		case(GL_INVALID_ENUM):			std::cerr << "GL_INVALID_ENUM" << std::endl;			break;		case(GL_INVALID_VALUE):			std::cerr << "GL_INVALID_VALUE" << std::endl;			break;		case(GL_INVALID_OPERATION):			std::cerr << "GL_INVALID_OPERATION" << std::endl;			break;		case(GL_STACK_OVERFLOW):			std::cerr << "GL_STACK_OVERFLOW" << std::endl;			break;		case(GL_STACK_UNDERFLOW):			std::cerr << "GL_STACK_UNDERFLOW" << std::endl;			break;		case(GL_OUT_OF_MEMORY):			std::cerr << "GL_OUT_OF_MEMORY" << std::endl;			break;		case(GL_TABLE_TOO_LARGE):			std::cerr << "GL_TABLE_TOO_LARGE" << std::endl;			break;		}	}}int main(){	const float W = 800.0f;	const float H = 600.0f;	sf::Window window(sf::VideoMode(W, H), "Non-deprecated OpenGL", sf::Style::Close);	bool keys[sf::Key::Count];	glewInit();	// Triangle vertex data	GLfloat triangle[] = {		0.0f, 0.8f, -1.0f,	// Vertices		0.8f, -0.8f, -1.0f,		-0.8f, -0.8f, -1.0f };	// Create a buffer to hold the data	GLuint triangleBuffer;	glGenBuffers(1, &triangleBuffer);	// Hint that we'll be buffering a vertex array...	glBindBuffer(GL_ARRAY_BUFFER, triangleBuffer);	// And finally put the data into the buffer	glBufferData(GL_ARRAY_BUFFER, sizeof(triangle), triangle, GL_STATIC_DRAW);	// Unbind the buffer again	glBindBuffer(GL_ARRAY_BUFFER, 0);		// Initialise OpenGL stuff	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);	// Set up some basic shaders	const GLchar *vertShaderCode =		"#version 140\n"		"uniform mat4 mvpMatrix;\n"		"in vec4 vertex;\n"		"void main()\n"		"{\n"		"gl_Position = mvpMatrix * vertex;\n"		"}\n";	const GLchar *fragShaderCode =		"#version 140\n"		"void main()\n"		"{\n"		"gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\n"		"}\n";	// Create some new shaders	GLuint vertShader = glCreateShader(GL_VERTEX_SHADER);	GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);	// Put the code into them	glShaderSource(vertShader, 1, &vertShaderCode, NULL);	glShaderSource(fragShader, 1, &fragShaderCode, NULL);	// Compile them	glCompileShader(vertShader);	glCompileShader(fragShader);	GLint status;	glGetShaderiv(vertShader, GL_COMPILE_STATUS, &status);	if(status == GL_FALSE)	{		std::cerr << "Failed to load vertex shader" << std::endl;		GLint logLength = 0;		glGetShaderiv(vertShader, GL_INFO_LOG_LENGTH, &logLength);		GLchar *log = new GLchar[logLength];		glGetShaderInfoLog(vertShader, logLength, &status, log);		std::cerr << log << std::endl;		delete[] log;	}	glGetShaderiv(fragShader, GL_COMPILE_STATUS, &status);	if(status == GL_FALSE)	{		std::cerr << "Failed to load fragment shader" << std::endl;		GLint logLength = 0;		glGetShaderiv(fragShader, GL_INFO_LOG_LENGTH, &logLength);		GLchar *log = new GLchar[logLength];		glGetShaderInfoLog(fragShader, logLength, &status, log);		std::cerr << log << std::endl;		delete[] log;	}	// Link them into a program to use in rendering	GLuint shaderProgram = glCreateProgram();	glAttachShader(shaderProgram, vertShader);	glAttachShader(shaderProgram, fragShader);	glLinkProgram(shaderProgram);	glGetProgramiv(shaderProgram, GL_LINK_STATUS, &status);	if(status == GL_FALSE)	{		std::cerr << "Failed to link shader program" << std::endl;		GLint logLength = 0;		glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &logLength);		GLchar *log = new GLchar[logLength];		glGetProgramInfoLog(shaderProgram, logLength, &status, log);		std::cerr << log << std::endl;		delete[] log;	}	// Get the location of the mvp matrix in the vertex shader	GLint mvpmLocation = glGetUniformLocation(shaderProgram, "mvpMatrix");	// And also get the location of the colour and vertex attributes	GLint vertexLocation = glGetAttribLocation(shaderProgram, "vertex");	// Construct a projection matrix	M3DMatrix44f projectionMatrix;	m3dMakePerspectiveMatrix(projectionMatrix, 35.0f, W / H, 0.1f, 100.0f);		// And a modelview matrix	M3DMatrix44f modelviewMatrix;	m3dLoadIdentity44(modelviewMatrix);		// And combine them into a modelview-projection matrix!	M3DMatrix44f mvpMatrix;	m3dMatrixMultiply44(mvpMatrix, projectionMatrix, modelviewMatrix);	while(window.IsOpened())	{		sf::Event e;		while(window.GetEvent(e))		{			switch(e.Type)			{			case(sf::Event::Closed):				window.Close();				break;			case(sf::Event::KeyPressed):				if(e.Key.Code == sf::Key::Escape)					window.Close();				else					keys[e.Key.Code] = true;				break;			case(sf::Event::KeyReleased):				keys[e.Key.Code] = false;				break;			default:				break;			}		}		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);		// Enable the shader program (not required in this case, but it's safe enough to do it anyway		glUseProgram(shaderProgram);		// Tell the shader about our modelview projection matrix...		glUniformMatrix4fv(mvpmLocation, 1, GL_FALSE, mvpMatrix);		// Give it our triangle's vertices		glEnableClientState(GL_VERTEX_ARRAY);		glBindBuffer(GL_ARRAY_BUFFER, triangleBuffer);		glVertexAttribPointer(vertexLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);		// Finally, we can do some drawing!		glDrawElements(GL_TRIANGLES, 3, 0, 0);		glBindBuffer(GL_ARRAY_BUFFER, 0);		glDisableClientState(GL_VERTEX_ARRAY);		//glBegin(GL_LINE_LOOP);		//glVertex3f(0.0f, 0.8f, -1.0f);		//glVertex3f(0.8f, -0.8f, -1.0f);		//glVertex3f(-0.8f, -0.8f, -1.0f);		//glEnd();		window.Display();	}	// Remove our buffer objects	glDeleteBuffers(1, &triangleBuffer);}


We get an access violation at the call to glDrawElements. Apparently it's trying to access memory location 0x00000000 which makes me think it's related to the last 0 in glDrawElements. The documentation says that this parameter is a pointer to the location where the indices are stored, which is 0 by default. Because it's 0 by default, I don't think that is the issue.

Edit: Aha, I didn't see your last reply. I will try that now...
Updated code:
#include <iostream>#include <SFML/Window.hpp>#define GLEW_STATIC#include <GL/glew.h>#include "math3d.h"void LogErrors(){	GLenum err;	while((err = glGetError()) != GL_NO_ERROR)	{		switch(err)		{		case(GL_INVALID_ENUM):			std::cerr << "GL_INVALID_ENUM" << std::endl;			break;		case(GL_INVALID_VALUE):			std::cerr << "GL_INVALID_VALUE" << std::endl;			break;		case(GL_INVALID_OPERATION):			std::cerr << "GL_INVALID_OPERATION" << std::endl;			break;		case(GL_STACK_OVERFLOW):			std::cerr << "GL_STACK_OVERFLOW" << std::endl;			break;		case(GL_STACK_UNDERFLOW):			std::cerr << "GL_STACK_UNDERFLOW" << std::endl;			break;		case(GL_OUT_OF_MEMORY):			std::cerr << "GL_OUT_OF_MEMORY" << std::endl;			break;		case(GL_TABLE_TOO_LARGE):			std::cerr << "GL_TABLE_TOO_LARGE" << std::endl;			break;		}	}}int main(){	const float W = 800.0f;	const float H = 600.0f;	sf::Window window(sf::VideoMode(W, H), "Non-deprecated OpenGL", sf::Style::Close);	bool keys[sf::Key::Count];	glewInit();	// Triangle vertex data	GLfloat triangle[] = {		0.0f, 0.8f, -1.0f,	// Vertices		0.8f, -0.8f, -1.0f,		-0.8f, -0.8f, -1.0f };	// Create a buffer to hold the data	GLuint triangleBuffer;	glGenBuffers(1, &triangleBuffer);	// Hint that we'll be buffering a vertex array...	glBindBuffer(GL_ARRAY_BUFFER, triangleBuffer);	// And finally put the data into the buffer	glBufferData(GL_ARRAY_BUFFER, sizeof(triangle), triangle, GL_STATIC_DRAW);	// Unbind the buffer again	glBindBuffer(GL_ARRAY_BUFFER, 0);		// Initialise OpenGL stuff	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);	// Set up some basic shaders	const GLchar *vertShaderCode =		"#version 140\n"		"uniform mat4 mvpMatrix;\n"		"in vec4 vertex;\n"		"void main()\n"		"{\n"		"gl_Position = mvpMatrix * vertex;\n"		"}\n";	const GLchar *fragShaderCode =		"#version 140\n"		"void main()\n"		"{\n"		"gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\n"		"}\n";	// Create some new shaders	GLuint vertShader = glCreateShader(GL_VERTEX_SHADER);	GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);	// Put the code into them	glShaderSource(vertShader, 1, &vertShaderCode, NULL);	glShaderSource(fragShader, 1, &fragShaderCode, NULL);	// Compile them	glCompileShader(vertShader);	glCompileShader(fragShader);	GLint status;	glGetShaderiv(vertShader, GL_COMPILE_STATUS, &status);	if(status == GL_FALSE)	{		std::cerr << "Failed to load vertex shader" << std::endl;		GLint logLength = 0;		glGetShaderiv(vertShader, GL_INFO_LOG_LENGTH, &logLength);		GLchar *log = new GLchar[logLength];		glGetShaderInfoLog(vertShader, logLength, &status, log);		std::cerr << log << std::endl;		delete[] log;	}	glGetShaderiv(fragShader, GL_COMPILE_STATUS, &status);	if(status == GL_FALSE)	{		std::cerr << "Failed to load fragment shader" << std::endl;		GLint logLength = 0;		glGetShaderiv(fragShader, GL_INFO_LOG_LENGTH, &logLength);		GLchar *log = new GLchar[logLength];		glGetShaderInfoLog(fragShader, logLength, &status, log);		std::cerr << log << std::endl;		delete[] log;	}	// Link them into a program to use in rendering	GLuint shaderProgram = glCreateProgram();	glAttachShader(shaderProgram, vertShader);	glAttachShader(shaderProgram, fragShader);	glLinkProgram(shaderProgram);	glGetProgramiv(shaderProgram, GL_LINK_STATUS, &status);	if(status == GL_FALSE)	{		std::cerr << "Failed to link shader program" << std::endl;		GLint logLength = 0;		glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &logLength);		GLchar *log = new GLchar[logLength];		glGetProgramInfoLog(shaderProgram, logLength, &status, log);		std::cerr << log << std::endl;		delete[] log;	}	// Get the location of the mvp matrix in the vertex shader	GLint mvpmLocation = glGetUniformLocation(shaderProgram, "mvpMatrix");	// And also get the location of the colour and vertex attributes	GLint vertexLocation = glGetAttribLocation(shaderProgram, "vertex");	// Construct a projection matrix	M3DMatrix44f projectionMatrix;	m3dMakePerspectiveMatrix(projectionMatrix, 35.0f, W / H, 0.1f, 100.0f);		// And a modelview matrix	M3DMatrix44f modelviewMatrix;	m3dLoadIdentity44(modelviewMatrix);		// And combine them into a modelview-projection matrix!	M3DMatrix44f mvpMatrix;	m3dMatrixMultiply44(mvpMatrix, projectionMatrix, modelviewMatrix);	while(window.IsOpened())	{		sf::Event e;		while(window.GetEvent(e))		{			switch(e.Type)			{			case(sf::Event::Closed):				window.Close();				break;			case(sf::Event::KeyPressed):				if(e.Key.Code == sf::Key::Escape)					window.Close();				else					keys[e.Key.Code] = true;				break;			case(sf::Event::KeyReleased):				keys[e.Key.Code] = false;				break;			default:				break;			}		}		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);		// Enable the shader program (not required in this case, but it's safe enough to do it anyway		glUseProgram(shaderProgram);		// Tell the shader about our modelview projection matrix...		glUniformMatrix4fv(mvpmLocation, 1, GL_FALSE, mvpMatrix);		// Give it our triangle's vertices		glBindBuffer(GL_ARRAY_BUFFER, triangleBuffer);		glEnableVertexAttribArray(triangleBuffer);		glVertexAttribPointer(vertexLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);		// Finally, we can do some drawing!		glDrawElements(GL_TRIANGLES, 3, 0, 0);		glDisableVertexAttribArray(triangleBuffer);		glBindBuffer(GL_ARRAY_BUFFER, 0);		//glBegin(GL_LINE_LOOP);		//glVertex3f(0.0f, 0.8f, -1.0f);		//glVertex3f(0.8f, -0.8f, -1.0f);		//glVertex3f(-0.8f, -0.8f, -1.0f);		//glEnd();		window.Display();	}	// Remove our buffer objects	glDeleteBuffers(1, &triangleBuffer);}


Still crashes on the call to glDrawElements
As I just posted, replace this:

glEnableClientState(GL_VERTEX_ARRAY); <- only applies to glVertexPointer

with this

glEnableVertexAttribArray(vertexLocation); (not triangleBuffer! you need to read the documentation more closely)

Your glDrawElements is crashing because it is looking for a bound index array. If you are using indexed vertices, then you must bind the index buffer to the GL_ELEMENT_ARRAY_BUFFER target. If you don't have a index buffer bound, it interprets the final value as a pointer to an array in your system memory, so obviously a pointer to 0 is going to be a problem.

Otherwise if you're just drawing in sequential order, you want glDrawArrays instead. This is what you want in your simple case.
[size=2]My Projects:
[size=2]Portfolio Map for Android - Free Visual Portfolio Tracker
[size=2]Electron Flux for Android - Free Puzzle/Logic Game
Argh, I see I'm getting to the point of making stupid mistakes now!
Maybe I should take a rest for a bit and come back to it later in future


Thank you so much though, it finally works!
Alright, so (in general terms), how should I go about adding per-vertex colours?

Edit: Argh, I keep forgetting this forum won't automatically merge consecutive posts together, sorry!

This topic is closed to new replies.

Advertisement