agep110
پنج شنبه 30 خرداد 1392, 14:56 عصر
این همه کد هایی که نوشتم: 
#include <GL\glew.h>
#include <GL\freeglut.h>
#include <vector>
#include <iostream>
GLfloat vertexData[]={
	 0.25f,  0.25f, -1.25f, 1.0f,
     0.25f, -0.25f, -1.25f, 1.0f,
    -0.25f,  0.25f, -1.25f, 1.0f,
     0.25f, -0.25f, -1.25f, 1.0f,
    -0.25f, -0.25f, -1.25f, 1.0f,
    -0.25f,  0.25f, -1.25f, 1.0f,
     0.25f,  0.25f, -2.75f, 1.0f,
    -0.25f,  0.25f, -2.75f, 1.0f,
     0.25f, -0.25f, -2.75f, 1.0f,
     0.25f, -0.25f, -2.75f, 1.0f,
    -0.25f,  0.25f, -2.75f, 1.0f,
    -0.25f, -0.25f, -2.75f, 1.0f,
    -0.25f,  0.25f, -1.25f, 1.0f,
    -0.25f, -0.25f, -1.25f, 1.0f,
    -0.25f, -0.25f, -2.75f, 1.0f,
    -0.25f,  0.25f, -1.25f, 1.0f,
    -0.25f, -0.25f, -2.75f, 1.0f,
    -0.25f,  0.25f, -2.75f, 1.0f,
     0.25f,  0.25f, -1.25f, 1.0f,
     0.25f, -0.25f, -2.75f, 1.0f,
     0.25f, -0.25f, -1.25f, 1.0f,
     0.25f,  0.25f, -1.25f, 1.0f,
     0.25f,  0.25f, -2.75f, 1.0f,
     0.25f, -0.25f, -2.75f, 1.0f,
     0.25f,  0.25f, -2.75f, 1.0f,
     0.25f,  0.25f, -1.25f, 1.0f,
    -0.25f,  0.25f, -1.25f, 1.0f,
     0.25f,  0.25f, -2.75f, 1.0f,
    -0.25f,  0.25f, -1.25f, 1.0f,
    -0.25f,  0.25f, -2.75f, 1.0f,
     0.25f, -0.25f, -2.75f, 1.0f,
    -0.25f, -0.25f, -1.25f, 1.0f,
     0.25f, -0.25f, -1.25f, 1.0f,
     0.25f, -0.25f, -2.75f, 1.0f,
    -0.25f, -0.25f, -2.75f, 1.0f,
    -0.25f, -0.25f, -1.25f, 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;
const char *vertexShader ="		\n\
#version 330						\n\
									\n\
layout (location = 0) in vec4 position;\n\
layout (location = 1) in vec4 color;\n\
\n\
smooth out vec4 vertexColor;\n\
\n\
uniform vec2 offset;\n\
uniform mat4 perspectiveMatrix;\n\
void main()\n\
{\n\
	vec4 camPos = position + vec4(offset.x, offset.y, 0.0, 0.0);\n\
	gl_Position = perspectiveMatrix * camPos;\n\
	vertexColor = color;\n\
}";
const char *fragmentShader ="\n\
#version 330\n\
\n\
out vec4 fragColor;\n\
smooth in vec4 vertexColor;\n\
\n\
void main()\n\
{\n\
	fragColor = vertexColor;\n\
}";
GLuint offsetUnif;
void createVertexBufferObject()
{
	glGenBuffers(1, &vertexBufferObject);
	glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject);
	glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STREAM_DRAW);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);
    glFrontFace(GL_CW);
}
GLuint createShader(GLenum shaderType, const std::string shaderFile)
{
	GLuint shader = glCreateShader(shaderType);
	const GLchar *shaderData = shaderFile.c_str();
	glShaderSource(shader, 1, &shaderData, NULL);
	glCompileShader(shader);
	GLint shaderStatus;
	glGetShaderiv(shader, GL_COMPILE_STATUS, &shaderStatus);
	if (shaderStatus == GL_FALSE)
	{
		GLint shaderInfoLogLenght;
		glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &shaderInfoLogLenght);
		GLchar *shaderInfoLog = new GLchar[shaderInfoLogLenght + 1];
		glGetShaderInfoLog(shader, sizeof(shaderInfoLogLenght), NULL, shaderInfoLog);
		GLchar *shaderTypeLog = NULL;
		switch (shaderType)
		{
		case GL_VERTEX_SHADER: shaderTypeLog = "Vertex"; break;
		case GL_FRAGMENT_SHADER: shaderTypeLog = "Fragment"; break;
		case GL_GEOMETRY_SHADER: shaderTypeLog = "Geometry"; break;
		}
		fprintf(stderr, "error on shader: %s\n", shaderTypeLog, shaderInfoLog);
		delete[] shaderInfoLog;
	}
	return shader;
}
GLuint createProgram(const std::vector<GLint> shaderList)
{
	GLuint program = glCreateProgram();
	for (GLuint i = 0; i < shaderList.size(); i++)
	{
		glAttachShader(program, shaderList[i]);
	}
	glLinkProgram(program);
	GLint programStatus;
	glGetProgramiv(program, GL_LINK_STATUS, &programStatus);
	if (programStatus == GL_FALSE)
	{
		GLint programInfoLogLenght;
		glGetProgramiv(program, GL_INFO_LOG_LENGTH, &programInfoLogLenght);
		GLchar *programInfoLog = new GLchar[programInfoLogLenght + 1];
		glGetProgramInfoLog(program, programInfoLogLenght, NULL, programInfoLog);
		fprintf(stderr, "Program link Failur:\n %s", programInfoLog);
		delete[] programInfoLog;
	}
	for (GLuint i = 0; i < shaderList.size(); i++)
	{
		glDetachShader(program, shaderList[i]);
	}
	glUseProgram(program);
	return program;
}
float thePerspectiveMatrix[16];
float fFrustumScale = 1.0f;
GLuint perspectiveMatrixUinf;
void BuildProgram()
{
	std::vector<GLint> shaderList;
	shaderList.push_back(createShader(GL_VERTEX_SHADER , vertexShader));
	shaderList.push_back(createShader(GL_FRAGMENT_SHAD ER, fragmentShader));
	createProgram(shaderList);
	GLuint theProgram = createProgram(shaderList);
	offsetUnif = glGetUniformLocation(theProgram, "offset");
	
	perspectiveMatrixUinf = glGetUniformLocation(theProgram, "perspectiveMatrix");
	float fzNear = 0.5f, fzFar = 2.76;
	memset(thePerspectiveMatrix, 0, sizeof(float) * 16);
	thePerspectiveMatrix[0] = fFrustumScale;
	thePerspectiveMatrix[5] = fFrustumScale;
	thePerspectiveMatrix[10] = (fzFar + fzNear) / (fzNear - fzFar);
	thePerspectiveMatrix[14] = (2 * fzFar * fzNear) / (fzNear - fzFar);
	thePerspectiveMatrix[11] = -1.0f;
	glUniformMatrix4fv(perspectiveMatrixUinf, 1, GL_FALSE, thePerspectiveMatrix);
	for (GLuint i = 0; i < shaderList.size(); i++)
	{
		glDeleteShader(shaderList[i]);
	}
}
void renderScene()
{
	glClearColor(0.0, 0.0, 0.0, 0.0);
	glClear(GL_COLOR_BUFFER_BIT);
	glUniform2f(offsetUnif, 0.5f, 0.5f);
	glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject);
	glEnableVertexAttribArray(0);
	glEnableVertexAttribArray(1);
	glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
	glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (void*)(sizeof(vertexData) / 2));
	glDrawArrays(GL_TRIANGLES, 0, 36);
	glDisableVertexAttribArray(0);
	glDisableVertexAttribArray(1);
	glutSwapBuffers();
	glutPostRedisplay();
}
void reshap(int w, int h)
{
	thePerspectiveMatrix[0] = fFrustumScale / (w / (float)h);
    thePerspectiveMatrix[5] = fFrustumScale;
    glUniformMatrix4fv(perspectiveMatrixUinf, 1, GL_FALSE, thePerspectiveMatrix);
    glViewport(0, 0, (GLsizei) w, (GLsizei) h);
}
int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GL_DOUBLE | GL_RGB);
	glutInitWindowSize(500, 500);
	glutInitWindowPosition(100, 100);
	glutCreateWindow("Legend");
	if (glewInit() != GLEW_OK)
	{
		fprintf(stderr, "Error On Load GLEW: %s\n", glewGetErrorString(glewInit()));
		return 1;
	}
	createVertexBufferObject();
	BuildProgram();
	glutReshapeFunc(reshap);
	glutDisplayFunc(renderScene);
	glutMainLoop();
	return 0;
}
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.