Commits

Jason McKesson  committed da79295

Adding tutorial 4.

  • Participants
  • Parent commits 97a3e4f

Comments (0)

Files changed (5)

File Documents/Outline.xml

                 <listitem>
                     <para>Make a cube where each face has a different color. Place the cube to the
                         side of the viewing area. This shows what things are like in an orthographic
-                        projection.</para>
+                        projection. Use backface culling to make it render correctly.</para>
                 </listitem>
                 <listitem>
                     <para>Have the same cube, but in our new world coordinates and projection. Do

File Tut 04 Objects at Rest/data/SimpleColors.frag

+#version 150
+
+smooth in vec4 theColor;
+
+out vec4 outputColor;
+
+void main()
+{
+	outputColor = theColor;
+}

File Tut 04 Objects at Rest/data/SimpleColors.vert

+#version 150
+
+in vec4 position;
+in vec4 color;
+
+smooth out vec4 theColor;
+
+uniform vec2 offset;
+
+void main()
+{
+	vec4 tempOffset = vec4(offset.x, offset.y, 0.0, 0.0);
+
+	gl_Position = position + tempOffset;
+	theColor = color;
+}

File Tut 04 Objects at Rest/premake4.lua

+
+dofile("../framework/framework.lua")
+
+SetupSolution("Tutorial4")
+SetupProject("Simple Square", "simpleSquare.cpp",
+	"data/SimpleColors.frag", "data/SimpleColors.vert")

File Tut 04 Objects at Rest/simpleSquare.cpp

+
+#include <string>
+#include <vector>
+#include <math.h>
+#include <glloader/gl_3_2_comp.h>
+#include <GL/freeglut.h>
+#include "../framework/framework.h"
+
+#define ARRAY_COUNT( array ) (sizeof( array ) / (sizeof( array[0] ) * (sizeof( array ) != sizeof(void*) || sizeof( array[0] ) <= sizeof(void*))))
+
+GLuint theProgram;
+GLuint positionAttrib;
+GLuint colorAttrib;
+
+GLuint offsetUniform;
+
+void InitializeProgram()
+{
+	std::vector<GLuint> shaderList;
+
+	shaderList.push_back(Framework::LoadShader(GL_VERTEX_SHADER, "SimpleColors.vert"));
+	shaderList.push_back(Framework::LoadShader(GL_FRAGMENT_SHADER, "SimpleColors.frag"));
+
+	theProgram = Framework::CreateProgram(shaderList);
+
+	positionAttrib = glGetAttribLocation(theProgram, "position");
+	colorAttrib = glGetAttribLocation(theProgram, "color");
+
+	offsetUniform = glGetUniformLocation(theProgram, "offset");
+}
+
+const float vertexData[] = {
+	 0.25f,  0.25f, 0.75f, 1.0f,
+	 0.25f, -0.25f, 0.75f, 1.0f,
+	-0.25f,  0.25f, 0.75f, 1.0f,
+
+	 0.25f, -0.25f, 0.75f, 1.0f,
+	-0.25f, -0.25f, 0.75f, 1.0f,
+	-0.25f,  0.25f, 0.75f, 1.0f,
+
+	 0.25f,  0.25f, -0.75f, 1.0f,
+	-0.25f,  0.25f, -0.75f, 1.0f,
+	 0.25f, -0.25f, -0.75f, 1.0f,
+
+	 0.25f, -0.25f, -0.75f, 1.0f,
+	-0.25f,  0.25f, -0.75f, 1.0f,
+	-0.25f, -0.25f, -0.75f, 1.0f,
+
+	-0.25f,  0.25f,  0.75f, 1.0f,
+	-0.25f, -0.25f,  0.75f, 1.0f,
+	-0.25f, -0.25f, -0.75f, 1.0f,
+
+	-0.25f,  0.25f,  0.75f, 1.0f,
+	-0.25f, -0.25f, -0.75f, 1.0f,
+	-0.25f,  0.25f, -0.75f, 1.0f,
+
+	 0.25f,  0.25f,  0.75f, 1.0f,
+	 0.25f, -0.25f, -0.75f, 1.0f,
+	 0.25f, -0.25f,  0.75f, 1.0f,
+
+	 0.25f,  0.25f,  0.75f, 1.0f,
+	 0.25f,  0.25f, -0.75f, 1.0f,
+	 0.25f, -0.25f, -0.75f, 1.0f,
+
+	 0.25f,  0.25f, -0.75f, 1.0f,
+	 0.25f,  0.25f,  0.75f, 1.0f,
+	-0.25f,  0.25f,  0.75f, 1.0f,
+
+	 0.25f,  0.25f, -0.75f, 1.0f,
+	-0.25f,  0.25f,  0.75f, 1.0f,
+	-0.25f,  0.25f, -0.75f, 1.0f,
+
+	 0.25f, -0.25f, -0.75f, 1.0f,
+	-0.25f, -0.25f,  0.75f, 1.0f,
+	 0.25f, -0.25f,  0.75f, 1.0f,
+
+	 0.25f, -0.25f, -0.75f, 1.0f,
+	-0.25f, -0.25f, -0.75f, 1.0f,
+	-0.25f, -0.25f,  0.75f, 1.0f,
+
+
+
+
+	0.0f, 0.0f, 1.0f, 1.0f,
+	0.0f, 0.0f, 1.0f, 1.0f,
+	0.0f, 0.0f, 1.0f, 1.0f,
+
+	0.0f, 0.0f, 1.0f, 1.0f,
+	0.0f, 0.0f, 1.0f, 1.0f,
+	0.0f, 0.0f, 1.0f, 1.0f,
+
+	0.8f, 0.8f, 0.8f, 1.0f,
+	0.8f, 0.8f, 0.8f, 1.0f,
+	0.8f, 0.8f, 0.8f, 1.0f,
+
+	0.8f, 0.8f, 0.8f, 1.0f,
+	0.8f, 0.8f, 0.8f, 1.0f,
+	0.8f, 0.8f, 0.8f, 1.0f,
+
+	0.0f, 1.0f, 0.0f, 1.0f,
+	0.0f, 1.0f, 0.0f, 1.0f,
+	0.0f, 1.0f, 0.0f, 1.0f,
+
+	0.0f, 1.0f, 0.0f, 1.0f,
+	0.0f, 1.0f, 0.0f, 1.0f,
+	0.0f, 1.0f, 0.0f, 1.0f,
+
+	0.5f, 0.5f, 0.0f, 1.0f,
+	0.5f, 0.5f, 0.0f, 1.0f,
+	0.5f, 0.5f, 0.0f, 1.0f,
+
+	0.5f, 0.5f, 0.0f, 1.0f,
+	0.5f, 0.5f, 0.0f, 1.0f,
+	0.5f, 0.5f, 0.0f, 1.0f,
+
+	1.0f, 0.0f, 0.0f, 1.0f,
+	1.0f, 0.0f, 0.0f, 1.0f,
+	1.0f, 0.0f, 0.0f, 1.0f,
+
+	1.0f, 0.0f, 0.0f, 1.0f,
+	1.0f, 0.0f, 0.0f, 1.0f,
+	1.0f, 0.0f, 0.0f, 1.0f,
+
+	0.0f, 1.0f, 1.0f, 1.0f,
+	0.0f, 1.0f, 1.0f, 1.0f,
+	0.0f, 1.0f, 1.0f, 1.0f,
+
+	0.0f, 1.0f, 1.0f, 1.0f,
+	0.0f, 1.0f, 1.0f, 1.0f,
+	0.0f, 1.0f, 1.0f, 1.0f,
+
+};
+
+GLuint vertexBufferObject;
+GLuint vao;
+
+
+void InitializeVertexBuffer()
+{
+	glGenBuffers(1, &vertexBufferObject);
+
+	glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject);
+	glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STREAM_DRAW);
+	glBindBuffer(GL_ARRAY_BUFFER, 0);
+}
+
+//Called after the window and OpenGL are initialized. Called exactly once, before the main loop.
+void init()
+{
+	InitializeProgram();
+	InitializeVertexBuffer();
+
+	glGenVertexArrays(1, &vao);
+	glBindVertexArray(vao);
+
+	glEnable(GL_CULL_FACE);
+	glCullFace(GL_BACK);
+	glFrontFace(GL_CW);
+}
+
+//Called to update the display.
+//You should call glutSwapBuffers after all of your rendering to display what you rendered.
+//If you need continuous updates of the screen, call glutPostRedisplay() at the end of the function.
+void display()
+{
+	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+	glClear(GL_COLOR_BUFFER_BIT);
+
+	glUseProgram(theProgram);
+
+	glUniform2f(offsetUniform, 0.5f, 0.25f);
+
+	size_t colorData = sizeof(vertexData) / 2;
+	glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject);
+	glEnableVertexAttribArray(positionAttrib);
+	glEnableVertexAttribArray(colorAttrib);
+	glVertexAttribPointer(positionAttrib, 4, GL_FLOAT, GL_FALSE, 0, 0);
+	glVertexAttribPointer(colorAttrib, 4, GL_FLOAT, GL_FALSE, 0, (void*)colorData);
+
+	glDrawArrays(GL_TRIANGLES, 0, 36);
+
+	glDisableVertexAttribArray(positionAttrib);
+	glDisableVertexAttribArray(colorAttrib);
+	glUseProgram(0);
+
+	glutSwapBuffers();
+	glutPostRedisplay();
+}
+
+//Called whenever the window is resized. The new window size is given, in pixels.
+//This is an opportunity to call glViewport or glScissor to keep up with the change in size.
+void reshape (int w, int h)
+{
+	glViewport(0, 0, (GLsizei) w, (GLsizei) h);
+}
+
+//Called whenever a key on the keyboard was pressed.
+//The key is given by the ''key'' parameter, which is in ASCII.
+//It's often a good idea to have the escape key (ASCII value 27) call glutLeaveMainLoop() to 
+//exit the program.
+void keyboard(unsigned char key, int x, int y)
+{
+	switch (key)
+	{
+	case 27:
+		glutLeaveMainLoop();
+		break;
+	}
+}
+
+