GLSL 绘制入门
来源:互联网 发布:皮格马利翁效应 知乎 编辑:程序博客网 时间:2024/05/17 05:36
// GLSL01.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <GL/glew.h>#include <GL/glut.h>#include <cassert>using namespace std;static const int g_timer_id = 0;static const int g_time_per_frame = 16;//ms#define OFFSET_MEMBER(s, m) (size_t)&(((s*)0)->m)//vertex 3 float//color 3 byte//texture 2 floatstruct VF3_CB3_TF2{GLfloat m_vertex[3];GLubyte m_color[3];GLfloat m_texture[2];};typedef struct _VF3_CB3_TF2_Quad{VF3_CB3_TF2 tl;//top leftVF3_CB3_TF2 bl;//bottom leftVF3_CB3_TF2 tr;//top rightVF3_CB3_TF2 br;//bottom right} VF3_CB3_TF2_Quad;static GLuint g_program = 0;static GLuint g_vertex_shader = 0;static GLuint g_frag_shader = 0;enum {eVertex = 0,eColor,eTexture,};static const char *attrib_vertex_name = "a_vertex";static const char *attrib_color_name = "a_color";static const char *attrib_texture_name = "a_texture";static const GLchar *vertex_source ="\n" "attribute vec4 a_vertex;\n" "attribute vec4 a_color;\n" "attribute vec2 a_texture;\n""varying vec4 v_color;\n""\n""void main(void) {\n""gl_Position = gl_ModelViewProjectionMatrix * a_vertex; \n""gl_Color = a_color;\n""v_color = a_color;\n""}\n""//END";static const GLchar *frag_source ="varying vec4 v_color;\n""void main(void){\n""gl_FragColor = v_color;\n""}\n""//END";//---------------------------------------------------------------------------------------------------------------------void initShader();void render();void initQuadWithData(float top, float left, float width,float height, VF3_CB3_TF2_Quad& quad);/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void init(){glClearColor(1.0f, 1.0f, 1.0f, 1.0f);glClearDepth(1.0f);glShadeModel(GL_SMOOTH);}void initQuadWithData( float top, float left, float width,float height,VF3_CB3_TF2_Quad& quad){memset(&quad, 0, sizeof(VF3_CB3_TF2_Quad));//坐标quad.tl.m_vertex[0] = left;quad.tl.m_vertex[1] = top;quad.bl.m_vertex[0] = left;quad.bl.m_vertex[1] = top-height;quad.tr.m_vertex[0] = left+width;quad.tr.m_vertex[1] = top;quad.br.m_vertex[0] = left+width;quad.br.m_vertex[1] = top-height;//颜色static const GLubyte red_color[3] = {255, 0, 0};static const GLubyte green_color[3] = {0, 255, 0};static const GLubyte blue_color[3] = {0,0,255};static const GLubyte white_color[3] = {255,255,255};memcpy(&quad.tl.m_color,blue_color, sizeof(GLubyte)*3);// memcpy(&quad.bl.m_color,white_color, sizeof(GLubyte)*3);// memcpy(&quad.tr.m_color,white_color, sizeof(GLubyte)*3);memcpy(&quad.br.m_color,red_color, sizeof(GLbyte)*3);//printf("initialize data...\n");}void render(){// glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);// //glColor3f(0,0,0.5f);// glBegin(GL_TRIANGLE_STRIP);// //glRectf(-.5, .5, .5, -.5);// // glColor3f(0,0,1.0f); //blue// glVertex2f(-0.5, 0.5);// // glColor3f(0,0,0);// glVertex2f(-0.5, -0.5);// // glColor3f(0,0,0);// glVertex2f(0.5f, 0.5f);// // glColor3f(1.0f, 0, 0);// glVertex2f(0.5f, -0.5f);// // glEnd();// glutSwapBuffers(); glEnableVertexAttribArray(eVertex); glEnableVertexAttribArray(eColor); glUseProgram(g_program); VF3_CB3_TF2_Quad quad; initQuadWithData(2.0f, -2.0f, 4.0f, 4.0f, quad); size_t offset = 0; offset = OFFSET_MEMBER(VF3_CB3_TF2, m_vertex); glVertexAttribPointer(eVertex, 3, GL_FLOAT, GL_FALSE, sizeof(VF3_CB3_TF2), (GLvoid*)((char*)&quad+offset)); offset = OFFSET_MEMBER(VF3_CB3_TF2, m_color); glVertexAttribPointer(eColor, 3, GL_UNSIGNED_BYTE, GL_FALSE, sizeof(VF3_CB3_TF2), (GLvoid*)((char*)&quad+offset)); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDisableVertexAttribArray(eVertex); glDisableVertexAttribArray(eColor); glutSwapBuffers();}void reshape(int w, int h){glViewport(0, 0, w, h);double factor = (w*1.0)/h;glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60, factor, 1, 100);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(0,0, 5, 0,0,0, 0,1,0);}void idle(){}void initShader(){const GLchar* vertexSource[] = {vertex_source};const GLchar* fragSource[] = {frag_source};g_program = glCreateProgram();GLenum err = glGetError();if (err){printf("error code = %d\n",err);}g_vertex_shader = glCreateShader(GL_VERTEX_SHADER);g_frag_shader = glCreateShader(GL_FRAGMENT_SHADER);assert(g_program || g_vertex_shader || g_frag_shader);glShaderSource(g_vertex_shader,1, vertexSource, 0);glShaderSource(g_frag_shader, 1, fragSource, 0);glCompileShader(g_vertex_shader);glCompileShader(g_frag_shader);GLint status = 0;glGetShaderiv(g_vertex_shader, GL_COMPILE_STATUS, &status);//assert(status);if (!status){GLsizei length = 0, written=0;glGetShaderiv(g_vertex_shader, GL_INFO_LOG_LENGTH, &length);GLchar* src = (GLchar*)malloc(length+1);memset(src, 0, (length+1));glGetShaderInfoLog(g_vertex_shader, length, &written, src);printf("%s", src);free(src);return;}glGetShaderiv(g_frag_shader, GL_COMPILE_STATUS, &status);//assert(status);if (!status){GLsizei length = 0, written=0;glGetShaderiv(g_vertex_shader, GL_INFO_LOG_LENGTH, &length);GLchar* src = (GLchar*)malloc(length+1);memset(src, 0, (length+1));glGetShaderInfoLog(g_vertex_shader, length, &written, src);printf("%s", src);free(src);return;}glAttachShader(g_program, g_vertex_shader);glAttachShader(g_program, g_frag_shader);glBindAttribLocation(g_program,eVertex,attrib_vertex_name);glBindAttribLocation(g_program,eColor, attrib_color_name);glBindAttribLocation(g_program,eTexture,attrib_texture_name);glLinkProgram(g_program);glGetProgramiv(g_program, GL_LINK_STATUS,&status);if(!status){GLsizei bufSize = 0;glGetProgramiv(g_program,GL_INFO_LOG_LENGTH, &bufSize);GLchar* infoLog =(GLchar*) malloc(bufSize);glGetProgramInfoLog(g_program,bufSize, 0, infoLog);printf("link error:\n%s",infoLog);return;}printf("program compile and link success~\n");}void timer(int value){if (value != g_timer_id)return;glutPostRedisplay();glutTimerFunc(g_time_per_frame, timer, g_timer_id);}int _tmain(int argc, _TCHAR* argv[]){glutInit(&argc, argv);//在窗口创建之前,必须要首先初始化显示模式glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE);glutCreateWindow("GLSL");glutInitWindowPosition(400, 200);glutInitWindowSize(600, 600);if(glewInit() != GLEW_NO_ERROR)return -1;init();initShader();glutDisplayFunc(render);glutReshapeFunc(reshape);glutIdleFunc(idle);glutTimerFunc(g_time_per_frame,timer,g_timer_id);glutMainLoop();return 0;}
1 0
- GLSL 绘制入门
- GLSL 绘制管线
- glsl绘制Bezier曲线
- 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形
- GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形
- 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形
- 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形
- 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形
- 《GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形》的正确版本及源代码
- 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形
- OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形
- GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形
- GLSL入门资料
- GLSL绘制流程的粗浅理解
- 基于GLSL的聚光灯效果的绘制
- OpenGL进阶(八) - GLSL入门
- OpenGL进阶(八) - GLSL入门
- GLSL入门源码(1)
- 三星Note2 行货 水货 型号版本
- 使用FileSystem以标准输出格式显示HDFS当中的文件
- 封装ghost
- hdu-1870-愚人节的礼物
- session和cookie的一些理解
- GLSL 绘制入门
- vim 取消 查找 高亮
- android源码下载 win7
- 顺序表查找(顺序查找、二分查找) C语言实现
- Nutch-2.2.1学习之六以伪分布模式运行Nutch
- PHP SOAP 使用示例
- 黑马程序员—集合将自定义对象作为元素存储到ArrayList集合中,并去除重复元素。 比如:存人对象。同姓名同年龄,视为同一个人,为重复元素。
- 埃洛普出局?微软董事会称Mulally、Satya有望是下任CEO
- Core Animation