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; }
#version 330 smooth in vec4 vColor; out vec4 outputColor; void main() { outputColor =vColor; }
#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; }
原文:http://blog.csdn.net/lelieven/article/details/19242955