OpenGL入门(二) 红宝书第一个demo代码
2018-02-06 16:56
363 查看
这个demo有点坑,代码不全,要自己写LoadShaders这部分,大致被我改成了如下
成功:
更多文章:http://blog.csdn.net/what951006
powered by:小乌龟在大乌龟背上~
#include <stdio.h> #include <string> #include <vector> #include <iostream> using namespace std; //opengl headers! #include <glew.h> #include <glut.h> #pragma comment(lib,"glew32.lib") #pragma comment(lib,"glut32.lib") //////////////////////////////////////// enum VAO_IDs { Triangles, NumVAOs }; enum Buffer_IDs { ArrayBuffer, NumBuffers }; enum Attrib_IDs { vPosition = 0 }; GLuint VAOs[NumVAOs]; GLuint Buffers[NumBuffers]; const GLuint NumVertices = 6; GLuint LoadShaders() { //generate shader names GLuint vertShader = glCreateShader(GL_VERTEX_SHADER); GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER); const char* vertShaderSrc ="#version 450 core \n layout (location = 0) in vec4 vPosition; void main(){gl_Position = vPosition;}"; const char* fragShaderSrc ="#version 450 core \n layout (location = 0) out vec4 fColor; void main(){fColor = vec4 (255, 0, 0, 255);}"; GLint result = GL_FALSE; int logLength; //compile vertex shader glShaderSource(vertShader, 1, &vertShaderSrc, NULL); glCompileShader(vertShader); glGetShaderiv(vertShader, GL_COMPILE_STATUS, &result); glGetShaderiv(vertShader, GL_INFO_LOG_LENGTH, &logLength); vector<char> vertShaderError(logLength+1); glGetShaderInfoLog(vertShader, logLength, NULL, &vertShaderError[0]); cout << &vertShaderError[0] << endl; //compile fragment shader glShaderSource(fragShader, 1, &fragShaderSrc, NULL); glCompileShader(fragShader); glGetShaderiv(fragShader, GL_COMPILE_STATUS, &result); glGetShaderiv(fragShader, GL_INFO_LOG_LENGTH, &logLength); vector<char> fragShaderError(logLength+1); glGetShaderInfoLog(fragShader, logLength, NULL, &fragShaderError[0]); cout << &fragShaderError[0] << endl; //link the program GLuint program = glCreateProgram(); glAttachShader(program, vertShader); glAttachShader(program, fragShader); glLinkProgram(program); glGetProgramiv(program, GL_LINK_STATUS, &result); glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength); vector<char> programError(logLength > 1 ? logLength : 1); glGetProgramInfoLog(program, logLength, NULL, &programError[0]); cout << &programError[0] << endl; glDeleteShader(vertShader); glDeleteShader(fragShader); return program; } #define BUFFER_OFFSET(a) ((void*)(a)) void Init() { static const GLfloat vertices[NumVertices][2] = { { -0.90, -0.90 }, // Triangle 1 { 0.85, -0.90 }, { -0.90, 0.85 }, { 0.90, -0.85 }, // Triangle 2 { 0.90, 0.90 }, { -0.85, 0.90 } }; glCreateBuffers(NumBuffers, Buffers); glNamedBufferStorage(Buffers[ArrayBuffer] , sizeof(vertices), vertices, 0); GLuint program = LoadShaders(); glUseProgram(program); glGenVertexArrays(NumVAOs, VAOs); glBindVertexArray(VAOs[Triangles]); glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]); glVertexAttribPointer(vPosition, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); glEnableVertexAttribArray(vPosition); } void display() { static const float color[] = { (float)240/255, (float)240/255, (float)240/255,1.0}; glClearBufferfv(GL_COLOR, 0, color); glBindVertexArray(VAOs[Triangles]); glDrawArrays(GL_TRIANGLES, 0, NumVertices); glutSwapBuffers(); } int _tmain(int argc, char* argv[]) { glutInit( &argc, argv ); //用于初始化GULT库 glutInitDisplayMode ( GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA ); //设置初始显示模式 glutInitWindowPosition (0,0); //确定窗口的位置 glutInitWindowSize ( 900, 500 ); //设置窗口大小 glutCreateWindow ( "OpenGlScreen" ); //创建一个窗口标题 glewInit(); const GLubyte* name = glGetString(GL_VENDOR); //返回负责当前OpenGL实现厂商的名字 const GLubyte* biaoshifu = glGetString(GL_RENDERER); //返回一个渲染器标识符,通常是个硬件平台 const GLubyte* OpenGLVersion =glGetString(GL_VERSION); //返回当前OpenGL实现的版本号 const GLubyte* gluVersion= gluGetString(GLU_VERSION); //返回当前GLU工具库版本 printf("OpenGL实现厂商的名字:%s\n", name); printf("渲染器标识符:%s\n", biaoshifu); printf("OOpenGL实现的版本号:%s\n",OpenGLVersion ); printf("OGLU工具库版本:%s\n", gluVersion); Init (); //glutFullScreen ( ); //Put Into Full Screen glutDisplayFunc ( display ); //注册一个绘图函数 glutReshapeFunc ( nullptr ); //设置投影的函数 glutKeyboardFunc ( nullptr ); //键盘回调函数 glutSpecialFunc ( nullptr ); //设置当前窗口的特殊键盘回调。 glutIdleFunc ( nullptr ); //程序空闲时调用的函数 glutMainLoop ( ); // 进入GLUT事件处理循环 return 0; }
成功:
更多文章:http://blog.csdn.net/what951006
powered by:小乌龟在大乌龟背上~
相关文章推荐
- 无废话MVC入门教程二[第一个小Demo]
- kotlin入门系列-第一个kotlin的android demo
- openGL代码入门笔记[2]:绘制直线、圆以及椭圆
- OPENGL入门——第一个例子的讲解
- 兄弟连区块链入门教程分享区块链POW证明代码实现demo
- LeadTools Android 入门教学——运行第一个Android Demo
- iOS 3D Touch超详细入门(附带demo示例代码)
- OpenGL入门学习——第一课 编写第一个OpenGL程序
- OpenGL入门(二):第一个OpenGL程序
- iOS 3D Touch超详细入门(附带demo示例代码)
- 无废话MVC入门教程二[第一个小Demo]
- OpenGL入门(四):代码分析
- LeadTools Android 入门教学——运行第一个Android Demo
- 【笨木头Unity】入门之旅009:Demo之四处找死(四)_在代码里操作物体
- iOS 3D Touch超详细入门介绍(附带demo示例代码)
- Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
- ionic 入门创建第一个应用demo
- [转] VS2015中跑OpenGL红宝书第八版的第一章示例代码,运行
- Spring MVC用户注册配置入门教程及其代码实例demo下载
- TensorFlow入门:第一个机器学习Demo