glsl glDrawElements实例(C语言)

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;
}


显示图形如下:



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值