agep110
پنج شنبه 30 خرداد 1392, 13: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.