OpenGL笔记
发布日期:2021-06-28 22:17:25 浏览次数:2 分类:技术文章

本文共 3183 字,大约阅读时间需要 10 分钟。

译序
早前学OpenGL的时候还是1.x版本,用的都是glVertex,glNorma等固定管线API。
openGL ES 2.0 版本开始不再支持固定管线,只支持可编程管线。
准备
1.The OpenGL Extension Wrangler(GLEW) 是用来访问OpenGL 3.2 API函数的。
 不能简单的使用gl.h来访问OpenGL接口,除非你相用旧版的OpenGL。
 在现代OpenGL中,API函数是在运行时(run time)确定的,而非编译期(compile time)
 GLEW可以在运行时加载OpenGL API。
 
2.GLFW 允许我们跨平台创建窗口,接受键盘鼠标消息。OpenGL不处理这些窗口创建和输入。
3.OpenGL Mathematics(GLM)是一个数学库,用来处理矢量和矩阵等几乎其他所有的东西。
 旧版OpenGL提供了glRotate glTranslate和glSale等函数。
 在现代OpenGL函数中 这些函数已经不存在了。我们需要自己处理所有的数学运算。
 Shaders
shaders是一段GLSL小程序,运行在GPU而非CPU。
他们使用OpenGL Shading Language(GLSL)语言编写。看上去像C/C++.
像其他编程语言一样,使用Shaders需要编译链接成可执行程序。
旧版OpenGL中Shaders是可选的,现代OpenGL中 Shaders是必须的。
Vertex Shaders
Vertex shader主要是将点(X Y Z)变换为不同的点。顶点只是几何形状中的一个点,一个点叫vertex
多个点叫vertices
Fragment Shaders 
fragment shader 的主要功能是计算每一个需要绘制的像素点的颜色。
一个fragment是一个像素 片段着色器(fragment shader)就是像素着色器(pixel shader)。
编译shaders
-------------------------------------------------------- 
 //create the shader object
 GLuint _object = glCreateShader(GL_VERTEX_SHADER);
 if(_object == 0)
        throw std::runtime_error("glCreateShader failed");
 //set the source code
 const char* code = shaderCode.c_str();
 glShaderSource(_object, 1, (const GLchar**)&code, NULL);
 //compile
 glCompileShader(_object);
 //throw exception if compile error occurred
    GLint status;
    glGetShaderiv(_object, GL_COMPILE_STATUS, &status);
    if (status == GL_FALSE) {
        std::string msg("Compile failure in shader:\n");
        
        GLint infoLogLength;
        glGetShaderiv(_object, GL_INFO_LOG_LENGTH, &infoLogLength);
        char* strInfoLog = new char[infoLogLength + 1];
        glGetShaderInfoLog(_object, infoLogLength, NULL, strInfoLog);
        msg += strInfoLog;
        delete[] strInfoLog;
        
        glDeleteShader(_object); _object = 0;
        throw std::runtime_error(msg);
    }
-----------------------------------------------------------------------
解析shadres
------------------------------------------------------------------------
//create the program object
   GLuint _object = glCreateProgram();
    if(_object == 0)
        throw std::runtime_error("glCreateProgram failed");
//attach all the shaders
    for(unsigned i = 0; i < shaders.size(); ++i)
        glAttachShader(_object, shaders[i].object());
 //link the shaders together
    glLinkProgram(_object);
 //detach all the shaders
    for(unsigned i = 0; i < shaders.size(); ++i)
        glDetachShader(_object, shaders[i].object());
//throw exception if linking failed
    GLint status;
    glGetProgramiv(_object, GL_LINK_STATUS, &status);
    if (status == GL_FALSE) {
        std::string msg("Program linking failure: ");
        
        GLint infoLogLength;
        glGetProgramiv(_object, GL_INFO_LOG_LENGTH, &infoLogLength);
        char* strInfoLog = new char[infoLogLength + 1];
        glGetProgramInfoLog(_object, infoLogLength, NULL, strInfoLog);
        msg += strInfoLog;
        delete[] strInfoLog;
        
        glDeleteProgram(_object); _object = 0;
        throw std::runtime_error(msg);
    }
----------------------------------------------------------------------------
参考:
http://huangwei.pro/2015-05/modern-opengl1/
https://www.opengl.org/sdk/docs/man/html/
http://www.cocoachina.com/game/20141127/10335.html
http://blog.csdn.net/candycat1992/article/details/39675513
http://fengmm521.blog.163.com/blog/static/2509135820133254936364/
http://blog.csdn.net/afei198409/article/details/8255518
http://blog.csdn.net/mzyang272/article/details/7655464

转载地址:https://blog.csdn.net/yhhwatl/article/details/50994969 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:OpenGL教程汇总
下一篇:一个iOS开发者的修真之路

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月09日 17时56分36秒