depth.vert;
#version 330
layout(location =0) in vec3 vertexPosition;
layout(location =1) in vec4 vertexColor;
smooth out vec4 theColor;
uniform vec3 offset;
uniform mat4 perspectiveMatrix;
void main()
{
vec4 cameraPosition =vec4(vertexPosition, 1.0) +vec4(offset.x, offset.y, offset.z, 0.0);
gl_Position =perspectiveMatrix *cameraPosition;
theColor =vertexColor;
}
depth.frag
#version 330
smooth in vec4 theColor;
out vec4 outputColor;
void main()
{
outputColor =theColor;
}
depth.c
/
#include <stdio.h>
#include <stdlib.h>
#include <GL/glew.h>
#include "readtext.h"
#include "vmath.h"
#ifdef _APPLE_
#include <glut/glut.h>
#else
#define FREEGLUT_STATIC
#include <GL/glut.h>
#endif
#pragma comment(lib, "readtext.lib")
#pragma comment(lib, "vmath.lib")
#define ARRAY_COUNT( array ) (sizeof( array ) / (sizeof( array[0] ) * (sizeof( array ) != sizeof(void*) || sizeof( array[0] ) <= sizeof(void*))))
int i;
GLuint vShader, fShader, programHandle;
GLuint vaoHandles[2], vboHandles[2];
GLuint positionBufferHandle, colorBufferHandle, bufferHandle, indexBufferHandle;//顶点缓冲对象
GLuint vaoObject1, vaoObject2; //顶点数组对象
Matrix44f M; //投影矩阵
GLuint offsetUniformLocation;
GLuint perspectiveMatrixUniformLocation;
size_t colorDataOffset, positionDataOffset;
//
//
int infoLogLength =0;
int charWritten =0;
char *infoLog;
/
#define RIGHT_EXTENT 0.8f
#define LEFT_EXTENT -RIGHT_EXTENT
#define TOP_EXTENT 0.20f
#define MIDDLE_EXTENT 0.0f
#define BOTTOM_EXTENT -TOP_EXTENT
#define FRONT_EXTENT -1.25f
#define REAR_EXTENT -1.75f
#define GREEN_COLOR 0.75f, 0.75f, 1.0f, 1.0f
#define BLUE_COLOR 0.0f, 0.5f, 0.0f, 1.0f
#define RED_COLOR 1.0f, 0.0f, 0.0f, 1.0f
#define GREY_COLOR 0.8f, 0.8f, 0.8f, 1.0f
#define BROWN_COLOR 0.5f, 0.5f, 0.0f, 1.0f
float vertexData[] ={
//Object 1 positions
LEFT_EXTENT, TOP_EXTENT, REAR_EXTENT,
LEFT_EXTENT, MIDDLE_EXTENT, FRONT_EXTENT,
RIGHT_EXTENT, MIDDLE_EXTENT, FRONT_EXTENT,
RIGHT_EXTENT, TOP_EXTENT, REAR_EXTENT,
LEFT_EXTENT, BOTTOM_EXTENT, REAR_EXTENT,
LEFT_EXTENT, MIDDLE_EXTENT, FRONT_EXTENT,
RIGHT_EXTENT, MIDDLE_EXTENT, FRONT_EXTENT,
RIGHT_EXTENT, BOTTOM_EXTENT, REAR_EXTENT,
LEFT_EXTENT, TOP_EXTENT, REAR_EXTENT,
LEFT_EXTENT, MIDDLE_EXTENT, FRONT_EXTENT,
LEFT_EXTENT, BOTTOM_EXTENT, REAR_EXTENT,
RIGHT_EXTENT, TOP_EXTENT, REAR_EXTENT,
RIGHT_EXTENT, MIDDLE_EXTENT, FRONT_EXTENT,
RIGHT_EXTENT, BOTTOM_EXTENT, REAR_EXTENT,
LEFT_EXTENT, BOTTOM_EXTENT, REAR_EXTENT,
LEFT_EXTENT, TOP_EXTENT, REAR_EXTENT,
RIGHT_EXTENT, TOP_EXTENT, REAR_EXTENT,
RIGHT_EXTENT, BOTTOM_EXTENT, REAR_EXTENT,
//Object 2 positions
TOP_EXTENT, RIGHT_EXTENT, REAR_EXTENT,
MIDDLE_EXTENT, RIGHT_EXTENT, FRONT_EXTENT,
MIDDLE_EXTENT, LEFT_EXTENT, FRONT_EXTENT,
TOP_EXTENT, LEFT_EXTENT, REAR_EXTENT,
BOTTOM_EXTENT, RIGHT_EXTENT, REAR_EXTENT,
MIDDLE_EXTENT, RIGHT_EXTENT, FRONT_EXTENT,
MIDDLE_EXTENT, LEFT_EXTENT, FRONT_EXTENT,
BOTTOM_EXTENT, LEFT_EXTENT, REAR_EXTENT,
TOP_EXTENT, RIGHT_EXTENT, REAR_EXTENT,
MIDDLE_EXTENT, RIGHT_EXTENT, FRONT_EXTENT,
BOTTOM_EXTENT, RIGHT_EXTENT, REAR_EXTENT,
TOP_EXTENT, LEFT_EXTENT, REAR_EXTENT,
MIDDLE_EXTENT, LEFT_EXTENT, FRONT_EXTENT,
BOTTOM_EXTENT, LEFT_EXTENT, REAR_EXTENT,
BOTTOM_EXTENT, RIGHT_EXTENT, REAR_EXTENT,
TOP_EXTENT, RIGHT_EXTENT, REAR_EXTENT,
TOP_EXTENT, LEFT_EXTENT, REAR_EXTENT,
BOTTOM_EXTENT, LEFT_EXTENT, REAR_EXTENT,
//Object 1 colors
GREEN_COLOR,
GREEN_COLOR,
GREEN_COLOR,
GREEN_COLOR,
BLUE_COLOR,
BLUE_COLOR,
BLUE_COLOR,
BLUE_COLOR,
RED_COLOR,
RED_COLOR,
RED_COLOR,
GREY_COLOR,
GREY_COLOR,
GREY_COLOR,
BROWN_COLOR,
BROWN_COLOR,
BROWN_COLOR,
BROWN_COLOR,
//Object 2 colors
RED_COLOR,
RED_COLOR,
RED_COLOR,
RED_COLOR,
BROWN_COLOR,
BROWN_COLOR,
BROWN_COLOR,
BROWN_COLOR,
BLUE_COLOR,
BLUE_COLOR,
BLUE_COLOR,
GREEN_COLOR,
GREEN_COLOR,
GREEN_COLOR,
GREY_COLOR,
GREY_COLOR,
GREY_COLOR,
GREY_COLOR};
const GLuint indexData[] =
{
0, 2, 1,
3, 2, 0,
4, 5, 6,
6, 7, 4,
8, 9, 10,
11, 13, 12,
14, 16, 15,
17, 16, 14};
const int numOfVertex =36;
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/depth.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/depth.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);
bufferHandle =vboHandles[0];
indexBufferHandle =vboHandles[1];
///
glBindBuffer(GL_ARRAY_BUFFER, bufferHandle);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferHandle);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexData), indexData , GL_STATIC_DRAW );
}
void InitVAO()
{
glGenVertexArrays(2, vaoHandles); //生成两个顶点数组对象
vaoObject1 =vaoHandles[0];
vaoObject2 =vaoHandles[1];
colorDataOffset =sizeof(float)*3*numOfVertex;
//
glBindVertexArray(vaoObject1); //对象1
glEnableVertexAttribArray(0); //将顶点数组对象与缓冲对象关联起来
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, bufferHandle);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); //分布顶点数组指针
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (void *)colorDataOffset);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferHandle); // 绑定索引数组
glBindVertexArray(0);
/
glBindVertexArray(vaoObject2); //第二个对象
positionDataOffset =sizeof(float)*3*(numOfVertex/2);
colorDataOffset += sizeof(float)*4*(numOfVertex/2);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void *)positionDataOffset);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (void *)colorDataOffset);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferHandle);
glBindVertexArray(0);
}
///
void SetupRC()
{
glewInit();
SetupShader();
InitVBO();
InitVAO();
glClearColor(1.0, 1.0, 0.0, 1.0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glFrontFace(GL_CW);
}
//
//
void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT );
offsetUniformLocation =glGetUniformLocation(programHandle, "offset");
perspectiveMatrixUniformLocation =glGetUniformLocation(programHandle, "perspectiveMatrix");
perspectiveFrustum( M, -1.0, 1.0, 1.0, -1.0, 1.0, 3.0); //perspective matrix
glUniformMatrix4fv(perspectiveMatrixUniformLocation, 1, GL_TRUE, M);
glBindVertexArray(vaoObject1);
glUniform3f(offsetUniformLocation, 0.0, 0.0, 0.0);
//glDrawArrays(GL_TRIANGLES, 0, 24);
glDrawElements(GL_TRIANGLES, ARRAY_COUNT(indexData), GL_UNSIGNED_INT, 0);
glBindVertexArray(vaoObject2);
glUniform3f(offsetUniformLocation, 0.0f, 0.0f, -1.0f);
//glDrawArrays(GL_TRIANGLES, 0, 24);
glDrawElements(GL_TRIANGLES, ARRAY_COUNT(indexData), GL_UNSIGNED_INT, 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("fifth :depth ");
SetupRC();
glutDisplayFunc(RenderScene);
glutSpecialFunc(keyBoard);
glutMainLoop();
return 0;
}
显示图形如下: