GLSL 透视变换(着色器实现C语言)
来源:互联网 发布:三盛网络机柜 编辑:程序博客网 时间:2024/06/09 16:14
shader
perspective.vert
#version 330layout(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 330smooth 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退出.
0 0
- GLSL 透视变换(着色器实现C语言)
- glsl着色器(c语言)
- GLSL(着色器语言)
- GLSL透视矩阵(C语言)
- WebGL 着色器语言(GLSL ES)
- OpenGL 着色器语言GLSL的数据类型
- OpenGLES2.0着色器语言glsl
- OpenGLES2.0着色器语言glsl
- OpenGL着色语言GLSL
- OpenGL着色语言GLSL
- GLSL变换颜色的三角形(C语言)
- 【OpenGL ES】着色语言GLSL
- 砖块着色器详解(GLSL版本)
- 着色器glsl
- glsl 细分着色器
- 07 WebGL 着色器编程语言GLSL ES的取样器(纹理)
- Android OpenGLES2.0(七)——着色器语言GLSL
- OpenGLES Android篇零基础系列(五):GLSL着色器语言
- [Leetcode] Copy List with Random Pointer (Java)
- IOS 基础知识 2
- TCP流重组数据包分析
- ANS1 基础知识 1
- NYOJ 252 01串
- GLSL 透视变换(着色器实现C语言)
- 《重构》——如何如何改善代码 .
- hdu——2079——选课时间(题目已修改,注意读题)
- 关于Delphi XE DataSnap心跳包
- 算法之旅,直奔排序 基数排序
- 面试题 spring最主要的核心
- ASN1 基础知识3
- 关于rs.next()问题
- java 高级工程师 笔试题