shader
perspective.vert
#version 330
layout(location =0) in vec4 vertexPosition;
layout(location =1) in vec4 vertexColor;
smooth out vec4 vColor;
uniform vec2 offset;
uniform float zNear;
uniform float zFar;
uniform float frustumScale;
void main()
{
vec4 cameraPosition =vertexPosition +vec4(offset.x, offset.y, 0.0, 0.0);
vec4 clipPosition;
clipPosition.xy =cameraPosition.xy *frustumScale;
clipPosition.z =cameraPosition.z*(zNear +zFar)/(zNear -zFar);
clipPosition.z +=2 *zNear*zFar /(zNear -zFar);
clipPosition.w =-cameraPosition.z;
gl_Position =clipPosition;
vColor =vertexColor;
}
perspective.frag
#version 330
smooth in vec4 vColor;
out vec4 outputColor;
void main()
{
outputColor =vColor;
}
perspective.c
#include <stdio.h>
#include <stdlib.h>
#include <GL/glew.h>
#include "readtext.h"
#ifdef _APPLE_
#include <glut/glut.h>
#else
#define FREEGLUT_STATIC
#include <GL/glut.h>
#endif
#pragma comment(lib, "readtext.lib")
#pragma comment(lib, "glew32.lib")
GLuint vShader, fShader, programHandle;
GLint vaoHandle, vboHandles[2], positionBufferHandle, colorBufferHandle;
GLuint offsetLocation, zNearLocation, zFarLocation, frustumLocation;
//
///
int infoLogLength =0;
int charWritten =0;
char *infoLog;
///
/
float positionData[] ={
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};
float colorData[] ={
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};
void SetupShader()
{
char *renderer;
char *vender;
char *version;
char *glslVersion;
//
char *vs, *fs;
char *vv, *ff;
//
renderer =glGetString(GL_RENDERER);
vender =glGetString(GL_VENDOR);
version =glGetString(GL_VERSION);
glslVersion =glGetString(GL_SHADING_LANGUAGE_VERSION);
printf("*****************************************************\n");
printf("graphic card:\t%s \n", renderer);
printf("graphic company:\t%s \n", vender);
printf("openGL version:\t%s \n", version);
printf("GLSL version:\t %s \n", glslVersion);
printf("*****************************************************\n");
///
vShader =glCreateShader(GL_VERTEX_SHADER);
vs =readText("shader/perspective.vert");
//printf("%s\n",vs);
vv =vs;
if(vShader ==0)
{
printf("Error: fail to create shader!");
exit(1);
}
glShaderSource(vShader, 1, &vv, NULL);
glCompileShader(vShader);
free(vs);
glGetShaderiv(vShader, GL_INFO_LOG_LENGTH, &infoLogLength);
if(infoLogLength >0)
{
infoLog =(char *)malloc(infoLogLength);
glGetShaderInfoLog(vShader, infoLogLength, &charWritten, infoLog);
printf("%s\n",infoLog);
printf("********************************************************************\n");
free(infoLog);
}
///
fShader =glCreateShader(GL_FRAGMENT_SHADER);
if(fShader ==0)
{
printf("can't create fragment shader! \n");
exit(1);
}
fs =readText("shader/perspective.frag");
//printf("%s \n",fs);
ff= fs;
glShaderSource(fShader, 1, &ff, NULL);
glCompileShader(fShader);
free(fs);
glGetShaderiv(fShader, GL_INFO_LOG_LENGTH, &infoLogLength);
if(infoLogLength >0)
{
infoLog =(char *)malloc(infoLogLength);
glGetShaderInfoLog(fShader, infoLogLength, &charWritten, infoLog);
charWritten is
printf("%s \n",infoLog);
printf("*********************************************************\n");
free(infoLog);
}
///
programHandle =glCreateProgram();
glAttachShader(programHandle, vShader);
glAttachShader(programHandle, fShader);
glLinkProgram(programHandle);
glUseProgram(programHandle);
glGetProgramiv(programHandle, GL_INFO_LOG_LENGTH, &infoLogLength);
if(infoLogLength >0)
{
infoLog =(char *)malloc(infoLogLength);
glGetProgramInfoLog(programHandle, infoLogLength, &charWritten, infoLog);
printf("%s \n", infoLog);
printf("*********************************************************\n");
free(infoLog);
}
}
void InitVBO()
{
glGenBuffers(2, vboHandles);
positionBufferHandle =vboHandles[0];
colorBufferHandle =vboHandles[1];
///
glBindBuffer(GL_ARRAY_BUFFER, positionBufferHandle);
glBufferData(GL_ARRAY_BUFFER, sizeof(positionData), positionData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, colorBufferHandle);
glBufferData(GL_ARRAY_BUFFER, sizeof(colorData), colorData, GL_STATIC_DRAW);
/
glGenVertexArrays(1, &vaoHandle);
glBindVertexArray(vaoHandle);
//
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, positionBufferHandle);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, colorBufferHandle);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, NULL);
}
///
void SetupRC()
{
glewInit();
SetupShader();
InitVBO();
glClearColor(1.0, 0.0, 0.0, 1.0);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glFrontFace(GL_CW);
}
void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(programHandle);
offsetLocation =glGetUniformLocation(programHandle, "offset");
zNearLocation =glGetUniformLocation(programHandle, "zNear");
zFarLocation =glGetUniformLocation(programHandle, "zFar");
frustumLocation =glGetUniformLocation(programHandle, "frustumScale");
glUniform2f(offsetLocation, 0.5, 0.5);
glUniform1f(zNearLocation, 1.0f);
glUniform1f(zFarLocation, 3.0f);
glUniform1f(frustumLocation, 1.0f);
glBindVertexArray(vaoHandle);
glDrawArrays(GL_TRIANGLES, 0, 36);
glBindVertexArray(0);
glutSwapBuffers();
glutPostRedisplay();
}
void keyBoard(unsigned char key, int x, int y)
{
if(key ==GLUT_KEY_F1)
exit(0);
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE |GLUT_RGBA |GLUT_DEPTH);
glutInitWindowSize(800, 600);
glutInitWindowPosition(0, 0);
glutCreateWindow("fourth :perspective ");
SetupRC();
glutDisplayFunc(RenderScene);
glutSpecialFunc(keyBoard);
glutMainLoop();
return 0;
}
按F1退出.