basic.vert
#version 400
layout(location =0) in vec3 VertexPosition;
layout(location =1) in vec3 VertexColor;
out vec3 Color;
uniform mat4 Matrix;
void main()
{
Color= VertexColor;
gl_Position= Matrix *vec4(VertexPosition,1.0);
}
basic.frag
#version 400
in vec3 Color;
out vec4 FragColor;
void main()
{
FragColor = vec4(Color,1.0);
}
主程序main.c
#include
#include
#include
#include "readtext.h" #ifdef __APPLE__ #include
#else #define FREEGLUT_STATIC #include
#endif #pragma comment(lib,"../readtext.lib") #pragma comment(lib,"../glew32.lib") GLuint vShader, fShader,programHandle; int infologLength = 0; int charsWritten = 0; char *infoLog; //顶点位置数组 float positionData[] = { -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f}; //颜色数组 float colorData[] = { 0.2f, 0.8f, 0.0f, 0.4f, 0.6f, 0.0f, 0.1f, 0.9f, 1.0f }; float matrix[16]; matrix[16] ={0.5 , 0.0, -0.866, 0.0, 0.0, 1.0, 0.0, 0.0, 0.866 , 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 1.0 }; /////////////////变换矩阵 ///////////////////////////////////////////////////// // cos(angle), 0, -sin(angle), //列向量 //0, 1, 0, //sin(angle), 0,cos(angle) // GLint matrixLocation; GLuint vaoHandle;//vertex array object void initShader() { char *renderer, *vender, *version, *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("%s \n", renderer); printf("%s \n", vender); printf("%s \n", version); printf("%s \n", glslVersion); //着色器处理 vShader= glCreateShader(GL_VERTEX_SHADER); vs=readText("../basic.vert"); printf("%s\n", vs); if(vShader ==0) { printf("fail to creat vertex shader"); exit(1); } //将源代码与着色器相关联 vv =vs; 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, &charsWritten, infoLog); printf("%s\n",infoLog); free(infoLog); } ////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////// fShader = glCreateShader(GL_FRAGMENT_SHADER); if(fShader ==0) { printf("fail to creat shader\n"); exit(1); } fs= readText("../basic.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, &charsWritten, infoLog); printf("%s\n",infoLog); free(infoLog); } ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////// //创建程序对象 programHandle= glCreateProgram(); glAttachShader(programHandle, vShader); glAttachShader(programHandle, fShader); glLinkProgram(programHandle); glGetProgramiv(programHandle, GL_INFO_LOG_LENGTH,&infologLength); if (infologLength > 0) { infoLog = (char *)malloc(infologLength); glGetProgramInfoLog(programHandle, infologLength