Pipeline (The blue boxes are programmable shader stages.) The OpenGL rendering pipeline works in the following order: Prepare vertex array data, and then render it Vertex Processing: Each vertex is acted upon by a Vertex Shader. Each vertex in the stream is processed in turn into an output vertex. Optional primitive tessellation stages. Optional Geometry Shader primitive processing. The output is a sequence of primitives.

Continue reading

去年写过一篇文章,该文章与github上的最新代码已不再有效(主要是glm和glfw相关的CMake配置发生变动): https://dawnarc.com/2017/09/openglglsl-cookbook%E6%BA%90%E7%A0%81%E7%BC%96%E8%AF%91%E6%AD%A5%E9%AA%A4%E6%B5%81%E7%A8%8B/ 当前这篇文章针对github的glslcookbook最新代码,重新梳理一次配置流程,保证最新代码能编译工程并跑起来。步骤如下: 1,下载glm源码,并用cmake-gui生成VS工程文件: https://github.com/g-truc/glm/releases/download/0.9.9.0/glm-0.9.9.0.zip 假设 cmake-gui的source code设置为: D:/sdk/glm-0.9.9.0 cmake-gui的build binaries设置为: D:/sdk/glm-0.9.9.0/bin Configure过程中,会有警告,可以无视,直接Generate: GLM is a header only library, no need to build it. Set the option GLM_TEST_ENABLE with ON to build and run the test bench 生成完以后,不需要打开VS编译,后面直接使用相关文件即可。 2,下载glfw源码,并用cmake-gui生成VS工程文件。 https://github.com/glfw/glfw/releases/download/3.2.1/glfw-3.2.1.zip 假设 cmake-gui的source code设置为: D:/sdk/glfw-3.2.1 cmake-gui的build binaries设置为: D:/sdk/glfw-3.2.1/bin Configure过程中,会有红色警告,可以无视,直接Generate: CMake Deprecation Warning at CMakeLists.txt:10 (cmake_policy): The OLD behavior for policy CMP0042 will be removed from a future version of CMake. The cmake-policies(7) manual explains that the OLD behaviors of all policies are deprecated and that a policy should be set to OLD only under specific short-term circumstances.

Continue reading

错误1 error C2027: use of undefined type 'glm::tvec4<float,0>' 原因: 只包含了头文件:<glm/detail/type_vec.hpp> 解决办法: 不需要包含<glm/detail/type_vec.hpp>,只需要包含<glm/glm.hpp>。 就投机钻营来说,世故的价值永远是无可比拟的。---《死魂灵》

Continue reading

GLM默认使用右手坐标系,如果要改成默认左手坐标系,使用: GLM_FORCE_LEFT_HANDED <glm/trigonometric.hpp> GLM_FUNC_DECL GLM_CONSTEXPR vec< L, T, Q > radians (vec< L, T, Q > const &degrees) 将角度转化为弧度。 <glm/gtx/transform.hpp> GLM_FUNC_DECL mat< 4, 4, T, Q > rotate (T angle, vec< 3, T, Q > const &v) 使用一个用弧度(radians)表示的角度(degrees),以及一个用3个标量(scalar)表示的坐标(axis),来构建一个4X4的旋转矩阵(rotate matrix)。 <glm/gtc/matrix_transform.hpp> GLM_FUNC_DECL mat<4, 4, T, Q> lookAt (vec<3, T, Q> const &eye, vec<3, T, Q> const &center, vec<3, T, Q> const &up) 基于默认的偏手坐标系来构建一个给定视图矩阵(view matrix)的视角(look) GLM_FUNC_DECL mat<4, 4, T, defaultp> perspective (T fovy, T aspect, T near, T far) 为一个对称透视图截锥(symmetric perspective-view frustum)创建矩阵,基于默认的偏手坐标系和默认的近剪裁面距离、远剪裁面距离

Continue reading

这里以演示如何编译Vertex Shader为例,其他类型的Shader类似。 1,先用io流读取shader文件 std::stringstream code; code << inFile.rdbuf(); inFile.close(); string codeStr(code.str()); 2,创建空白Shader对象 GLuint vertShader = glCreateShader( GL_VERTEX_SHADER ); 3,编译Shader代码到Shader对象中 // Load the source code into the shader object const GLchar* codeArray[] = {codeStr.c_str()}; glShaderSource(vertShader, 1, codeArray, NULL); // Compile the shader glCompileShader( fragShader ); 4,Shader链接 4.1 创建program对象 // Create the program object GLuint programHandle = glCreateProgram(); 4.2 附加Shader对象到program对象中 // Attach the shaders to the program object glAttachShader( programHandle, vertShader ); glAttachShader( programHandle, fragShader ); 4.

Continue reading

以下文章内容是基于glslcookbook所在github上2017年8月份的提交版本,当前文章所述的配置glm和glfw的步骤与github上最新CMakeList.txt已不再适用!针对2018.06的github代码,我新增了文章《[OpenGL]GLSL Cookbook源码编译步骤流程(2018.06新版)》。如果是萌新,建议先把当前旧文章看完再看新文章。 这里讲解《OpenGL 4 Shading Language Cookbook, Second Edition》 这本书的示例代码如何编译。 编译步骤 1,下载glm的源码,并用cmake-gui生成出VisualStudio的工程文件。 https://github.com/g-truc/glm/releases 2,下载glfw。 https://github.com/glfw/glfw/releases 注意是下载bin文件不是src源码。(如果你想用src编译lib,则无视) 3,下载glslcookbook源码,这是《OpenGL 4 Shading Language Cookbook, Second Edition》的书籍源码,下载后同样用cmake-gui生成vs工程文件: https://github.com/daw42/glslcookbook 4,cmake-gui首次生成glshcookbook源码时会报错 这时需要指定GLM的依赖库位置,这个位置就是步骤1中的生成的GLM库的bin目录。注意这个bin目录不是GLM自带的,是通过cmake-gui指定生成的。 在指定GLM_INCLUDE_DIR之后,再点击Generate,又会出现新的错误,提示GLFW找不到,这时需要再指定GLFW的相关目录,即步骤2中下载的GLFW lib和头文件。 参数解释: CMAKE_BUILD_TYPE :默认,不做修改 CMAKE_CONFIGURATION_TYPES :默认,不做修改 CMAKE_INSTALL_PREFIX :不清楚,删掉也不影响 GLFW3_INCLUDE_DIR :GLFW的头文件目录 GLFW3_LIBRARY :GLFW的静态库目录 GLM_INCLUDE_DIR :GLM的头文件目录 最后生成成功的提示为: 打开VS工程,可以看到每一章的示例代码并可编译。(这里看不到.sln的图标是因为我电脑之前卸载了旧版本的vs,导致新版本vs的图标显示不正常,可以无视) 运行程序 每个章节的exe无法双击运行,需要命令输入相关参数。 以章节5为例,先CD到exe所在目录: cd /d D:\glslcookbook\bin\chapter05\Debug> 然后输入: chapter05.exe 则会提示: Recipe names: blur : Gaussian blur deferred : deferred rendering edge : edge detection filter gamma : gamma correction msaa : multisample anti-aliasing tone-map : tone mapping example.

Continue reading

转载请注明出处:https://dawnarc.com 网上资料很多都是基于Cygwin来搭建的环境,这里介绍一种非Cygwin搭建Windows上的OpenGL开发环境。 1,OpenGL Loader Generator下载安装 OpenGL Loader是一个标准规范,定义了如何在运行时期间加载OpenGL相关函数的指针。 这是windows上开发OpenGL程序才需要的lib,因为从1.1版本开始,windows不在对OpenGL 后续版本的 ABI(application binary interface)提供支持(可能是微软的DX出来后与OGL商业竞争吧),所以开发者无法直接获取OGL新版本的相关函数,不过有好心人写了工具,在运行时期间获取OGL的新版函数,这里介绍两个开源库: glad https://github.com/Dav1dde/glad glloadgen https://bitbucket.org/alfonse/glloadgen/wiki/Home 我是用的是glad,这个开源库的开发者还提供了在线生成工具,可以不用下载安装Load Generator,直接在线生成指定版本的OpenGL Loader: http://glad.dav1d.de/ 2,编译OpenGL Loader的静态库 通过glad生成的代码,编译一个lib, 以便后面的的示例工程调用。因为这些代码开发者不用做修改,只是调用,所以最好编译成lib,而不要直接加到自己的项目代码中。 3,下载GLM(OpenGL Mathematics) 这是OpenGL的数学库 https://github.com/g-truc/glm/releases 4,下载GLFW 这是一个提供了OpenGL, OpenGL ES和Vulkan相关接口的跨平台的开源库,有这个库你就可以访问他们的最新API。 https://github.com/glfw/glfw/releases 5,新建一个C++工程并设置OpenGL相关的头文件和静态库 指定头文件的目录 指定静态库的目录 在代码需要包含的头文件以及lib: #include <KHR/khrplatform.h> #include <glad/glad.h> #include <GLFW/glfw3.h> #pragma comment(lib, "opengl32.lib") #pragma comment(lib, "glad.lib") #pragma comment(lib, "glfw3.lib") 新建的测试工程叫GLTest,目录结构如下: 新加了两个分别叫include和lib的目录,用于存放第三方库的头文件和库文件 完整的测试的代码: #pragma once #include <iostream> #include <windows.h> #include <fstream> #include <sstream> #include <string> #include <KHR/khrplatform.

Continue reading

Keywords:debug、opengl、调试、message 4.3之前的版本,如果要打印debug信息,通常是调用glGetError()函数,从4.3开始,提供了注册回调函数来获取debug message。 示例: 1.Create a callback function to receive the debug messages. The function must conform to a specific prototype described in the OpenGL documentation. For this example, we’ll use the following one: void debugCallback(GLenum source, GLenum type, GLuint id,GLenum severity, GLsizei length,const GLchar * message, void * param) { // Convert GLenum parameters to strings printf("%s:%s[%s](%d): %s\n", sourceStr, typeStr, severityStr, id, message); } 2.Register our callback with OpenGL using glDebugMessageCallback:

Continue reading

Author's picture

Neil Wang

久长唯有品格

To Be Marvelous

Yichang·Hubei